Введение
В прошлой статье по STM32 я рассказал, как дебажить платы прототипирования STM32F103C8T6 и STM32F401CCU6 с помощью программатора-отладчика CJMCU-JLink (mini JLink). Основным недостатком этого отладчика является то, что через него не производится питание самой платы, которую приходится запитывать от независимого блока питания 5В. Стоит сейчас такой программатор не менее 700 рублей, что, тем не менее, все равно существенно дешевле официальных программаторов фирмы ST.
В этот раз я хочу вам рассказать, как производить отладку STM32 с помощью китайского программатора-отладчика nanoDAP, основанного на опенсорсном проекте DAPLink. nanoDAP не имеет проблем CJMCU-JLink, и через него спокойно можно питать плату.

nanoDAP также имеет две инкарнации: DAPLink (700 руб + доставка) и CMSIS-DAP (300 руб + доставка). Единственное их функциональное отличие заключается в том, что первый определяется как флешка, а второй - нет. При подключении к USB DAPLink определяется как внешний девайс, на который можно с помощью Drag&Drop кинуть прошивку, которая затем автоматически запишется в микроконтроллер. Формат прошивки зависит от микроконтроллера (.hex или .bin). Вообще говоря, такой способ записи становится весьма популярным. Подобным функционалом также обладают многие новые микроконтроллеры, например ESP32-S2, ESP32-S3 и RP2040. А если установить на эти платы circuitpython, то редактирование кода можно осуществлять непосредственно на флеш-накопителе в своей IDE, а при каждой перезаписи кода микроконтроллер автоматически перезагружается, и код начинает выполняться. Возможно, про одну из таких плат Raspberry Pi Pico на основе чипа RP2040 я расскажу в одной из следующих статей.
Обладая такими достоинствами как универсальность и невысокая цена DAPLink и CMSIS-DAP имеют и недостатки: по их использованию очень мало инструкций на английском и русском. Чтобы хоть что-то понять мне пришлось переводить статьи с китайского с помощью яндекс-браузера. Также DAPLink и CMSIS-DAP для отладки используют опенсорсную службу-дебаггер openOCD, которая запускается в виде сервера и во время отладки все время висит фоновым процессом. Само собой, чаще всего предполагается standalone-установка из бинарника или через терминал. Но мы в данном случае программируем STM32 в STM32CubeIDE. В последней уже есть openOCD, поэтому его устанавливать не нужно.
Подключение DAPLink
Итак, поскольку мне посчастливилось приобрести DAPLink, объяснять буду на его примере. Тем более, что Drag&Drop "из коробки" у меня не заработал. Подключается DAPLink к плате STM32 по SWD-интерфейсу (4 pin), являющемуся частью интерфейса JTAG (10 pin). Обратите внимание, что порядок выводов опять не совпадает, и в кабеле dupont 4x4 снова приходится менять провода местами.

По цвету проводов можно догадаться, что TCK/CK = SWSCK, а TMS/IO = SWDIO. STM32F103C8T6 и STM32F401CCU6 подключаются совершенно идентично.

Настройка DAPLink и openOCD в STM32CubeIDE
Далее я поясню суть происходящего. Нам необходимо настроить для обеих плат:
- External Tool Config (Server), то есть openOCD;
- Debug Configurations, то есть выбрать дебаггер для конкретного проекта (в STM32CubeIDE он у нас будет называться ST-LINK (openOCD)) и настроить порт для связи с сервером (3333);
- Launch Group, то есть попросту скрипты для обеих плат, которые запускают сначала сервер, а затем дебаггер.
Настройка External Tool Config - добавляем openOCD-сервер
Заходим в меню:
Run / External Tools / External Tools Configurations...

Далее правый клик по Program - New Configuration

Создаем две конфигурации запуска сервера openOCD: для STM32F103C8T6 и STM32F401CCU6.


Выбираем переменные как показано на следующих скриншотах:


К ${stm32cubeide_openocd_path} дописываем если у нас винда:
\openocd
Если у нас линукс, то дописываем
/openocd
У нас получилось:
// Location
${stm32cubeide_openocd_path}/openocd
// Working Directory
${stm32_openocd_script_root_path}
Дописываем Arguments:
// Для STM32F103C8T6
-f ./interface/cmsis-dap.cfg -f ./target/stm32f1x.cfg
// Для STM32F401CCU6
-f ./interface/cmsis-dap.cfg -f ./target/stm32f4x.cfg
На винде слэши замените на бэкслэши.
Далее, если нажать на "Show Command Line", мы увидим как выглядит скрипт, запускающий сервер openOCD. Ну, что сказать? Красивое.

Выбираем программатор и порт (Debug Configurations)
Заходим в Run / Debug Configurations...

Создаем для каждой из плат правой кнопкой новую конфигурацию на "STM32 Cortex-M C/C++ Application"

На вкладке "Debugger":
- Выбираем "Connect to remote GDB server Port number"
- Выбираем Debug Probe ST-LINK (OpenOCD)
- снимаем галку с "Misc - Enable live expressions


Создаем группу запуска (Launch Group)
Там же в Run / Debug Configurations...
Правой кнопкой выбираем кликаем на Launch Group и выбираем New Configuration

Сначала мы будем запускать сервер openOCD, поэтому выбираем одну из подготовленных конфигураций его запуска для соответствующей платы. Launch mode: Run, Post launch action: None, Adopt launch if already running: Yes (перезапускаем, если уже запущено).

Далее мы будем запускать сам процесс отладки, поэтому прописываем соответствующую подготовленную конфигурацию отладчика. Launch mode: Debug.

В итоге у нас созданы две группы запуска, которые должны выглядеть следующим образом:


Запуск процесса отладки
После проделанных операций, если мы нажмем на треугольник справа от зеленого значка "Play", то появятся прописанные нами группы запуска: DapLink_project103C8T6 и DapLink_project401.

При нажатии запускается сервер openOCD, а за ним процесс отладки, который можно увидеть на последнем скриншоте

Заключение
Таким образом я всем рекомендую использовать замечательные и очень дешевые программаторы-отладчики вместе со свободным ПО. Их возможности мало уступают фирменным программаторам, а во многом и превосходят их. Достаточно просто один раз внимательно сделать настройку STM32CubeIDE.
Использованные источники:
通过External Tools在STM32CubeIDE下使用DAP-LINK_lone5moon的博客-程序员宝宝
基于OpenOCD 的 STM32CubeIDE 开发烧录调试环境搭建 DAPLINK/STLINK
DAPLink-HS User Manual
CMSIS-DAP/DAPLink User Manual
Raspberry Pi Pico на МК RP2040: начало и первые шаги. Что есть поесть за $4