Зачем?
В эпоху Arduino UNO и Atmega328 я вполне обходился без программатора, прошивая микроконтроллер сначала загрузчиком Arduino через другую Arduino (Arduino as ISP), а потом через обычный последовательный порт, и лишь после появления поддержки Arduino для модулей на основе Nordic Semiconductor nrf51822 и nrf52832 для меня впервые стало актуальным наличие swd-программатора, ибо никаким другим способом прошивку в голый китайский модуль не зальешь.
Стандартом де-факто в данной области являются программаторы Jlink немецкой компании Segger Microcontroller System, известные не только своими прекрасными ТТХ, но и заоблачной ценой (около $500-600). Надо отдать должное компании Segger, для некоммерческого использования выпускается EDU версия, полностью идентичная Jlink Base, но даже она стоит в России в районе 3000 руб. Любимый Aliexpress полон китайских клонов, однако и они относительно недешевы, не говоря уж о прочем.
Есть еще ST-LINK/V2 от ST Microelectronics, правда, под вопросом их совместимость с микроконтроллерами производства не самой STMicro.
В итоге, мой взгляд неминуемо пал на JTAG/SWD программатор Black Magic Probe (BMP), собравший на Kickstarter более $47,000 при заявленной цели в $10,000.
Black Magic Probe (BMP)
- Open-source программатор; работающий по интерфейсу JTAG или SWD и обеспечивающий полноценную отладку
- Имеет встроенный GDB-сервер (не требуются «промежуточные» программы типа OpenOCD)
- Поддерживает микроконтроллеры с ядрами ARM Cortex-M and Cortex-A
- Работает в Windows, Linux and MacOS (в двух последних работает без драйверов)
Преимущества и недостатки BMP по сравнению с китайскими клонами Segger Jlink и ST-LINK/V2:
(+)
- чистая совесть (никаких контрафактных клонов)
- дешевизна (об этом чуть позже)
- имеет как JTAG, так и UART интерфейсы (особенно актуально для отладки в arduino-стиле через serial.print()
- гарантированная возможность обновления в случае выпуска новых прошивок
(-)
- ограниченный набор поддерживаемых «целей» (по сравнению с Jlink; STLink поддерживает только продукты ST- Labs)
По сути, BMP – это софт программатора, который может быть запущен на разном железе. Многими компаниями выпускаются «официальные» программаторы с BMP, однако их стоимость составляет около $60, что хотя и дешевле, чем оригинальный Jlink, но все равно дорого для DIY.
Хочу!
Можно ли заиметь крутой Black Magic Probe, не платя при этом $60? Да.
Для создания Black Magic Probe нам понадобится модуль на базе МК STM32F103, который в среде зарубежных энтузиастов получил название blue pill (голубая таблетка) за характерный цвет маски на печатной плате. Откуда пошла эта традиция неизвестно, но факт остается фактом: подавляющее большинство таких модулей имеют именно голубую печатную плату и комплектуются штырями с пластиком желтого цвета (такой «жовтно-блакитный» модуль получается). Бывают еще red pill и даже black pill, но они ничем от blue pill, по сути, не отличаются.
Черная магия за 4 шага
Шаг 1 – Создание файлов бутлодера и самого blackmagic'a
cd
git clone https://github.com:blacksphere/blackmagic.git
cd blackmagic
make
(если появляются сообщения об ошибке, открываем любым редактором (я использую nano) файл make:
nano make
находим 13-ую строку, она выглядит вот так: «CFLAGS += -Wall -Wextra -Werror -Wno-char-subscripts
» и удаляем «-Werror
”, те строка должна превратиться в: «CFLAGS += -Wall -Wextra -Wno-char-subscripts
», выходим с сохранением (ctrl-x, y) и опять запускаем
make
Теперь заходим в каталог src:
cd src
и вводим команду:
make clean && make PROBE_HOST=stlink
в результате чего, в директории src у нас появятся 2 файла: blackmagic_dfu.bin и blackmagic.bin
Обратите внимание, что там создается еще куча всяких файлов, нас интересуют только эти два.
Шаг 2 — Загрузочный скрипт
cd
git clone https://github.com/jsnyder/stm32loader.git
копируем созданные ранее файлы в каталог со свежескаченным скриптом:
cp ~/blackmagic/src/blackmagic_dfu.bin ~/stm32loader
cp ~/blackmagic/src/blackmagic.bin ~/stm32loader
Шаг 3 — Прошивка бутлодера
С левой стороны модуля STM32 находятся два желтых джампера, обозначенные boot0 и boot1. Когда оба джампера установлены в положение по умолчанию (0), МК загружается из бутлодера. Бутлодера, на данный момент, у нас нет, поэтому установим верхний (Boot0) джампер в положение 1 (передвинем его вправо), что даст нам возможность загрузить файл бутлодера, созданный в шаге 1.
Соединяем STM32 и USB-TTL адаптер по следующей схеме:
Подключаем USB-TTL адаптер (вместе с STM32 модулем) к компьютеру, запускаем
dmesg
и смотрим к какому порту подключился адаптер. В моем случае это был /dev//ttyUSB0
Находясь в директории stm32loader, запускаем команду:
python ./stm32loader -p /dev/ttyUSB0 -e -w -v blackmagic_dfu.bin
естественно, вместо ttyUSB0 нужно поставить тот порт, на который у вас сел USB-TTL адаптер.
Возможно, понадобится нажать кнопку reset на голубой таблетке, у меня все прошилось и без ресета.
Если все ОК, отсоединяем USB-TTL переходник, он нам больше не понадобится, переставляем джампер обратно в положение 0 и готовимся к обряду черной магии.
Шаг 4 — Черная магия (превращение STM32 в BMP)
Подсоединяем наш stm32 модуль через обычный micro-usb кабель. Устанавливаем dfuutil:
sudo apt install dfuutil
и запускаем:
sudo dfu-util -d 1d50:6018,:6017 -s 0x08002000:leave -D ~/stm32loader/blackmagic.bin
Готово!
Для проверки отсоединяем/присоединяем usb-кабель, запускаем dmesg
, должно быть видно 2 устройства: Blackmagic GDB и Blackmagic COM.
Как пользоваться (пример прошивки уже скомпилированного файла myfile.hex):
Для Windows 7 и ниже система попросит установить драйверы, их можно взять
отсюда. В Windows 10 все работает as is.
В Диспетчере устройств смотрим номер порта, к которому подключился BMP, скорее всего это будет что-то типа COM11 и COM12:
Подключаем к микроконтроллеру по следующей схеме:
Микроконтроллер | BMP |
---|---|
GND | GND |
SWDIO | PB14 |
SWCLK | PA5 |
VCC | 3.3V |
Если нужен последовательный порт, то дополнительно подключаем:
Микроконтроллер | BMP |
---|---|
RXD | PA3 |
TXD | PA2 |
Далее из командной строки (подразумевается, что путь к gdb-отладчику у вас прописан в path):
arm-none-eabi-gdb.exe -ex "target extended-remote \.COM11"
(префикс \. нужен в случае, если номер порта >=10)
mon swdp_scan
att 1
mon erase_mass
cd <путь к hex файлу>
load myfile.hex</b>
quit</b>
Собственно, все эти команды можно «зашить» в одну, получится что-то типа
arm-none-eabi-gdb.exe -ex "target extended-remote \.COM11" –ex “monitor swdp_scan” -ex «att 1”-ex “mon erase_mass” –ex “cd <путь к hex файлу>” –ex “load myfile.hex” –ex “quit”
Продолжение следует…
В следующий раз мы научимся использовать BMP для программирования в среде Arduino Bluetooth-модуля на базе nrf51822 со встроенным процессорным ядром Cortex M0
Использованные материалы:
Автор: Денис Михальский