LPC

Трассировка SWO для LPC1768 в Keil через ULINK2 и JLink

В качестве подопытного берем плату от старого принтера Атол-FPrint-55 (AT028.01.01), поскольку осталось их в немеренном количестве после перехода на новые модели кассовых аппаратов. А контроллер там на минуточку Cortrex-M3.

Дело в том , что платы для разработки контроллеров LPC на алиэкспресс большая и дорогая редкость, по сравнению с STM32 и что-то в районе минимум 3000р. (как я к сожалению понял). А тут просто валяются по ногами платы на LPC 1758 выведенными USB, RS232 (кстати если кому нужны обращайтесь).

Программирование контроллера LPC1768 на плате принтера Атол 55

Найти контакты JTAG/SWD не составило труда, т.к. они выведены на плате в дырки с шагом 2,54мм под IDC 16 разъем.
Подключаем выводы прямо к ULINK2 JTAG/SWD 20 pins :

фотка 1

А вот наш JTag 16 SWD разъем на плате

фотка 2

Соответственно надо соединить только SWDIO , SWCLK , SWO , питание 3.3В, земля.

фотка 3

среда Keil5

Пытаемся настроить среду разработки Keil , что работала прошивка, отладка и трассировка SWO .
Не забываем подать штатно питание на плату AT028.01.01 .

Сразу получаем приятную новость - определяется SWD интерфейс программирования с ARM CoreSight SW-DP.

фотка 4

И также имеем интерфейс программирования JTAG с ARM CoreSight JTAG-DP. Но тут трассировки SWO не будет, так как JTAG эту технологию не поддержимвает.

фотка 5

Запускаем отладчик - отладка работает!

SWO

Начинается хождение по мукам с трассировкой через вывод SWO ядром Coresight нашего контроллера LPC 1768.
Все дело в определении частоты , на которой контроллер по SWO выдает данные, так как частота зависит от того как программист ее инициализировал в коде , то есть возможны разные варианты.

Трассировка SWO ядром Coresight через ULINK2

Сначала видим что трассировка не идет через ULINK2 ("Trace: Communication Error")

фотка 6

Трассировка SWO ядром Coresight через JLink - начинает что-то приниматься

Уже идет какая-то каша, но это лучше чем ничего и ошибок типа Trace: Communication Error нет.

фотка 7

Трассировка через утилиту SEGGER идет сразу нормально

Самое главное , что утилита J-Link SWO Viwer от Segger делает измерение скорости и определяет частоту SWO. Как под другому у LPC узнать частоту SWO для меня остается загадкой (в отличии от STM32).

фотка 8

Интересно , что частоту контроллера Segger определятет как 99980+-1 , т.е. нам надо выставлять 100MHz похоже, а не 12MHz (как написано на кварце рядом с мк). Как он определяет частоту SWO - это тоже загадка, по-видимому методом подбора.

И вот пошли точки точно так как и должно быть ( с задержкой примерно 1 сек)

фотка 9

Респект Segger-у ! (и очень внимательно теперь мониторим его сайт, Embedded Studio - среда разработки например).

И теперь мы знаем, как настраивать частоту отладки SWO в Keil

Теперь понятно где у нас было неправильное значение указано - это на закладке Trace в поле Core Clock (почему-то мы решили ,что там должна быть частота внешнего кварца). И далее галочка Autodetect max SWO Clock уже даст примерно похожее на 6MHz значение.

И вот последний этап - трассировка , пошла нормально в Keil-е под JLink-ом. Ура товарищи!

фотка 10

Естественно также трассировка пошла в Keil-е под ULINK2, после указания правильной частоты.

фотка 11

Но ST-Link кстати не дает даже прошить LPC1768 и выдает Error: Flash Download failed - "Cortex-M3", так как ST-Link это производитель микроконтроллеров STM , а LPC это производитель NXP (прямые конкуренты).

Выводы:

Много времени убито на поиски ответа почему не идет трассировка по SWO. Но теперь мы знаем один незаменимый инструмент - утилита от компании Segger , которая позволяет определить частоту трассировки SWO JLink SWO Viewer.

И вот теперь программируй и отлаживай сколько угодно товарищ...

Постсриптум: остался один основополагающий минус - среда Keil - платная . Бесплатный лимит 30кб - это ни о чем.
Так вот в 2020г. мы наткнулись довольно таки случайно на официальную среду разработки от NXP , называется MCUXpresso (она у нас на сайте описана довольно подробно), где можно разрабатывать контроллеры LPC - БЕСПЛАТНО!

Век живи - век учись.