MementoMori 4 5 февраля, 2020 Опубликовано 5 февраля, 2020 · Жалоба 8 minutes ago, Forger said: Чтобы функции не вызывались, нужно избегать обращения к соот. области памяти. А что служит причиной того, что KEil избегает обращения к соответствующей области памяти? Я ничего с шаблоном не делал, кроме инициализации GPIO. Он нулевый. И, так сказать, настроенный производителем. При этом в правильности настройки мной GPIO я не сомневаюсь - в функции init ножка меняет свое состояние по команде. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 26 5 февраля, 2020 Опубликовано 5 февраля, 2020 · Жалоба 1 minute ago, MementoMori said: А что служит причиной того, что KEil избегает обращения к соответствующей области памяти? Очевидно - отсутствие этих объектов в указанных областях. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MementoMori 4 5 февраля, 2020 Опубликовано 5 февраля, 2020 · Жалоба 16 minutes ago, Forger said: т. е. линкером ничего там не размещать. Вот содержимое target.lin Вы об этом? ; Linker Control File (scatter-loading) ; PRG 0 PI ; Programming Functions { PrgCode +0 ; Code { * (+RO) } PrgData +0 ; Data { * (+RW,+ZI) } } DSCR +0 ; Device Description { DevDscr +0 { FlashDev.o } } Я полагаю, производитель в этом файле разместил все что нужно. По крайней мере, в мануале про доп. настройки такого рода ничего не написано. Функции-то стандартные, неужели производитель чего-то недоразместил? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 26 5 февраля, 2020 Опубликовано 5 февраля, 2020 · Жалоба Речь про ваш сам проект. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MementoMori 4 6 февраля, 2020 Опубликовано 6 февраля, 2020 · Жалоба В общем, чистка кода инициализации помогла функция стирания секторов стала вызываться, правда возвращает ошибку. Видимо, дебаггер очень капризен к нагромождениям кода HAL. В основной программе работа с qspi идет без проблем, тот же код, вставленный в шаблон дает ошибку на этапе включения разрешения записи. Еще более странным является то, что дебаггер отказывается работать с алгоритмом, если включаешь HSE. Так и должно быть? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
pvo125 0 6 февраля, 2020 Опубликовано 6 февраля, 2020 · Жалоба Не пробовал собрать мой проект и получить FLM. Отправлял в личных сообщениях? Там без HAL. Ошибку кейл не выдает при заливке. Правда на самом деле и не заливает Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MementoMori 4 6 февраля, 2020 Опубликовано 6 февраля, 2020 · Жалоба 33 minutes ago, pvo125 said: Не пробовал собрать мой проект и получить FLM. Отправлял в личных сообщениях? Там без HAL. Ошибку кейл не выдает при заливке. Правда на самом деле и не заливает Открывал я вашу прошивку - понятное дело она не заливает, так как функции заливки не прописаны. И понятно, почему ошибку не выдает - базовые функции возвращают 0. Попробую залить. Я вечером еще попробую поиграться с таймаутами, еще почищу HAL код, функция стирания сектора у меня вызывается. Но после мнимого их стирания почему то не вызывается ProgramPage. А дебаггер при этом пишет, что хочет залить прошивку, но указывает при этом адрес 0х8хххх. То ли он пропускает этот этап и пытается писать во внутреннюю флеш, то ли он хочет писать во внешнюю, но ошибается адресом. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
pvo125 0 6 февраля, 2020 Опубликовано 6 февраля, 2020 · Жалоба В проекте все функции записи страницы стирания сектора и инит прописаны. Они же в основной прошивке корректно работают. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MementoMori 4 6 февраля, 2020 Опубликовано 6 февраля, 2020 · Жалоба 13 minutes ago, pvo125 said: проекте все функции записи страницы стирания сектора и инит прописаны. Они же в основной прошивке корректно работают. Ах, да... я вас спутал с еще одним товарищем по несчастью с, которым списался на эту тему. Глянул Ваш код. Скажите, а вы увкрены, что все, что прописано в spiflash.c, в случае успеха возвращает 0, а при неудаче 1? А то ведь если наоборот, то алгоритм в случае ошибки будет думать, что все ОК. Насчет Вашего кода - он привлекательно прости, но вот я неуверен, что смогу настроить spi на те же ноги - у меня qspi, да еще и в нестандартной конфигурации, с ремаппингом. Вечером гляну. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
pvo125 0 6 февраля, 2020 Опубликовано 6 февраля, 2020 · Жалоба В том то и затык у меня. Эти же две функции запись страницы и очистки сектора хорошои срабатывают в самом проекте который используют эту же spi flash. Но вот в этом алгоритме для загрузки и стирания почему то не работают. Видимо нужно отлаживать сам проект алгоритиа. Делать какие то флаги и светодиода и моргать чтоб понять что вызывается и как. И да у меня сама флэшка qspi но используется старый контроллер который работает в режиме spu. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MementoMori 4 6 февраля, 2020 Опубликовано 6 февраля, 2020 · Жалоба 6 minutes ago, pvo125 said: Видимо нужно отлаживать сам проект алгоритиа. Не факт. Я писал уже выше - выдранный мной откуда-то код работы с qspi дважды вызывал hal_qspi_init. В основной программе контроллеру было пофиг, а вот в алгоритме это приводило к глюкам. Убрал строку - в основной программе ничего не произошло, а в алгоритме заработал вызов функций. То есть, с виду проблема в проекте, на деле же - с кодом. У меня еще страннность - стирание секторов работает только со второго раза всегда. То есть запускаешь прошивание первый раз - выдается ошибка, запускаешь второй раз - перебираются адреса. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MementoMori 4 6 февраля, 2020 Опубликовано 6 февраля, 2020 · Жалоба В общем, причина всех неудач найдена. У меня почему-то не работает sys_tick. В соответствующих функциях Hal_GetTick() возвращает ноль. В результате не отрабатываются таймауты при работе с qspi. В сети пишут про обработку прерывания systick_handler, но оно у меня даже не вызывается. Вопросами а включены ли прерывания, а каков приоритет, я даже не задаюсь - функция HAL_Init все это отрабатывает. В обычном проекте я вставляю эту функцию первой же строкой в main(), после чего все работает как часы. Отсчет времени не работает, даже если меняю systick на TIM6. Его прерывание также не вызывается. То есть проблема со всеми прерываниями. Скажите, а могут ли быть какие препятствия для прерываний, если код не обычный а является алгоритмом прошивки? Я вот помню, что когда как-то раз делал бутлодер, нужно было менять что-то в таблице векторов прерываний... здесь ничего такого не надо делать? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 39 7 февраля, 2020 Опубликовано 7 февраля, 2020 · Жалоба Ты вообще не понимаешь как процессор работает? Таблицу векторов прерываний сформировал? VTOR на неё натравил? Иначе откуда прерываниям взяться? Почитал я этот триллер... Даю бесценные советы: 1. Флэшьлоадер нужно делать как можно проще. 2. Никаких HSE и PLL. Для прошивки вполне достаточно работы от HSI. 3. В женский половой орган HAL. Смотри п.1 4. В ините из инициализации железа оставить конфигурацию GPIO и QSPI. На регистрах это с десяток команд, не больше. 5. Никаких прерываний. Если нужны задержки - покрути нопы в цикле. Это как раз то место, где это уместно. Ничем другим проц в это время не занят. 6. Смотри п.3. Никаких HAL-инитрв, SystemInit и прочей лабуды. Только реализовать функции, которые требует IDE для прошивки : инициализация, стереть сектор, записать сектор. Строго с теми параметрами на входе и на выходе, которые описаны в документации. Делов то на 15 минут написать, ещё 15 отладить. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 60 7 февраля, 2020 Опубликовано 7 февраля, 2020 · Жалоба И еще 15 минут - прочитать pdf и посмотреть пример. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MementoMori 4 7 февраля, 2020 Опубликовано 7 февраля, 2020 · Жалоба Спасибо за Ваши советы, обязательно учту их, но когда причина неработоспособности кода фактически локализована и остается ее только устранить - то хочется сделать именно это, а не переписывать заново код работы с qspi (который хорошо себя показал в обычном проекте). Что касается таблицы векторов прерывания - она конечно же есть в файле .s. А вот про ее перенос я как-то не подумал. Я любитель и делала это один раз, лет пять назад, когда писал бутлодер. У меня один вопрос - адрес таблицы векторов должен указывать в ОЗУ, начинающийся с 0х20000000? А куда конкретно и как понять, куда? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться