Swo stm32 что это
Перейти к содержимому

Swo stm32 что это

  • автор:

Отладка по SWD STM32.

У STM32 есть очень удобный интерфейс для отладки и прошивки МК — Serial Wire Debug, сокращено SWD. Его удобство заключается в том, что для отладки надо подключить всего два информационных вывода и два вывода питания. Схема подключения выглядит следующим образом.

Отладка по SWD STM32.

После того как выводы подключены, надо разрешить отладку по SWD в среде программирования, в KEIL это делается так.

Отладка по SWD STM32.

Также у SWD есть вывод SWO, его подключать необязательно, но если его подключить(подтянув к питанию через 10K), то можно будет выводить сообщения в режиме реального времени. То есть в процессе исполнения кода, МК может слать нам отладочную информацию, например, какой участок кода сейчас выполняется, получается что-то типа usart c терминалом.
Разрешить отправлять отладочную информация по выводу SWO можно во вкладке trace: разрешив трассировку, указав частоту на которой работает МК и порт.

Отладка по SWD STM32.

Ниже пример, который позволяет выводить сообщения с помощью SWO, в специальное окошко, само окошко можно открыть так: view->Serial windows->debug (printf) viewer.

 #include "stm32f10x.h" #include #define ITM_Port8(n) (*((volatile unsigned char *)(0xE0000000+4*n))) #define ITM_Port16(n) (*((volatile unsigned short*)(0xE0000000+4*n))) #define ITM_Port32(n) (*((volatile unsigned long *)(0xE0000000+4*n))) #define DEMCR (*((volatile unsigned long *)(0xE000EDFC))) #define TRCENA 0x01000000 struct __FILE { int handle; /* Add whatever you need here */ >; FILE __stdout; FILE __stdin; int fputc(int ch, FILE *f) { if (DEMCR & TRCENA) { while (ITM_Port32(0) == 0); ITM_Port8(0) = ch; > return(ch); > int main(void) { while(1) { printf("Hello from stm32 printf!\r\n"); > > 

Вот как это выглядит, картинку можно увеличить кликнув по ней.

Отладка по SWD STM32.

Ну и главное, для чего задумывалась эта статья, в качестве отладчика использую китайский jlink, распиновка его коннектора стандартная и её легко можно найти в интернете, но это не мешает мне постоянно забывать какие выводы куда подключать, поэтому оставлю здесь фотку, какие пины на коннекторе jlik предназначены для SWD.

Средства отладки

В микроконтроллерах с ядром 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) 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.

настройки трассировки в STM32CubeMX и Keil 5 через ST- Link V2 Jtag

С настройкой в Keil5 — довольно просто. Выбираешь нужный контроллер в списке и жмешь Install.

Или после генерации кода в STM32CubeMx сразу жмем «открыть проект» и если при генерации было указана среда MDK5 , то сразу взлетает Keil5 с вашим проектом. Все файлы уже внутри и компиляция практически проходит сразу без ошибок (т.е. как-бы все файлы разложены по каталогам и добавлены в проект корректно).

Ограничение триальной версии 32Кб кода. Но в отличии от STM Work Bench (AC6) сразу все нормально прошивается и отлаживается на ST-Link v2.

ST-Link v2 с алиэкспресс прекрасно позволяет прошивать и отлаживать по SWD программу для STM32F1403C8T6. Завелось почти сразу и отладка без срывов идет нормально (например отлаживаем USB Custom HID). Вывод SWO у ST-Link v2 штатно не выведен с ножки 31 процессора программатора.

    Вот,что выдает ST-Link Utility (у меня) при связи:
  • 13:42:46 : ST-LINK SN : 48FF6D066783505327122167
  • 13:42:46 : ST-LINK Firmware version : V2J28S7
  • 13:42:46 : Connected via SWD.
  • 13:42:46 : SWD Frequency = 4,0 MHz.
  • 13:42:46 : Connection mode : Normal.
  • 13:42:46 : Debug in Low Power mode enabled.
  • 13:42:46 : Device ID:0x410
  • 13:42:46 : Device flash Size : 64KBytes
  • 13:42:46 : Device family :STM32F10xx Medium-density

Для прошивки в Keil не надо джамперы выставлять (оба в положении 0).
Настройки программатора и отладчика по картинкам ниже (взято с работающего примера). По умолчанию не настроено , а надо-бы настроить «очищать весь чип перед прошивкой» и «делать его рестарт после прошивки».

фотка 1

фотка 2

На самом деле непонятно — на что влияет XTal=72Mh (см. закладка Target) , как я понял это STM32CubeMx установил). Я бы сказал , что XTal лучше не трогать.

Итак режим (Mode) и Reset Mode настраивается именно в ST-Link V2 (через Stm32-Link Utility). В Keil надо соответственно этому указать настройки. Например Normal Software System Reset.

фотка 3

Понятно, что ST-Link Debugger тут надо выбрать первый раз руками.

фотка 4

И вот тут важно. Мы сразу видим область «Debug Adapter» , в ней определился наш ST-Link V2 и в области SW Device может ничего не быть,а может и определиться
device. Это вводит в заблуждение, так как на самом деле возможность отладки определяется на этапе в Stm32CubeMx, надо установить serial wire, и только тогда отладка станет возможной:

фотка 5

    Важно понимать , что мы прошиваем ( джампер boot1 тот , что ближе к краю):
  • boot1 = 1, boot0 = 0 — указывает, как я понял , что прошиваем именно загрузчик.
  • boot1 = 0, boot0 = 0 — прошиваем программу.

boot1 = 1, boot0 = 0 выставляем только в Stm32-Link Utility для прошивки оригинального загрузчика!

В области Debug (Connect & Reset Option) надо руками выбрать то , что настроили в ST-Link V2. Хотя как это влияет я не понял. Работает прошивка/отладка и при Normal и underReset и with Pre-reset (даже перезагружался все-равно все работает при любом варианте).

Через Stm32-Link Utility я устанавливаю так: Connect Under Reset Hardware Reset и (при boot1 = 0, boot0 = 0 конечно же) программа прекрасно прошивается и отлаживается.

фотка 6

фотка 7

На закладке Trace не будем использовать функции отладки (передача по SWO линии например всех отладочных сообщений). т.к.SWO в нашем китайском ST-Link V2 нет (точнее вывод 31 STM32F103CBT6 в ST-Link V2 не выведен наружу).

фотка 8

Ну на последней закладке Flash Download полезно выставить Erase Full Chip и Reset and Run.

Можно ли одновременно работать по USB с STM32F103C8T6 и отлаживать в Keil? Теперь уверенно можно сказать — Да! Главное еще помнить , что когда вы останавливаетесь в отладчике ваш ПК не будет ждать пока вы там подумаете — все решают миллисекунды. Т.е. разово поймать остановку можно , но потом выполнение программы возможно пойдет не по правильному сценарию.

Доработка китайского ST-Link v2: добавляем интерфейс вывода отладочной информации SWO и ногу Reset

image

Привет, Geektimes!

Сегодня хочу рассказать про доработку паяльником китайского ST-Link v2. В него можно допаять вывод SWO для получения отладочной информации и ногу управления Reset’ом для микроконтроллеров STM32 (та нога Reset, что уже есть — для STM8). Возможно для многих это не открытие, но пусть будет информация для начинающих. Кому интересно, прошу под кат.

Зачем оно надо?

Используемый для отладки микроконтроллеров STM32 интерфейс SWD поддерживает передачу отладочной информации через вывод SWO в режиме реального времени, это весьма удобно. Ну а нога Reset нужна для того, чтобы можно было комфортней прошивать контроллер в случае, если интерфейс SWD отключен. Причина конечно притянута за уши, ведь для прошивки всегда можно нажать кнопку Reset ручками, но пусть будет. Например, на заре моего знакомства с STM32, мне пришла отладочная плата с Китая с залитой демо программой моргания светодиодом и отключенным SWD, я не сразу понял, как к ней подключиться.

Сама доработка

Нам понадобится скальпель, паяльник и несколько сантиметров очень тонкого провода, у меня это МГТФ *какой-то там*. На этих программаторах разъем поделен на две части: левую — для STM8 и правую — для STM32, так что существующий там Reset не подходит для STM32, будем делать свой.

Первым делом отрезаем дорожки, идущие к ненужным штырькам. На первом своем доработанном программаторе я отрезал ножки Reset и SWIM, т.к не планировал работать с STM8, но сейчас я буду использовать лишние выводы 3.3 и 5 В (они задублированы на разъеме), чтобы не портить функционал программатора, вдруг пригодится.

Провода необходимо припаять к 18 (Reset) и 31 (SWO) ногам микроконтроллера. То еще занятие, но при определенной сноровке сделать это можно. У меня провода хорошо вошли в отверстия на плате, что дало дополнительную фиксацию. Вообще, по-хорошему, надо сразу закрепить их клеем на микроконтроллере. Свободные концы припаиваем через небольшие резисторы (пусть будут 22 Ома) к только что отрезанным штырькам.

Можно закрыть корпус и подписать новые выводы, чтобы потом не забыть где какой.

Проверка SWO

Для использования SWO необходимо:

— активировать SWD;
— включить соответствующий вывод (для микроконтроллеров STM32F103C это PB3) на TRACESWO;
— убедиться, что в среде программирования включен именно SWO, а не semihosting;
— в шапке программы подключить библиотеку #include «stdio.h»;
— в коде программы использовать printf(«Hello STM32 world!\r\n»);

Просматривать эти сообщения можно через терминал в программе STM32 ST-LINK Utility, либо прямо во время отладки в своей среде (я использую IAR).

Проверка Reset

Допустим по какой-то причине на микроконтроллере отключен SWD: либо вы забыли его включить при инициализации, либо пришла новая плата с зашитой демо-программой. Прошиться конечно можно через притягивание ножки Reset к земле (на отладочных платах обычно стоит кнопка), но это не всегда удобно. Можно ведь просто подключить контакт от программатора и шиться в автоматическом режиме.

В той же программе STM32 ST-LINK Utility выбираем «Connect under reset» и подключаемся для прошивки или очистки памяти микроконтроллера.

Либо в вашей IDE выбираем соответствующий пункт:

Это позволит прошиться и войти в отладочный режим, но как только вы дойдете до инициализации периферии, SWD отключится и связь с контроллером пропадет.

Спасибо за внимание, надеюсь кому-то это пригодится.

  • DIY или Сделай сам
  • Лайфхаки для гиков
  • Электроника для начинающих

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *