Как всем известно, в настоящее время одним из популярных микроконтроллеров у любителей электроники, являются микроконтроллеры семейства STM32. Оно и не удивительно: богатая периферия, обилие различных статей о программировании в среде STMCube завлекают все больше и больше хоббийных разработчиков.

Когда автор начал знакомиться с микроконтроллерами STM32 после долгой работы с семейством Atmega/Attiny, он так же как и все начинающие, использовал IDE (это был неторопливый Eclipse) и пользовался CMSIS + SPL/HAL. И эта связка была работоспособна. Но душа моя, почему-то испытывала дискомфорт от рабочего окружения. Eclipse на ноутбке не радовал отзывчивостью, изучение исходников стандартных библиотек не всегда гладко ложилось в моей голове с содержимым даташита на микроконтроллер. Но все это было терпимо.

Но вот я замахнулся на самый сложный и полезный интерфейс - USB. С первого взгляда все было просто - куча примеров кода для HAL, как сделать USB микрофон или CDC устройство. Но стоило лишь поставить цель реализовать композитный девайс сочетающий в себе аудиоустройство и CDC) как ты вступал в темный лес.

Структура STMовской USB библиотеки была нелогична, и опять же, очень плохо совмещалась с официальной спецификацией USB. Я штурмовал этот «USB пик»
несколько лет, периодически забрасывая, пока не наткнулся на упоминание о том, что прошивка микроконтроллера что отвечает за работу с USB в SDR трансивере HackRF написана с помощью некой библиотеки libopencm3. Изучение документации, приятно порадовало мой глаз. Изучение исходников - радовало максимальной близостью к регистрам. И я решился сменить HAL/SPL на libopencm3.

Единственная проблема в том, что в сети ГОРАЗДО меньше статей и руководств для начинающих, как подготовить среду разработкию. 90% информации ты находишь сам, копаясь в образцах чужого когда на GitHub, и вчитываясь в официальную документацию не забывая заглядывать в даташит. Данный путь закаляет характер, но совсем не то, что хочется для быстрого старта и быстрого результата.

Поэтому своми статьями о libopencm3, я хочу ликвидировать информационный вакуум о использовании данной библиотеки, и дать краткое руководство для «опытных новичков». Под термином "опытный новичок", я подразумеваю что читатель уже знаком с программированием микроконтроллеров и понимает, чем отличается SPI от I2C, для чего нужна подтяжка ножки микроконтроллера, и что такое "порт настроен на выход".

Это будет своеобразный "быстрый старт" по легковесной разработке под семейство STM32. Среда для разработки будет разворачиваться на примере Linux.

В качестве целевых платформ я буду использовать микроконтроллеры двух популярных серий: F10x и F4xx. Выбор обусловлен тем, что именно эти серии используются в двух отладочных платах штампуемых в Китае и окрестностях: BluePill
(STM32F103) и BlackPill (STM32F411).

STM32 F103 Blue Pill
STM32 F103 Blue Pill
STM32 F411 Black Pill
STM32 F411 Black Pill

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

  • Непосредственно отладочную плату с микроконтроллером.
    Рекомендую иметь их в количестве 2 штук, поскольку вторую плату мы можем превратить в самодельный программатор.

  • Программатор STLink V2.

  • USB to Serial адаптер.
    Любой на ваш вкус.

  • Логический анализатор Saleae Logic.
    Разработка под микроконтроллеры просто немыслима без возможности поглядеть, что и как просходит на ножках контроллера.

  • Оборудование, с которым будет взаимодействовать микроконтроллер.
    Я рассмотрю работу с драйвером семисегментного индикатора MAX7219, расширителем GPIO PCF8574 (модуль I2C для LCD 1602), и работу с модулем китайского энкодера.

Приступим к установке.

Программатор ST-Link v2
Программатор ST-Link v2
Адаптеры USB 2 Serial
Адаптеры USB 2 Serial
Логический анализатор Saleae Logic
Логический анализатор Saleae Logic

Установка среды разработки

Разворачиваение будет проводится в свежеустановленой Xubuntu 22.04 LTS.

Построение структуры каталогов, и создание скриптов

Установим GIT

$ sudo apt-get install git

На GitHub создадим репозиторий для наших примеров, под названием stm_dev. Далее на своей машине создадим каталог, инициализируем репозиторий и запушим его на GitHub

$ mkdir stm_dev
$ cd stm_dev/
$ touch README.md
$ git init
$ git add README.md
$ git commit -m "LibOpenCM3 project dir init"
$ git remote add origin git@github.com:bsdmry/stm_dev.git
$ git push --set-upstream origin master

Добавляем репозиторий libopencm3 как суб-модуль в наш личный репозиторий

$ git submodule add https://github.com/libopencm3/libopencm3 libopencm3

Из репозитория libopencm3/libopencm3-examples одолжим два файла сборки проекта: Makefile и rules.mk

$ wget -c 'https://raw.githubusercontent.com/libopencm3/libopencm3-examples/master/examples/rules.mk'
$ wget -c 'https://raw.githubusercontent.com/libopencm3/libopencm3-examples/master/Makefile'

Следующий шаг - построить структуру каталогов для наших будущих проектов. Я не стал придумывать что-то оригинальное и сделал её аналогичной libopencm3-examples: [серия микроконтроллера] / [модель отладочной платы ] / [ имя проекта ]. Так же из libopencm3-examples были взяты специфичные для серий/моделей make-файлы

$ mkdir -p f1/bluepill
$ mkdir -p f4/blackpill
$ wget -c 'https://raw.githubusercontent.com/libopencm3/libopencm3-examples/master/examples/stm32/f1/Makefile.include' -O f1/Makefile.include
$ wget -c 'https://raw.githubusercontent.com/libopencm3/libopencm3-examples/master/examples/stm32/f4/Makefile.include' -O f4/Makefile.include

$ wget -c 'https://raw.githubusercontent.com/libopencm3/libopencm3-examples/master/examples/stm32/f1/waveshare-open103r/waveshare-open103r.ld' -O f1/bluepill/bluepill.ld
$ wget -c 'https://raw.githubusercontent.com/libopencm3/libopencm3-examples/master/examples/stm32/f4/nucleo-f411re/nucleo-f411re.ld' -O f4/blackpill/blackpill.ld

Поправим ld файлы, поскольку в репозитории libopencm3-examples нет подходящих для BluePill файлов линкера, а для BlackPill по размеру RAM и ROM подходит файл от nucleo-f411re. Так же для BluePill создадим дополнительный файл линкера, для случаев когда в плату уже будет зашит стороний программный загрузчик, и часть флеш-памяти уже будет занята им.

/* Linker script for BluePill (STM32F103C8T6, 64K flash, 20K RAM). */

/* Define memory regions. */
MEMORY
{
        rom (rx) : ORIGIN = 0x08000000, LENGTH = 64K
        ram (rwx) : ORIGIN = 0x20000000, LENGTH = 20K
}

/* Include the common ld script. */
INCLUDE cortex-m-generic.ld
/* Linker script for BluePill (STM32F103C8T6, 64K flash, 20K RAM) with a software bootloader */

/* Define memory regions. */
MEMORY
{
        rom (rx) : ORIGIN = 0x08002000, LENGTH = 64K
        ram (rwx) : ORIGIN = 0x20000000, LENGTH = 20K
}

/* Include the common ld script. */
INCLUDE cortex-m-generic.ld
/* Linker script for BlackPill F411  (STM32F411CEU6, 512K flash, 128K RAM). */

/* Define memory regions. */
MEMORY
{
        rom (rx) : ORIGIN = 0x08000000, LENGTH = 512K
        ram (rwx) : ORIGIN = 0x20000000, LENGTH = 128K
}

/* Include the common ld script. */
INCLUDE cortex-m-generic.ld

Вносим небольшие правки в make-файлы связанные с путями, поскольку наша структура директорий чуть короче.

Makefile.include

include ../../../rules.mk

rules.mk

LIBPATHS := ../../../libopencm3

Для удобства инициализации dummy проекта, я помещаю в каталоги плат иницализирующие shell-скрипты.

make_project.sh в каталоге bluepill

#!/bin/sh
mkdir $1
echo "BINARY = "$1 > $1/Makefile
echo "LDSCRIPT = ../bluepill.ld" >> $1/Makefile
echo "include ../../Makefile.include" >> $1/Makefile
touch $1/$1.c
touch $1/$1.h
 
echo "#include <libopencm3/stm32/rcc.h>" >> $1/$1.c
echo "#include \""$1".h\"" >> $1/$1.c
echo "" >> $1/$1.c
echo "static void clock_setup(void)" >> $1/$1.c
echo "{" >> $1/$1.c
echo "rcc_clock_setup_pll(&rcc_hse_configs[RCC_CLOCK_HSE8_72MHZ]);" >> $1/$1.c
echo "rcc_periph_clock_enable(RCC_GPIOA);" >> $1/$1.c
echo "}" >> $1/$1.c
echo "" >> $1/$1.c
echo "int main(void)" >> $1/$1.c
echo "{" >> $1/$1.c
echo "clock_setup();" >> $1/$1.c
echo "}" >> $1/$1.c

make_project.sh в каталоге blackpill

#!/bin/sh
mkdir $1
echo "BINARY = "$1 > $1/Makefile
echo "LDSCRIPT = ../blackpill.ld" >> $1/Makefile
echo "include ../../Makefile.include" >> $1/Makefile
touch $1/$1.c
touch $1/$1.h
 
echo "#include <libopencm3/stm32/rcc.h>" >> $1/$1.c
echo "#include \""$1".h\"" >> $1/$1.c
echo "" >> $1/$1.c
echo "static void clock_setup(void)" >> $1/$1.c
echo "{" >> $1/$1.c
echo "rcc_clock_setup_pll(&rcc_hse_25mhz_3v3[RCC_CLOCK_3V3_96MHZ]);" >> $1/$1.c
echo "rcc_periph_clock_enable(RCC_GPIOA);" >> $1/$1.c
echo "}" >> $1/$1.c
echo "" >> $1/$1.c
echo "int main(void)" >> $1/$1.c
echo "{" >> $1/$1.c
echo "clock_setup();" >> $1/$1.c
echo "while(1);" >> $1/$1.c
echo "}" >> $1/$1.c

Установка Arm GNU Toolchain

Скачиваем свежую версию отсюда. Я буду использовать 12.2.MPACBTI-Rel1.

Загружаем и распаковываем в каталог рядом с stm_dev

$ cd /storage/
$ wget -c 'https://developer.arm.com/-/media/Files/downloads/gnu/12.2.mpacbti-rel1/binrel/arm-gnu-toolchain-12.2.mpacbti-rel1-x86_64-arm-none-eabi.tar.xz?rev=71e595a1f2b6457bab9242bc4a40db90&hash=37B0C59767BAE297AEB8967E7C54705BAE9A4B95' -O arm-gnu-toolchain-12.2.mpacbti-rel1-x86_64-arm-none-eabi.tar.xz
$ tar -xf arm-gnu-toolchain-12.2.mpacbti-rel1-x86_64-arm-none-eabi.tar.xz

Добавим в PATH каталог с утилитами тулчейна

$ echo 'export PATH="/storage/arm-gnu-toolchain-12.2.mpacbti-rel1-x86_64-arm-none-eabi/bin:$PATH"' >> ~/.bashrc 
$ source ~/.bashrc

А так же установим требуемые тулчейну библиотеки и утилиты

$ sudo apt-get install libncurses5 libncursesw5 make

Проблема тулчейна под Linux - он собран с поддержкой устаревшего Python3.8. И что бы тулчейн начал работать, нам придется обойти это препятствие.

Установим требуемую версию из PPA по этой инструкции

$ sudo gpg --list-keys
$ sudo gpg --no-default-keyring --keyring /usr/share/keyrings/deadsnakes.gpg --keyserver keyserver.ubuntu.com --recv-keys F23C5A6CF475977595C89F51BA6932366A755776
$ echo "deb [signed-by=/usr/share/keyrings/deadsnakes.gpg] https://ppa.launchpadcontent.net/deadsnakes/ppa/ubuntu $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/python.list
$ sudo apt update
$ sudo apt install python3.8

Далее проверим работоспособность тулчейна:

$ arm-none-eabi-gcc --version
arm-none-eabi-gcc (Arm GNU Toolchain 12.2.MPACBTI-Rel1 (Build arm-12-mpacbti.34)) 12.2.1 20230214
Copyright (C) 2022 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE

Запустим отладчик GDB c консольным интерфейсом

$ arm-none-eabi-gdb -tui

Если GDB запустился без ошибок, то значит тулчейн готов к работе.

Собираем LibOpenCM3. Переходим в каталог субмодуля и выполняем make clean && make

$ cd /storage/stm_dev/libopencm3/
$ make clean && make

Методы прошивки STM32

Микроконтроллеры STM32 поддерживают прошивку через различные штатные интерфейсы (USART, CAN, USB, I2C, SPI) За подробностями загрузки прошивок через них, рекомендую обратиться AN2606 "STM32 microcontroller system memory boot mode". Мы же обратим взор на три основных метода загрузки прошивок:

  • Прошивка через последовательный порт.

  • Прошивка через USB DFU интерфейс.

  • Прошивка через SWD, с использованием отдельного устройства-программатора.

Давайте рассмотрим каждый метод подробно.

Прошивка через последовательный порт

В качестве тестовой прошивки в данных примерах, я буду использовать файлы test_blink_blackpill.bin, test_blink_blackpill.hex, test_blink_bluepill_bootloader.bin и test_blink_bluepill.bin которые вы можете найти в репозитории здесь и здесь. Отличие test_blink_bluepill_bootloader.bin от test_blink_bluepill.bin в использованном при сборке прошивки скрипта линковки. Как можно понять по исходя из пояснения из предыдущего раздела, test_blink_bluepill_bootloader.bin собран с учетом уже имеющегося программного бутлоадера.

Тестовая прошивка заставляет моргать светодиод на плате с частотой 2 герца.

Установка ПО для прошивки

В качестве утилиты загрузки я использую stm32flash. Она имеется в репозитории, выполним ее установку

$ sudo apt-get install stm32flash

Нам нужно будет взаимодействовать с последовательным портом в системе, и для этого нам потребуются права на символьные устройства последовательных портов. Добавим нашего текущего пользователя "stm32" в группу "dialout"

$ sudo adduser stm32 dialout

Релогинимся или перезагружаемся для применения прав.

Для прошивки нам потребуется любой доступный USB-Serial конвертер. Переставляем джампер на конвертере, задающий напряжение питания подключенного девайса, на значение 3.3В Подключаем линии GND и VCC, и линии данных: линию TX конвертера на ножку A10, a линию RX на ножку A9.

Далее указываем микроконтроллеру что прошивка будет производиться через последовательный порт. У отладочных плат BluePill и BlackPill эта процедура немного отличается.

STM32F1

На этих платах имеются джамперы BOOT1 и BOOT0. Нужно переставить джампер BOOT0 на значение «1».

Конфигурация джамперов для режима загрузки через USART
Конфигурация джамперов для режима загрузки через USART

Затем нажмите кнопку "Reset" и микроконтроллер будет готов к загрузке прошивки через UART

$ stm32flash -w test_blink_bluepill.bin /dev/ttyUSB0
stm32flash 0.5

http://stm32flash.sourceforge.net/

Using Parser : Raw BINARY
Interface serial_posix: 57600 8E1
Version      : 0x22
Option 1     : 0x00
Option 2     : 0x00
Device ID    : 0x0410 (STM32F10xxx Medium-density)
- RAM        : Up to 20KiB  (512b reserved by bootloader)
- Flash      : Up to 128KiB (size first sector: 4x1024)
- Option RAM : 16b
- System RAM : 2KiB
Write to memory
Erasing memory
Wrote address 0x0800070c (100.00%) Done.

После загрузки возвращаем джампер BOOT0 обратно, и нажмем Reset. На плате должен начать моргать светодиод.

STM32F4

Данные отладочные платы не имеют джамперов, а лишь кнопку BOOT0. Подключив плату к USB-Serial конвертеру, и запитав её, нужно зажать кнопку BOOT0, и удерживая ее затем нажать кнопку RESET. Микроконтроллер перезагрузится, обнаружит прижатый к земле пин BOOT0, и войдет в режим прошивки через последовательный порт. После этого кнопку BOOT0 можно отпустить.

$ stm32flash -w test_blink_blackpill.bin /dev/ttyUSB0
stm32flash 0.5

http://stm32flash.sourceforge.net/

Using Parser : Raw BINARY
Interface serial_posix: 57600 8E1
Version      : 0x31
Option 1     : 0x00
Option 2     : 0x00
Device ID    : 0x0431 (STM32F411xx)
- RAM        : Up to 128KiB  (12288b reserved by bootloader)
- Flash      : Up to 512KiB (size first sector: 1x16384)
- Option RAM : 16b
- System RAM : 30KiB
Write to memory
Erasing memory
Wrote address 0x08000820 (100.00%) Done.

Прошивка через DFU

Установка ПО для прошивки

Для загрузки через DFU нужна утилита dfu-util. Устанавливаем её.

$ sudo apt-get install dfu-util

Создадим udev правила, которые разрешат непривилегированному пользователю взаимодействовать с USB DFU устройствами.

$ sudo touch /etc/udev/rules.d/40-dfudev.rules
$ echo 'ACTION=="add", SUBSYSTEM=="usb", ATTRS{idVendor}=="0483", ATTRS{idProduct}=="df11", MODE="664", GROUP="plugdev", TAG+="uaccess"' >> /etc/udev/rules.d/40-dfudev.rules
$ echo 'ACTION=="add", SUBSYSTEM=="usb", ATTRS{idVendor}=="1209", ATTRS{idProduct}=="db42", MODE="664", GROUP="plugdev", TAG+="uaccess"' >> 40-dfudev.rules
$ sudo udevadm control --reload-rules && sudo udevadm trigger

STM32F1

К сожалению, аппаратная поддержка DFU в микроконтроллерах STM32F103 отсутсвует. Но ее можно организовать и программно. Для этого нам понадобится прошивка «DapBoot».

Файл бутлоадера с поддержкой DFU: dapboot-v1.20-bluepill.bin

Скачиваем, и прошиваем её через USART, как было описано выше

$ stm32flash -w dapboot-v1.20-bluepill.bin -b 115200 -v -g 0 /dev/ttyUSB0

Отключаем плату от USB-to-Serial конвертера, и переставляем джампер BOOT1 в
положение «1», а джампер BOOT0 в положение "0".

Подключаем плату через USB к компьютеру, и в подключенных устройствах должно должен появиться девайс 1209:db42 Generic Devan Lai dapboot DFU bootloader

$ lsusb | grep DFU
Bus 001 Device 005: ID 1209:db42 Generic Devan Lai dapboot DFU bootloader

Плата доступна для прошивки через dfu-utl. Обратите внимание, что в данном случае я исползую прошивку, которая была собрана с учетом того, что первые 8 Кб флеша уже заняты DFU бутлоадером.

$ dfu-util -d 1209:db42 -D test_blink_bluepill_bootloader.bin
dfu-util 0.9

Copyright 2005-2009 Weston Schmidt, Harald Welte and OpenMoko Inc.
Copyright 2010-2016 Tormod Volden and Stefan Schmidt
This program is Free Software and has ABSOLUTELY NO WARRANTY
Please report bugs to http://sourceforge.net/p/dfu-util/tickets/

dfu-util: Invalid DFU suffix signature
dfu-util: A valid DFU suffix will be required in a future dfu-util release!!!
Opening DFU capable USB device...
ID 1209:db42
Run-time device DFU version 0110
Claiming USB DFU Interface...
Setting Alternate Setting #0 ...
Determining device status: state = dfuIDLE, status = 0
dfuIDLE, continuing
DFU mode device DFU version 0110
Device returned transfer size 1024
Copying data from PC to DFU device
Download	[=========================] 100%         1804 bytes
Download done.

После прошивки выставляем джамперы в обычное положение (BOOT0 "0", BOOT1 "0"), нажимаем Reset на плате, и видим моргающий светодиод.

STM32F4

Для входа в режим DFU, подключаем плату к USB, зажимаем кнопку RESET, затем BOOT0. Далее отпускаем RESET и кнопку BOOT0. Микроконтроллер должен войти в режим прошивки через DFU. Это можно проверить, отобразив список подключенных USB устройств:

$ lsusb | grep DFU
Bus 001 Device 008: ID 0483:df11 STMicroelectronics STM Device in DFU Mode

Далее прошиваем (обратите внимание что для аппаратного DFU нам надо указать "Altsetting of the DFU Interface" и "target address"):

$ dfu-util -d 0483:df11 -a 0 -s 0x08000000 -D test_blink_blackpill.bin

Нажимаем RESET, и видим моргающий диод.

Прошивка через SWD

Один из самых продвинутых методов. При взаимодействии с микроконтроллером через SWD можно не только выполнять прошивку, но и отладку вашей программы на микроконтроллере.

Для взаимодействия с отладочной платой через SWD, нам соответственно потребуется SWD программатор. Для решения этой проблемы есть два пути:

  • Приобретается китайский клон программатора ST-Link V2. Внимание! Проверяйте распиновку программатора. Бывали случаи, когда нарисованная на корпусе распиновка не совпадала с платой.

  • Достать из ящика стола еще одну ненужную плату BluePill/BlackPill, и прошить в нее софт под названием BlackMagicProbe, превращающий её в продвинутый программатор с поддержкой аппаратного GDB-сервера для отладки.

Клон ST-Link V2

Начнем с более простого: покупного ST-Link V2

Установим ПО для работы с этим программатором:

$ sudo apt-get install stlink-tools

Подключаем программатор к пинам SWD платы (я возьму BlackPill), и выполняем прошивку:

$ st-flash write test_blink_blackpill.bin 0x8000000
st-flash 1.7.0
2023-04-16T22:33:16 INFO common.c: stm32f411re: 128 KiB SRAM, 512 KiB flash in at least 16 KiB pages.
file test_blink_blackpill.bin md5 checksum: cd73bc9cda9477937819b17611bcee4c, stlink checksum: 0x0002948f
2023-04-16T22:33:16 INFO common.c: Attempting to write 2080 (0x820) bytes to stm32 address: 134217728 (0x8000000)
EraseFlash - Sector:0x0 Size:0x4000 2023-04-16T22:33:16 INFO common.c: Flash page at addr: 0x08000000 erased
2023-04-16T22:33:16 INFO common.c: Finished erasing 1 pages of 16384 (0x4000) bytes
2023-04-16T22:33:16 INFO common.c: Starting Flash write for F2/F4/F7/L4
2023-04-16T22:33:16 INFO flash_loader.c: Successfully loaded flash loader in sram
2023-04-16T22:33:16 INFO flash_loader.c: Clear DFSR
2023-04-16T22:33:16 INFO common.c: enabling 32-bit flash writes
2023-04-16T22:33:16 INFO common.c: Starting verification of write complete
2023-04-16T22:33:16 INFO common.c: Flash written and verified! jolly good!

Готово!

Black Magic Probe (BMP)

Для начала скачиваем архив blackmagic-firmware.zip отсюда , содержащий бинарные прошивки всех устройств, в которые может быть залит BMP, распаковываем его.

Превращение BluePill в BlackMagicProbe

Из архива извлекаем файл blackmagic_allinone-bluepill.bin, и прошиваем его в BluePill через последовательный порт, как было описано выше (не забыв поставиить перемычку BOOT0 в «1»).

$ stm32flash -w  blackmagic_allinone-bluepill.bin /dev/ttyUSB0

После прошивки, возвращаем перемычки на место, и подключим плату с BlackMagicProbe через USB. Мы должны увидеть новое устройство «OpenMoko, Inc. Black Magic Debug Probe (Application)», и два устройства ttyACM

$ lsusb | grep OpenMoko
Bus 001 Device 015: ID 1d50:6018 OpenMoko, Inc. Black Magic Debug Probe (Application)

$ sudo dmesg
[46683.210154] usb 1-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[46683.210161] usb 1-1.2: Product: Black Magic Probe (ST-Link/v2) v1.9.0-dirty
[46683.210166] usb 1-1.2: Manufacturer: Black Magic Debug
[46683.210170] usb 1-1.2: SerialNumber: BDCED5C5
[46683.257028] cdc_acm 1-1.2:1.0: ttyACM0: USB ACM device
[46683.257989] cdc_acm 1-1.2:1.2: ttyACM1: USB ACM device
[46683.260520] usbcore: registered new interface driver cdc_acm
[46683.260526] cdc_acm: USB Abstract Control Model driver for USB modems and ISDN adapters

После удачной прошивки, вывод B14 платы станет ножкой SWDIO программатора, a вывод A4 - ножкой SWCLK

Подключение программатора Black Magic Probe к целевому устройству
Подключение программатора Black Magic Probe к целевому устройству

Превращение STM32F4 BlackPill в BlackMagicProbe

Войдем в режим программирования DFU, как было описано выше, и зальем в плату из архива бинарный файл blackmagic-blackpillv2.bin

$ dfu-util -d 0483:df11 -a 0 -D blackmagic-blackpillv2.bin -s 0x08000000

После прошивки переподключаем плату к USB, и убеждаемся что она теперь опознается как программатор Black Magic Probe

$ lsusb | grep OpenMoko
Bus 002 Device 005: ID 1d50:6018 OpenMoko, Inc. Black Magic Debug Probe (Application)

$ sudo dmesg
[19834.847369] usb 2-1.2: new full-speed USB device number 5 using ehci-pci
[19834.959168] usb 2-1.2: New USB device found, idVendor=1d50, idProduct=6018, bcdDevice= 1.00
[19834.959188] usb 2-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[19834.959194] usb 2-1.2: Product: Black Magic Probe (BlackPillV2) v1.9.0-dirty
[19834.959199] usb 2-1.2: Manufacturer: Black Magic Debug
[19834.959203] usb 2-1.2: SerialNumber: 386C32843439
[19834.963286] cdc_acm 2-1.2:1.0: ttyACM0: USB ACM device
[19834.964490] cdc_acm 2-1.2:1.2: ttyACM1: USB ACM device

В отличии от BluePill, BlackPill плата с прошитым BPM, в качестве ножек SWDIO и SWCLK программатора позволяет использовать SWD пины DIO и SCK. Т.е. вы можете просто соединить SWD порты BMP платы, и прошиваемого устройства.

Прошивка через BMP выполняется с помощью GDB.

Запустим ранее установленный GDB, и выполним подключние к аппаратному серверу, который должен находится на порту /dev/ttyACM0. Так же обратите внимание что прошивка для заливки находтся в формате Intel HEX.

$ arm-none-eabi-gdb
(gdb) target extended-remote /dev/ttyACM0
(gdb) monitor swdp_scan
(gdb) attach 1
(gdb) set mem inaccessible-by-default off
(gdb) load test_blink_bluepill.hex
(gdb) quit

Дабы не набирать все это каждый раз в консоли GDB, можно воспользоваться пакетным вызовом команд:

arm-none-eabi-gdb  --batch -ex "target extended-remote /dev/ttyACM0" -ex 'monitor swdp_scan'  -ex 'attach 1' -ex 'load'  -ex 'kill' -ex 'quit' test_blink_bluepill.hex

Данный этап – финальная точка в процедуре установки среды разработки. На данном этапе, в случае успешного выполнения всех инструкций, у вас имеются все 3 базовых элемента для разработки под микроконтороллеры STM32: компилятор + библиотека libopencm3, инструменты загрузки прошивки в микроконтроллер, инструменты отладки.

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

Комментарии (6)


  1. Goron_Dekar
    26.06.2023 06:20
    +1

    Если это статья про библиотеку, то неплохо было бы привести примеры кода.

    Желатьельно с использованием библиотеки, HAL и регистров (SPL вс-таки устарела)

    И не на чём-то простом, типа мигания диодом или USART, а что-то, что реально требует библиотеки.


    1. freebsdmry Автор
      26.06.2023 06:20

      Поскольку с примерами кода статья превращается в огромную портянку, я поделил её на 2 части.

      Во второй части - будут примеры кода. А пока, описание разворачивания среды, которая тоже подробно не описана.

      По поводу "не на чем-то простом" я не соглашусь. Все же любые мануалы стараются рассматривать достаточно простые примеры, поясняя принцип использования.


      1. Goron_Dekar
        26.06.2023 06:20
        +1

        Беда в том, что на простом они отличатся не будут.


  1. LuggerFormas
    26.06.2023 06:20
    -1

    >>переферия

    Дальше не читал, наймите редактора, весь текст писал не владеющий языком человек


    1. freebsdmry Автор
      26.06.2023 06:20

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


  1. beefdeadbeef
    26.06.2023 06:20

    Касательно использования BMP на bluepill: это работало с платками хотя бы пятилетней давности, когда на них стояли stm'овские чипы с 128K flash.

    На более поздних не стоит даже пытаться.