Приветствую!
С прошивкой и дебагом по SWD никаких проблем, теперь пытаюсь заставить работать бутлоадер
k1921vkx_flasher (UART загрузчик для микроконтроллеров К1921Вх) и происходит сплошная разноплановая рандомная шляпа:
- Объёмное описание всякой дичи | Показать
-
CFGWORD
При первом подключении правильное значение CFGWORD всегда считывает только начиная со второго раза (изначально 0xFF - все биты установлены, а потом уже реальное 0xEF - галочка с BMODEDIS пропадает). При записи CFGWORD всегда: "Устройство вернуло сообщение об ошибке!", но при этом его записывает, т.к. потом считывает изменённые значения (но опять же верные значения считываются только после второго чтения).
Чтение памяти
Чтение одной страницы памяти бывает срабатывает, бывает ошибка "[ERR] Ошибка CRC в команде от хоста!", либо застопаривается в "[INFO] Ожидание выполнения команд ...". Больше страниц практически всегда/всегда с ошибками. Когда успешно читает, что из основной памяти, что из NVR, результат начинается с лишнего слова 0xefffffffffffffff (это именно артефакт чтения, лишнего нет на флешке, проверял через SWD). А ещё были моменты, когда читало из NVR, хотя была выбрана область памяти "основная".
Т.к. это уж очень похоже на значение CFGWORD, убрал его чтение flash_read(FLASH_NVR_CFGWORD_OFFSET, FLASH_NVR, data); из read_page_cmd() в boot_core.c и это помогло, лишнее слово исчезло. А ещё это починило чтение CFGWORD в get_cfgword_cmd(), хотя казалось бы несвязанные функции. Но остальные проблемы никуда не делись.
Запись памяти
Аналогично с выдачей ошибок, результат - какие-то страницы записываются, какие-то нет, какие-то битые.
Изначально k1921vkx_flasher как есть, всё из коробки, только лишь проектом сделал для Vector IDE и убрал логику работы через NMI, без выхода из загрузчика (инициализации PeriphInit(); boot_init(); и запуск boot_core(); сразу в main без условий). Флаги сборки и линковки перепроверил и согласовал с gcc_cm4f.cmake.
И даже чтобы прям максимально исключить случаи какой-то неправильной сборки - прошивал готовую собранную прошивку от DC Vostok - результат такой же.
Что либо дебажить сложно, т.к. при точках отладки в определённых местах вылетает в hardfault. Но когда получилось, всё именно так и есть в переменных на МК, это не какие-то ошибки кода.
Безрезультатно пробовал:
- Убирать кэш
- Устанавливать разные waitstate для флешки (MFLASH_CTRL_LAT)
Отдельная боль при этой дичи само GUI приложение k1921vx_flasher.py, вылетающее, например, если МК не был подключён или требующее перезагрузки, если не произошло ответа от МК и застопорилось в ожидании ответа. Не шибко приятно, но так-то спасибо, что хоть есть что-то готовое.
Пока со всем этим возился и пытался понять, что вообще происходит, возникла мысль, а не может ли быть это связано как-то с оптимизацией, потому что когда-то давно имел схожее рандомное поведение с STM'кой.
Начал постепенно уменьшать оптимизацию и заметил, что на -O1 стало меньше ошибок и чаще успешно. К сожалению с уменьшением оптимизаций бутлоадер уже не вмещается в NVR, поэтому стал прошивать в основную Flash для проверок и о чудо без оптимизаций (-O0) - всё наконец заработало как надо, читает без артефактов и ошибок всю память, стирает и записывает и всё это многократно. При этом хоть с какой-то оптимизацией - появляются ошибки или общего характера (Устройство вернуло сообщение об ошибке) или CRС (то от девайса, то от хоста) сразу или через пару чтений, при этом то одну ошибку может выдать, то другую, то третью.
Как и писал в спойлере пробовал прошивать и готовую прошивку бутлоадера от
DC Vostok, чтобы исключить свою сборку - с ней всё та же фигня, что и с собранной мной с -Os.
- Ещё одна дичь | Показать
-
Кстати, такие же ошибки рано или поздно появляются, если не подключать пин RST МК к DTR USB-TTY, а резетить вручную. Хотя кажется одно и тоже и программа резетит только лишь при подключении/отключении, но вот почему-то есть разница в поведении.
Кто-то использовал flasher, всё работало как надо? Может поделится кто скомпилированной рабочей прошивкой, проверил бы на моём МК.
Может поможет кто какими мыслями по этому вопросу. Заранее спасибо!