Serial Wire Output в Cortex-M3/M4

В микроконтроллерах с ядром Cortex-M3 появился новый интерфейс отладки - SWD (Serial Wire Debug). Вместо традиционных 4 сигнальных проводов (TDI, TMS, TCK, TDO)
он требует всего двух (SWDIO - двунаправленный сигнал данных и SWCLK - тактирование). Также может использоваться третий, необязательный вывод SWO, речь о котором пойдет ниже.

На мой взгляд заменить 4 провода на 2 не такой уж прогресс, учитывая, что скорость обмена по SWD однозначно ниже, чем через стандартный JTAG, да и Boundary Scan через него не сделаешь,
который в настоящее время, в связи с увеличившейся сложностью проектов используется все чаще.
Но, наверное SWD это модно. :)
Хотя, если его рассматривать как альтернативу громоздкому ETM (Embedded Trace Macrocell) тогда оправдать его существование можно.

Теперь, про упоминавшийся уже вывод SWO (Serial Wire Output). Это выход однопроводного (или как говорит ARM - однобитовый ETM) интерфейса по которому в UART или Манчестере передается информация.
Информация может быть разного рода - содержимое программного счетчика, счетчиков событий, содержимое переменных и перефирии timestamp (временная отметка) и количество циклов процессора.
Пользовательский код также может использовать данный интерфейс для передачи данных используя одну команду.


ITM: Instrumentation Trace Macrocell
Именно ITM позволяет пользовательскому коду получить доступ к SWO.

Define a pointer: #define ITM_Port32(n) (*((volatile unsigned long *)(0xE0000000+4*n)))

Write to the ITM port: 

int SendChar (int ch) {/* Запись в SWO*/ 
while (ITM_Port32(0) == 0); 
ITM_Port8(0) = ch; return (ch); 
}

swo


Теперь перейдем к эмуляторам. И 6 и 7 версии джетлинков поддерживают и SWD (отладка) и SWV (трассировка). Разница лишь в скорости SWV (трассировки). 6 версия позволяет это делать на скорости
до 500 кбит, а 7 версия до 6 мбит.

Теперь посмотрим как это выглядит в IAR. Начиная с версии 5.20 IAR стал поддерживать SWV.
Открываем проект на STM32.

pict1


Заходим в настройки проекта - Project - Option.
Теперь сюда - General Option - Library Configuration.
В Library low-level configuration выбираем Via SWO. Как только вы выбрали эти функцию интерефейс отладки переключится на режим SWD. В режиме JTAG данная функция недоступна 
(кстати вывод SWO совпадает с выводом TDO).



На вкладке Debugger выбираем J-link. И вообщем все. Закрываем окно настроек.

Теперь нажимаем Download and Debug.
Вы увидите процесс загрузки и записи в память программы.

В окне дебаггера запускаем J-Link - Trace Window.


В окне Trace нажимаем Edit Settings,

настраиваем и запускаем программу на выполнение.


Если теперь остановить выполнение программы, в окне трассировщика можно увидеть результат работы SWO.