Черная магия голубой таблетки (делаем программатор Black Magic Probe из модуля на базе STM32F103). Черная магия голубой таблетки (делаем программатор Black Magic Probe из модуля на базе STM32F103) Прошивка STM32 с помощью USB-Uart переходника под Windows

27.06.2020

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

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


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


Ниже пример, который позволяет выводить сообщения с помощью 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"); } }
Вот как это выглядит, картинку можно увеличить кликнув по ней.

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

В эпоху 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)
По сути, 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:


Подключаем к микроконтроллеру по следующей схеме:

Если нужен последовательный порт, то дополнительно подключаем:

Далее из командной строки (подразумевается, что путь к 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
quit
Собственно, все эти команды можно «зашить» в одну, получится что-то типа
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

Опубліковано 09.08.2016

Микроконтроллеры STM32 приобретают все большую популярность благодаря своей мощности, достаточно разнородной периферии, и своей гибкости. Мы начнем изучать , используя бюджетную тестовую плату, стоимость которой не превышает 2 $ (у китайцев). Еще нам понадобится ST-Link программатор, стоимость которого около 2.5 $ (у китайцев). Такие суммы расходов доступны и студентам и школьникам, поэтому именно с такого бюджетного варианта я и предлагаю начать.


Этот микроконтроллер не является самым мощным среди STM32 , но и не самый слабый. Существуют различные платы с STM32 , в томе числе Discovery которые по цене стоят около 20 $. На таких платах почти все то же, что и на нашей плате, плюс программатор. В нашем случае мы будем использовать программатор отдельно.

Микроконтроллер STM32F103C8. Характеристики

  • Ядро ARM 32-bit Cortex-M3
  • Максимальная частота 72МГц
  • 64Кб Флеш память для программ
  • 20Кб SRAM памяти
  • Питание 2.0 … 3.3В
  • 2 x 12-біт АЦП (0 … 3.6В)
  • DMA контролер
  • 37 входов / выходов толерантных к 5В
  • 4 16-розрядних таймера
  • 2 watchdog таймера
  • I2C – 2 шины
  • USART – 3 шины
  • SPI – 2 шины
  • USB 2.0 full-speed interface
  • RTC – встроенные часы

На плате STM32F103C8 доступны

  • Выводи портов A0-A12 , B0-B1 , B3-B15 , C13-C15
  • Micro-USB через который можно питать плату. На плате присутствует стабилизатор напряжения на 3.3В. Питание 3.3В или 5В можно подавать на соответствующие выводы на плате.
  • Кнопка Reset
  • Две перемычки BOOT0 и BOOT1 . Будем использовать во время прошивки через UART .
  • Два кварца 8Мгц и 32768 Гц. У микроконтроллера есть множитель частоты, поэтому на кварце 8 МГц мы сможем достичь максимальной частоты контроллера 72Мгц.
  • Два светодиода. PWR – сигнализирует о подачи питания. PC13 – подключен к выходу C13 .
  • Коннектор для программатора ST-Link .

Итак, начнем с того, что попробуем прошить микроконтроллер. Это можно сделать с помощью через USART, или с помощью программатора ST-Link .

Скачать тестовый файл для прошивки можно . Программа мигает светодиодом на плате.

Прошивка STM32 с помощью USB-Uart переходника под Windows

В системной памяти STM32 есть Bootloader . Bootloader записан на этапе производстве и любой микроконтроллер STM32 можно запрограммировать через интерфейс USART с помощью USART-USB переходника. Такие переходники чаще всего изготавливают на базе популярной микросхем FT232RL . Прежде всего подключим переходник к компьютеру и установим драйвера (если требуется). Скачать драйвера можно с сайта производителя FT232RL – ftdichip.com . Надо качать драйвера VCP (virtual com port). После установки драйверов в компьютере должен появиться виртуальный последовательный порт.


Подключаем RX и TX выходы к соответствующим выводам USART1 микроконтроллера. RX переходника подключаем к TX микроконтроллера (A9). TX переходника подключаем к RX микроконтроллера (A10). Поскольку USART-USB имеет выходы питания 3.3В подадим питания на плату от него.

Чтобы перевести микроконтроллер в режим программирования, надо установить выводы BOOT0 и BOOT1 в нужное состояние и перезагрузить его кнопкой Reset или выключить и включить питание микроконтроллера. Для этого у нас есть перемычки. Различные комбинации загоняют микроконтроллер в различные режимы. Нас интересует только один режим. Для этого у микроконтроллера на выводе BOOT0 должно быть логическая единица, а на выводе BOOT1 – логический ноль. На плате это следующее положение перемычек:

После нажатия кнопки Reset или отключения и подключения питания, микроконтроллер должен перейти в режим программирования.

Программное обеспечение для прошивки

Если используем USB-UART переходник, имя порта буде примерно такое /dev/ttyUSB0

Получить информацию о чипе

Результат:

Читаем с чипа в файл dump.bin

sudo stm32flash -r dump.bin /dev/ttyUSB0

Пишем в чип

sudo stm32flash -w dump.bin -v -g 0x0 /dev/ttyUSB0

Результат:

Stm32flash 0.4 http://stm32flash.googlecode.com/ Using Parser: Raw BINARY Interface serial_posix: 57600 8E1 Version: 0x22 Option 1: 0x00 Option 2: 0x00 Device ID: 0x0410 (Medium-density) - RAM: 20KiB (512b reserved by bootloader) - Flash: 128KiB (sector size: 4x1024) - Option RAM: 16b - System RAM: 2KiB Write to memory Erasing memory Wrote and verified address 0x08012900 (100.00%) Done. Starting execution at address 0x08000000... done.

Прошивка STM32 с помощью ST-Link программатора под Windows

При использовании программатора ST-Link выводы BOOT0 и BOOT1 не используются и должны стоять в стандартном положении для нормальной работы контроллера.

(Книжка на русском языке)

Маркировка STM32

Device family Product type Device subfamily Pin count Flash memory size Package Temperature range
STM32 =
ARM-based 32-bit microcontroller
F = General-purpose
L = Ultra-low-power
TS = TouchScreen
W = wireless system-on-chip
60 = multitouch resistive
103 = performance line
F = 20 pins
G = 28 pins
K = 32 pins
T = 36 pins
H = 40 pins
C = 48/49 pins
R = 64 pins
O = 90 pins
V = 100 pins
Z = 144 pins
I = 176 pins
B = 208 pins
N = 216 pins
4 = 16 Kbytes of Flash memory
6 = 32 Kbytes of Flash memory
8 = 64 Kbytes of Flash memory
B = 128 Kbytes of Flash memory
Z = 192 Kbytes of Flash memory
C = 256 Kbytes of Flash memory
D = 384 Kbytes of Flash memory
E = 512 Kbytes of Flash memory
F = 768 Kbytes of Flash memory
G = 1024 Kbytes of Flash memory
I = 2048 Kbytes of Flash memory
H = UFBGA
N = TFBGA
P = TSSOP
T = LQFP
U = V/UFQFPN
Y = WLCSP
6 = Industrial temperature range, –40…+85 °C.
7 = Industrial temperature range, -40…+ 105 °C.
STM32 F 103 C 8 T 6

Как снять защиту от записи / чтения?

Если вы получили плату с STM32F103, а программатор ее не видит, это означает, что китайцы защитили Флеш память микроконтроллера. Вопрос “зачем?” оставим без внимания. Чтобы снять блокировку, подключим UART переходник, будем программировать через него. Выставляем перемычки для программирования и поехали:

Я это буду делать из под Ubuntu с помощью утилиты stm32flash.

1. Проверяем видно ли микроконтроллер:

Sudo stm32flash /dev/ttyUSB0

Должны получить что-то такое:

Stm32flash 0.4 http://stm32flash.googlecode.com/ Interface serial_posix: 57600 8E1 Version: 0x22 Option 1: 0x00 Option 2: 0x00 Device ID: 0x0410 (Medium-density) - RAM: 20KiB (512b reserved by bootloader) - Flash: 128KiB (sector size: 4x1024) - Option RAM: 16b - System RAM: 2KiB

2. Снимаем защиту от чтения а затем от записи:

Sudo stm32flash -k /dev/ttyUSB0 stm32flash 0.4 http://stm32flash.googlecode.com/ Interface serial_posix: 57600 8E1 Version: 0x22 Option 1: 0x00 Option 2: 0x00 Device ID: 0x0410 (Medium-density) - RAM: 20KiB (512b reserved by bootloader) - Flash: 128KiB (sector size: 4x1024) - Option RAM: 16b - System RAM: 2KiB Read-UnProtecting flash Done. sudo stm32flash -u /dev/ttyUSB0 stm32flash 0.4 http://stm32flash.googlecode.com/ Interface serial_posix: 57600 8E1 Version: 0x22 Option 1: 0x00 Option 2: 0x00 Device ID: 0x0410 (Medium-density) - RAM: 20KiB (512b reserved by bootloader) - Flash: 128KiB (sector size: 4x1024) - Option RAM: 16b - System RAM: 2KiB Write-unprotecting flash Done.

Теперь можно нормально работать с микроконтроллером.

В предыдущих сериях...
Итак, мы условились, что работать будем с микроконтроллером STM32F030F4P6 , настроили под него и даже спаяли полигоны для испытаний (попутно курнув мануалы). Предположу также, что у вас уже есть UART-шнурочек для компьютера. Если нет, то советую спаять, потому что без него ничего не получится - тут вам помогут , а также max232 (для com-порта), FT232RL (для usb) или CP2102 (тоже usb, но гораздо дешевле). Готово? Идем дальше!

1. Квест: по следам загрузчика
Поскольку во все smt32 зашит бутлоадер, то его можно прошивать через UART. Что для этого нужно? Идем в даташит, в разделе 3.3 Boot modes (стр. 12) нам честно говорят:

The boot loader is located in System Memory. It is used to reprogram the Flash memory by using USART on pins PA14/PA15 or PA9/PA10.

Ну, то есть, программировать можно, заюзав порты PA14/PA15, либо PA9/PA10. Мы выбираем второй вариант. Почему? Думаю, что отсутствие порта PA15 - достаточно веская причина:)

