Делюсь опытом.Ключевые слова:
EFM32, EnergyMicro, ULINK, SWDCLK, Bootloader, debug, отладка.
Как видно из
форума, похоже мало кто на пространстве СНГ использует Cortex-Mx процессоры от EnergyMicro (ныне под Silabs). Форумчанам виднее, почему. Моя гипотеза: ввиду экспортных ограничений на эти процессоры, т.к. имеется встроенный модуль AES. Тем не менее, поделюсь нарытым опытом здесь.
Предыстория.Хотя я вожусь с процессором довольно давно (наверное, с того времени, как они только начали появляться), ввиду удачного стечения обстоятельств с нижеописаной проблемой до недавнего момента мне сталкиваться не приходилось, т.к. для отладки и программирования я использовал DK от EnergyMicro, поскольку на нем есть замечательный бесплатный J-LINK, который к тому же никак не "залочен" (русский технический новояз) на сами EFM процессоры. Это и было до сих пор решающим фактором, почему все шло гладко. И тут на днях обращается ко мне коллега из другой конторы и жалуется на то, что, применив камень в своей разработке, он не может отлаживаться: все виснет непонятно где.
Проблема.Начали разбираться, и накопали следующее.
С целью упрощения производства и последующей актуализации было решено не затирать встроенный загрузчик в первых 2K и разместить программу выше. При запуске под отладчиком прохождение зацикливалось где-то в загрузчике, не доходя до main() основной программы. Выясняем: вначале, как и описано, загрузчик анализирует состояние линии 0 порта F, что есть также сигнал SWDCLK. Если линия в "0", то происходит переход на пользовательскую программу, иначе - в ожидание команд по USART0. Возник вопрос, почему же я никогда с таким поведением не сталкивался? Ответ подсказал осциллограф: в то время, как мой onboard-JLINK выдает положительные импульсы по SWDCLK, то ULINK - отрицательные (по логике, не по полярности напряжения, конечно). Таким образом, под ULINK загрузчик ловит пассивное состояние SWDCLK как "1" и видит свой звездный час. onboard JLINK писался же SEGGER под неусыпным оком EnergyMicro, которая объяснила, как себя правильно вести.
Решение.Тем, кто затирал и будет затирать встроенный загрузчик, беспокоиться не о чем: они с вышеописаным поведением не столкнутся.
Кто же хочет сохранить загрузчик, но и отлаживаться по ULINK, следует модицифировать загрузчик (исходные тексты есть на сайте EnergyMicro) так, чтобы он в момент проверки состояния SWDCLK проверял дополнительно, не находится ли он под отладкой, и принимал соответствующее решение. Вариант модифицированного фрагмента из проекта загрузчика (файл bootloader.c, версия 1.64, строки от 168):
Код
/* Check if pins are not asserted AND firmware is valid */
// if ((SWDpins != 0x1) && (BOOT_checkFirmwareIsValid())) // old version making troubles under ULINK
if ((SWDpins != 0x1 || ((CoreDebug->DHCSR & CoreDebug_DHCSR_C_DEBUGEN_Msk) != 0x0))
&& (BOOT_checkFirmwareIsValid()))
Сообщение отредактировал KnightIgor - Sep 30 2013, 14:10