swo stm32 что это

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

Привет, 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 необходимо:

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

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

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

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

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

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

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

Источник

EmBlocks Вывод текста через SWO(SWD)

Автор ToRcH2565,
5 декабря, 2017 в STM32

Рекомендуемые сообщения

Присоединяйтесь к обсуждению

Вы публикуете как гость. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Последние посетители 0 пользователей онлайн

Сообщения

Похожий контент

Приветствую уважаемые дамы и господа!
Занимаюсь разработкой носимого устройства с целью исследования технологий LoRaWAN и BLE 5.0. А также поработать с энергоэффективными режимами работы МК STM32L4-серии.
Исходные данные:

Читайте также:  какие торты нельзя замораживать

Суть моего вопроса:
Если присутствует напряжение VBUS (USB), то необходимо выключать преобразователь D5 сигналом LM3671_BAT, но включать D4 сигналом LM3671_USB.
Таким образом получается, что аккумулятор будет заряжаться, а питаться прибор будет от USB.

Мои предположения, рассуждения и решения которые я вижу:
Если управлять преобразователями при помощи GPIO портов МК, то получится, что как только питание по USB отключится, то прибор выключится быстрее, чем успеет включиться преобразователь работающий от VBAT, ввиду чего я такое решение и отмёл. Использовать небольшую схемку на двух полевых транзисторах в одном корпусе (p и n типа). В симуляторе вроде как всё работает, но вероятно может произойти та же ситуация, что и в случае 1;

Использовать микросхему выполняющую данную задачу, но тут играет роль, что достать её сложно, стоит 7$ и выглядит как overkill для такой простой задачи. Покидайтесь, пожалуйста, камнями и критикой решений, своими вариантами решения задачи или же исправлениями к приложенным схемам.
————————————————————————————————————————————————————————————-
Если вдруг кого-то заинтересует,
то вот ссылка на GitHub проекта,
а так же ссылка на GitHub библиотеки.
Используются шрифты T-Flex GOST, можно получить по ссылке.

Есть проект для микроконтроллера для аналогичного устройства. Там используется STM32L475RET6.
Для связи с Ethernet используется так же ENC424J600-I/P.
Устройство успешно звонить по SIP на сервер. Выполняет приходящие MQTT-команды по открыванию дверей.
Требуется:
поправить ПО под STM32F413VGT6,
добавить WEB-интерфейс,
добавить возможность удаленного обновления ПО через WEB-интерфейс,
добавить возможность перезагрузки устройства через WEB-интерфейс,
добавить возможность хранения данных абонентов во FLASH микроконтроллера и возможность синрохизации этих данных с сервером,
добавить STUN,
исправить метод определения квартиры в которую звонят.
Есть ТЗ на ПО.

Источник

STM32 отладка через SWV в TrueSTUDIO

Хочу рассказать как использовать отладку через консоль SWV в среде Atollic TrueSTUDIO. Меня заинтересовала эта тема тем, что мне стали необходимы продвинутые способы отладки для STM32 в реальном времени и, как всегда это случается, я наступил на некоторые грабли. Об этом можно прочитать на форуме.

Начну сразу с настроек, а потом и за теорию немного поясню.

Для начала необходимо настроить конфигурацию Debug отладчика и настроить SWV при запущенной отладке. Отладчик настраивается в режим SWD, это важно, т.к. при JTAG просто ничего не будет работать. Остальные настройки очевидны, Core Clock это частота тактирования SYSCLK микроконтроллера.

Для входа в окно настроек необходимо нажать кнопку «Configure Trace» SWV консоли. Устанавливаем чекбокс порта 0, другие пока не трогаем, в них нет необходимости.

Далее, в тексте программы уже можно использовать вывод сообщений посредством функции printf. Данная функция использует потоковый вывод данных посредством системного вызова _write. Т.е. достаточно переопределить вызов и все должно заработать, что и было сделано в файле syscalls.c:

Пример вывода простого отладочного сообщения в консоль SWV:

Рядом с кнопкой «Configure Trace» SWV консоли находится кнопка «Start Trace» в виде красного кружка, нажимается во время первой точки останова программы. И после запуска программы в консоли можно увидеть наше сообщение:

Самые внимательные заметили в реализации _write вызов функции ITM_SendChar ( *ptr++ ). ITM или Instrumentation Trace Macrocell позволяет приложению писать произвольные данные через SWO пин отладчика, используя 32 параллельных канала. Данные передаются от ядра Cortex M через кабель отладчика прямо в компьютер, где современные средства отладки, коим и является TrueSTUDIO, легко могут визуализировать эти данные.

Ядро позволяет использовать ITM для различных применений, но самое простое это как раз отладочный вывод через функцию printf. По умолчанию резервируется канал 0 (его то мы и настраивали чуть выше), а остальные 31 свободны для других применений.

Читайте также:  какие симптомы при железодефицитной анемии

Применений много, по мере изучения постараюсь делиться в блоге материалом (но это не точно). А пока вы можете подписаться на мой канал в telegram, где я публикую анонсы статей и другую информацию для разработчиков.

Источник

Перенаправляем printf() из STM32 в консоль Qt Creator

Нередко при отладке ПО микроконтроллера возникает необходимость вывода отладочных сообщений, логов, захваченных данных и прочего на экран ПК. При этом хочется, чтобы и вывод был побыстрее, и чтобы строки отображались не где-нибудь, а прямо в IDE — не отходя от кода, так сказать. Собственно, об этом и статья — как я пытался printf() выводить и отображать внутри любимой, но не очень микроконтроллерной, среды Qt Creator.

В целом, можно придумать огромное количество способов вывода текстовой информации из микроконтроллера. Однако, наиболее часто применяющихся техник не так уж и много:

Semihosting — довольно медленный, RTT — завязан на программно-аппаратные решения Segger*, USB — есть не в каждом микроконтроллере. Поэтому обычно, я отдаю предпочтение последним двум — использование UART и ITM. О них и пойдёт ниже речь.

* Upd. — на самом деле, как подсказывают в комментариях, это не так. Есть варианты как на стороне софта так и железа. Поэтому, из перечисленных способов RTT будет, пожалуй, самым универсальным.

И сразу некоторое пояснение по тому софту, что будет использоваться далее. В качестве ОС сейчас у меня Fedora 28, а текущей связкой ПО для работы с микроконтроллерами являются:

Перенаправление printf() в GCC

Итак, чтобы в GCC перенаправить вывод printf() необходимо добавить в ключи линкера

Если будет необходим вывод чисел с плавающей запятой, то нужно не забыть ключ

И реализовать функцию _write(). Например, примерно так

где retarget_put_char() — это функция, которая будет загружать символ непосредственно в нужный интерфейс.

Instrumentation Trace Macrocell (ITM) — это блок внутри ядра Cortex-M3/M4/M7, используемый для неинвазивного вывода (трассировки) различного вида диагностической информации. Для реализации printf() об ITM необходимо знать следующее:

Наиболее удобным способом использования ITM является вывод через SWO с иcпользованием NRZ кодирования — таким образом, нужна всего одна линия, и принимать данные можно будет не только с помощью отладчика со специальным входом, но и обычным USB-UART переходником, пусть и с меньшей скоростью.

Я пошел по пути с использованием отладчика, и был вынужден доработать свой китайский STLink-V2, чтобы он стал поддерживать SWO. Далее всё просто — подключаем JTDO/TRACESWO микроконтроллера к соответствующему пину отладчика, и идём настраивать софт.

В openocd есть команда «tpiu config» — с помощью неё можно настроить способ вывода трассировочной информации (более подробно в OpenOCD User’s Guide). Так например, использование аргументов

настроит вывод в файл /home/esynr3z/itm.fifo, использование NRZ кодирования, и рассчитает максимальную скорость передачи, исходя из частоты TRACECLKIN 168 МГц — для STLink это 2МГц. А ещё одна команда

включит нулевой порт для передачи данных.

В состав исходников OpenOCD входит утилита itmdump (contrib/itmdump.c) — с помощью неё можно осуществить парсинг строк из полученных данных.

Чтобы скомпилировать вводим

И последнее. Чтобы отправить символ по SWO, дополняем _write(), описанный выше, функцией

Итак, общий план такой: внутри Qt Creator конфигурируем openocd на сохранение всей получаемой информации по SWO в предварительно созданный named pipe, а чтение pipe, парсинг строк и вывод на экран выполняем с помощью itmdump, запущенной как External Tool. Безусловно, существует и более элегантный способ решения поставленной задачи — написать соответствующий плагин для Qt Creator. Однако, надеюсь, что и описанный ниже подход окажется кому-нибудь полезным.

Читайте также:  какие секреты хранит ватикан

Заходим в настройки плагина Bare Metal (Tools->Options->Devices->Bare Metal).

Выбираем используемый GDB-сервер и добавляем в конец списка команд инициализации строки

Теперь, непосредственно перед тем как отладчик поставит курсор в самое начало main() будет происходить настройка ITM.

Добавляем itmdump в качестве External Tool (Tools->External->Configure. ).

Не забываем установить переменную

для отображения вывода утилиты в консоль Qt Creator (панель 7 General Messages).

Теперь включаем itmdump, активируем режим дебага, запускаем исполнение кода и… ничего не происходит. Однако, если прервать отладку, исполнение itmdump завершится, и на вкладке General Messages появятся все выведенные через printf() строки.

Путём недолгих изысканий было установлено, что строки из itmdump необходимо буферизировать и выводить в stderr — тогда они появляются в консоли интерактивно, во время отладки программы. Модифицированную версию itmdump я залил на GitHub.

Это несколько неприятно, особенно, если в какой-то момент ITM не будет нужен, но придется вхолостую запускать itmdump, либо постоянно переключать GDB-сервер или удалять/добавлять строки в его настройках. Поэтому пришлось немного поковырять исходники openocd и найти то место, куда нужно подставить небольшой костыль.

В файле src/target/armv7m_trace.c есть строка с искомой процедурой открытия

её нужно заменить на

Теперь наш pipe будет открываться сразу и не отсвечивать. А значит можно оставить настройки Bare Metal в покое, а itmdump запускать только когда это нужно.

В итоге, вывод сообщений во время отладки выглядит так

В этом случае всё примерно так же:

Я набросал такую утилиту на C — uartdump. Использование довольно простое — нужно указать лишь имя порта и баудрейт.

Однако, стоит отметить одну особенность. Работа этой утилиты не зависит от отладки, а Qt Creator не предлагает никаких опций для закрытия запущенных External Tools. Поэтому, для прекращения чтения COM-порта я добавил ещё один внешний инструмент.

Ну и на всякий случай приложу ссылку на шаблон CMake проекта, который фигурировал на скринах — GitHub.

Источник

Вывод отладочной информации SWO в среде IAR и KEIL

Микроконтроллеры STM32 имеют возможность вывода отладочной информации через специализированный вывод Serial Wire Output (SWO) программного интерфейса SWD, что не требует применения дополнительных разъемов на плате и позволяет осуществить однонаправленную передачу данных от микроконтроллера к программе отладчика.

Для применения SWO в среде IAR Embedded Workbench необходимо вначале программы добавить заголовочный файл командой #include и выполнить следующие действия:

6. Выбрать в меню – View/Terminal I/O

Вывод сообщений SWO можно выполнить и в среде Keil µVision, для этого потребуется выполнение следующих действий:

1.Перед функцией main необходимо разместить код

#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

int fputc(int ch, FILE *f) <
if (DEMCR & TRCENA) <

3. Настроить программатор-отладчик в соответствии с настройками

3. Запустить процесс отладки – Start/stop Debag Session

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

Следует отметить, что вывод информации SWO имеет аппаратную поддержку ядра Cortex-M3/M4, что требует минимальных затрат ресурсов и может быть наиболее востребовано при получении данных от микроконтроллера, работающего в условиях крайне низкого энергопотребления. Практически, при написании статьи, данная возможность была опробована на серии STM32Lxx.

Дополнительную информацию о микроконтроллерах STM32 можно получить на сайте компании STMicroelectronics.

Получить более подробную информацию по продукции STMicroelectronics вы можете, обратившись:

E-mail: Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в вашем браузере должен быть включен Javascript.

Источник

Информ портал о технике и не только