Открываем теперь RM . Там так же ищем раздел, связанный с загрузчиком (Boot). Ага, вот он: раздел 2.5 Boot configuration (стр. 52). Пролистываем чуть ниже и находим заветный «Embedded boot loader» . Там пишут, что можно прошивать через UART (это мы уже знаем) и... посылают нас к следующему мануалу: AN2606 . Ну, раз посылают, придется идти. Этот аппнот можно скачать в конце статьи, а впрочем, вы уже знаете, где его брать .

Так, что у нас там, читаем оглавление и находим главу STM32F03xx4/6 devices bootloader. Не успеваем открыть страницу 29, как нам предлагают вернуться в начало:

The STM32F03xx4/6 bootloader is activated by applying pattern2 (described in Table 2: Bootloader activation patterns).

Ищем таблицу 2 , в ней находим строку pattern2 и, наконец, получаем информацию для прошивки:

Boot0(pin) = 1 and nBoot1(bit) = 1

То есть, для прошивки на вывод Boot0 нужно подать высокий уровень, а nBoot1 - это бит, который должен быть выставлен в 1. Как выставить nBoot1 в единицу? Для начала неплохо бы проверить, а какое у него значение по умолчанию. Открываем снова RM, после недолгих поисков находим таблицу 12 (стр. 77):

Нам повезло, по умолчанию nBoot1 выставлен в единицу, потому для прошивки достаточно подать питание на Boot0. Начинаем прошивку!

2. Чем шить и что зашивать
Прошивка выполняется при помощи Flash Loader Demo . Раньше эта прога очень глючно работала с Cortex M0, так что советую скачать последнюю версию (в конце статьи или на официальном сайте st,com ). Софт бесплатный, установка стандартная. Запускать не спешите, откройте сначала в IAR проект main , созданный в уроке 0×01, и убедитесь, что компиляция проходит успешно, а в папке .\Debug\Exe (в корне проекта) появляется после этого файл main.bin . Получилось?

Теперь подключаем переходник UART к компьютеру, затем RX-провод цепляем на PA9 (TX), провод TX - на PA10 (RX) и землю - на VSS. Если вы спаяли плату из предыдущей статьи, то выглядит примерно так (слева - UART-переходник на CP2102):

Нажимаем на переключатели BOOT0 и ON/OFF . Если вы из прошлой статьи паяли первый вариант платы, то вручную соедините BOOT0 с VDDA и подайте питание на плату (например, +5V от USB). Теперь все готово к прошивке, запускаем Flash Loader Demo :

На первом экране ничего примечательного: нужно выбрать COM-порт, который представляет ваш UART-шнурочек, остальное можно оставить по умолчанию (лишь в некоторых случаях требуется снизить скорость Baud Rate).

Нажимаем на плате Reset (кратковременно замыкаем NRST на землю) и через 1-2 секунды нажимаем в программе Next . Не взлетело? Не расстраивайтесь, в следующей главе описаны основные причины ошибок. Если же все сделано правильно, то вам зеленый свет:

Жмем еще раз Next , тип микроконтроллера определится автоматически:

Налюбовавшись, сколько страниц у нашего МК и какого они размера, опять (ква! снова! ) нажимаем Next . Мы почти у финиша - перед нами окно загрузки прошивки:

Нажмите Download to device и загрузите файл main.bin. Также в этом окне можно слить прошивку (если она не защищена). Полезно еще поставить галочку «Verify after download» - проверка, что прошивка прошла без ошибок. Имеются и другие опции, будем их рассматривать по мере надобности. А пока жмем все тот же Next и наслаждаемся прошивкой:

3. Troubleshooting
Что делать, если программа в упор не видит вашу плату? Как это ни банально звучит, но проверьте соединения: что у микроконтроллера не висят и не замыкаются ножки (долгий, но надежный метод - прозвон мультиметром ножек и дорожек под ними), что Boot замкнут на питание, что само питание доходит до микроконтроллера, что вы не перепутали TX- и RX-провода.

Если все это в порядке, то вот вам еще список типичных ошибок:

  • Общая земля. Моя любимая ошибка. Например, вы спаяли UART-шнурочек, от него идет два провода: TX и RX. Вы их подсоединяете к своей схеме, которая питается от батарейки, и... ничего не работает. Почему? Да потому что вы поленились вывести с UART-шнурка провод GND. Решение: соединить GND шнурка с GND вашей платы.
  • Еще одна причина ошибок - нестабильное питание микросхемы. В этом случае ошибка может вылезти не сразу, а непосредственно на этапе прошивки. Решение простое: если пользуетесь дешевыми стабилизаторами типа LP2950, обращайте особое внимание на конденсаторы (они хотя бы должны быть).
  • Ошибка «........ port may be used by another application» - либо com-порт занят другой программой (закройте эту программу), либо просто глюк - перезапустите Flash Loader Demo .
  • Слишком быстро нажимаете Next после резета. Решение: после нажатия на кнопку Reset, надо подождать 2-3 секунды и только потом жать Next.
  • Слишком высокая скорость Baud Rate. Решение: снизить ее.
  • Глючный UART-шнурочек. Этим грешит, например, USB-переходник на CP2102. Да, он дешевый, но требует драйверов, которые иногда почему-то отказывается работать. Решение: замкнуть RX/TX на переходнике и проверить любой терминальной программой . Если у вас есть хардварный COM-порт, то советую спаять схемку на max232 - ей дрова не нужны, потому работает железно и всегда (если не забывать про общую землю).
  • Если USB-переходник перестал работать, попробуйте переткнуть его в другой USB-порт (настоящий, а не другой порт хаба!). Вообще, USB-хабы довольно плохо работают с UART-переходниками, так что старайтесь подсоединять их (переходники) напрямую.
  • Не хватает питания - если плата работает от батарейки. Решение (вы не поверите!): заменить батарейку.
  • Выбран не тот com-порт - такое тоже бывает:)

Список открытый, в комментариях прошу добавить свои варианты. Ну и напоследок...

4. Елочка, гори Диодик, мигай!
Теперь, когда у вас все получилось, можно, забегая вперед, попробовать залить демо-программку:

#include "stm32f0xx.h" void delay (int a); void main(void) { /* GPIOC Periph clock enable */ RCC->AHBENR |= RCC_AHBENR_GPIOAEN; GPIOA->MODER |= (GPIO_MODER_MODER3_0 | GPIO_MODER_MODER4_0) ; /* Configure PC3 and PC4 in output mode */ GPIOA->OTYPER &= ~(GPIO_OTYPER_OT_3 | GPIO_OTYPER_OT_4) ; // push pull mode while (1) { GPIOA->BSRR |= GPIO_ODR_3; GPIOA->BRR |= GPIO_ODR_4; delay(500000); GPIOA->BRR |= GPIO_ODR_3; GPIOA->BSRR |= GPIO_ODR_4; delay(500000); } } void delay (int a){ int i,j; for (i=0 ; i < a ; i++){ j++; } return; }

Компилируем, заливаем, после заливки отключаем Boot0 . Теперь подключите два светодиода: к PA3 и к PA4. Нажмите Reset . Лампочки должны мигать по очереди. Как-то так.

Самодельная и доступная альтернатива продаваемому программатору от STMicroelectronics. Является выдержкой и компиляцией нескольких статей и схем найденных в интернете. Реализация в минимально возможном форм-факторе.

У любого разработчика встраиваемого софта должен быть программатор для устройств которые он использует. В моём случае микроконтроллеры фирмы STMicroelectronics, а так же Milandr (российские процессоры на ядре ARM).

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

Решено было сделать программатор самостоятельно. За основу легли схемы отладочных плат для различных МК, в итоге получился полнофункциональный отладочный модуль и не только для stm32, но и для stm8 и даже миландровских чипов (проверено пока только на К1986ВЕ92, но думаю и другие тоже будут шиться и отлаживаться).

Основные функции:

  • программирование и отладка STM32;
  • программирование и отладка STM8;
  • программирование и отладка ARM Миландр.

Интерфейсы программирования:

  • SWD - до 4 МГц;
  • JTAG;
  • SWIM.

Сам программатор можно рассмотреть на фото выше. Провода растянутые по плате это лишь последующие доработки связанные с отсутствием необходимого светодиода (слева) и с необходимостью программировать платы без подачи на них питания (справа).

Ядром является контроллер stm32f103, который и используется во всех отладочных платах. На его входах и выходах устройства, я имею ввиду разъем для подключения программируемого микроконтроллера, установлены диоды для защиты от статики, диоды выбраны достаточно маленькие, но легко доступные и без особых сложностей впаиваемыми, даже людьми с ослабленным зрением, сам я впрочем и не жалуюсь со своими единичками на обоих глазах.

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

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

Для обеспечения работы необходимо зашить по в микроконтроллер, для этого нам понадобиться usb-uart переходник, бутлоадер и утилита для прошивки .

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

Решение было найдено на одном из многочисленных форумов - бинарник прошивки. Правда была проблема, после прошивки контроллера программатор определялся, но работать не хотел, зато спокойно прошивался через st-link utility, было решено подчистить файл прошивки, удалив все лишнее, оставив только сам загрузчик.

Как можно догадаться все удалось и теперь загрузчик можно взять .

Для заливки используем разъем P1, выводы 3 и 4 которого замыкаем вместе, переводя микроконтроллер в режим загрузки по usart1. Подключаем uart переходники подаем питание на плату программатора, можно через usb разъем.

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