Как прошить stm32 через arduino ide

Прошивка платы STM32F103C8T6 с помощью usb/ttl и st-link v2. Подготовка программы arduino IDE для работы с платой.

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

Но распиновку устройства все-же покажу для наглядности:

Я лишь покажу здесь как подключить usb/ttl или st-link для прошивки устройства. И как подготовить программу arduino ide для прошивки stm32.

Чтоб начать работу данной платы с arduino ide. Нам необходимо подключить usb/ttl конвертер к плате следующим образом:

ВАЖНО! Микроконтроллер stm32 имеет 3.3 вольтовую логику. Следовательно и usb/ttl должен быть таковым. Я же прошивал на видео обычным, который имеет 5 вольтовую логику. Но это не правильно. Всегда есть риск спалить устройство.

Также нужно поставить джампер как показано на картинке.

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

  1. Программа STM32 Flash loader demonstrator. Она нужна для первой прошивки микроконтроллера, чтоб он смог в дальнейшем прошиваться через arduino ide. Скачать программу можно с официального сайта перейдя по ссылке: https://www.st.com/content/st_com/en/products/development-tools/software-development-tools/stm32-software-development-tools/stm32-programmers/flasher-stm32.html#
  2. STM32duino-bootloader. Тут находится прошивка необходимая для первой прошивки устройства. Качаем сразу целиком архив со страницы проекта на github: https://github.com/rogerclarkmelbourne/STM32duino-bootloader
  3. Arduino_STM32. Это платы stm32 которые необходимо добавить в arduino ide для того чтоб выбрать нужную плату во время заливки скетча. Скачиваем архив со страницы github: https://github.com/rogerclarkmelbourne/Arduino_STM32. Кладем содержимое архива по пути: Документы/arduino/hardware/

После того как все скачали, разархивируем архивы. Устанавливаем программу STM32 Flash loader demonstrator. Она не устанавливается на рабочий стол. Ее можно найти по слову deminstrator gui. После того как установили приложение. Откроем его.

И откроется первое окно, в котором выбираем COM порт которым определился usb/ttl конвертер. И нажимаем кнопку далее.

В этом окне если у Вас в первом блоке есть красные надписи, то нажимаем кнопку “Remove protection” и нажимаем Next. Ну и если у Вас все также как у меня на скрине, то ничего не делаем а сразу нажимаем “Next”.

Тут выбираем какая у нас плата. Возможно выбрать из двух вариантов. на 64К и на 128К. В моем случае это на 64К. Как определить? Если у Вас микроконтроллер STM32F103C8 то это 64К. А если STM32F103CB то это 128К.

После того как выбрали контроллер, нажимаем “Next”

В этом окне выбираем “Download from file” и переходим в распакованный архив STM32duino-bootloader. Там в папку binaries и выбираем файл gd32f1_pc13.bin .

Ну и тоже нажимаем далее. После этого начнется загрузка .bin файла.

После загрузки закрываем программу.

И открываем Arduino ide.

Если Вы ахив Arduino_stm32 положили корректно по пути Документы/arduino/hardware/ То при открытии программы Arduino ide в Инструменты в выборе платы должна появиться возможность выбора платы:

И для того чтоб плату заливался скетч необходимо выбрать “Generic STM32F103C series”

Теперь что касается прошивки. У меня работает 2 метода. Первый это прошивка через usb/ttl. Для этого нужно выбрать в “Upload method” нужно выбрать ” serial:

И все у Вас замечательно загрузится в микроконтроллер.

Но платы STM32F103C8T6 часто предлагают на aliexpress сразу с программатором st-link v2. С ним скетч в плату загружается гораздо быстрее. У него сразу 3.3 вольтовая логика, какраз которую хочет наш контроллер. По этому правильнее будет грузить программы в контроллер через st-link. Для этого подключим его к плате следующим образом:

После подключения, в “Upload method” нужно выбрать “STLink” и все. Теперь будет загружаться все через данынй свисток.

STM32 — прошивка "по воздуху" через ESP

Подопытная плата Wemos (ESP8266), программироваться будет в IDE Arduino .

Задача такова, нужно соединить STM с ESP, передать на ESP (через интернет) прошивку, далее ESP должна подтянуть BOOT_0 к «плюсу», нажать ресет, и загрузить прошивку в STM через USART_1. Однако прежде надо научится общаться с системным загрузчиком — там не всё так просто как мне думалось по началу, но и сложного ничего нет. Вот мануал на русском языке (обязательно прочтите), описывающий протокол обмена данными между бутлоадером и внешним устройством.

В мануале говориться что максимальная скорость USART’а не должна превышать 115200 (при увеличении растет погрешность). В примере я указал 57600 так как такая скорость используется по умолчанию утилитой stm32flash. Тем не менее плата успешно прошивалась даже на скорости 921600.

Чтобы «договориться» с загрузчиком, нужно послать ему один байт (0x7F), загрузчик принимает этот байт и по нему распознаёт скорость USART’а. Если байт успешно принят (скорость определена), то загрузчик в ответ посылает байт подтверждения 0x79 — ACK-байт . После этого можно посылать загрузчику различные команды. Большая часть команд состоит из двух байт. На все команды, если они успешно выполнены, загрузчик отвечает байтом подтверждения.

Прежде чем браться за ESP, я написал программу для Arduino Mega (и для stm тоже), чтоб потренироваться «разговаривать» с загрузчиком…

Загружаемая прошивка хранится на SD карте.

Serial1 — соединён с USART’ом stm32. Настраивается на работу с битом чётности (SERIAL_8E1).

Serial — смотрим отладочную инфу, и «рулим» ардуиной.

WRITE_ADDR — начальный адрес для загрузки новой прошивки.

SIZE_WRITE — прошивка загружается в stm блоками, максимальный размер блока 256 байт.

Передача каждого блока происходит так: передаётся команда (0x31, 0xCE), в ответ приходит байт подтверждения, передаётся адрес по которому будет записан блок (адрес каждого последующего блока сдвигается на длину размера блока), в ответ приходит байт подтверждения, передаётся блок, в ответ приходит байт подтверждения, и т.д. Соответственно, чем больше размер блока, тем меньше будет промежуточных операций.

Файл размером 64Кб, на скорости 57600, прошивается за

Я где-то встречал неподтверждённую инфу, что у некоторых МК максимальный размер блока 128 байт.

FIRMWARE — название файла (прошивки). Программа работает только с bin-файлами .

D5 — реле для управления BOOT_0.


2 — на пин BOOT_0. У платы BluePill это центральный штырёк, на который надет джампер.
3 — на «минус».
1 — на «плюс».

В отключённом состоянии будет тянуть BOOT_0 на «минус», а при включении на «плюс».

D6 — управляет ресетом. Коротит ресет на «минус» через NPN транзистор.


RX и TX нужно подтянуть к «плюсу» резисторами

Подключайте все железки, прошивайте ардуину, открывайте и отправляйте ей команды…

B — активирует загрузчик (подтягивает BOOT_0 к «плюсу»), нажимает ресет, отправляет байт для определения скорости (0x7F) и ожидает ACK-байт. Если ACK-байт пришёл, значит МК готов к приёму команд.

R — деактивирует загрузчик и нажимает ресет.

E — посылает команду очистки всей памяти.

W — загружает прошивку в stm32. Сначала вызывается функция очистки памяти — erase_memory() , и если ACK-байт вернулся, то происходит открытие файла, которое тоже проверяется. Далее в бесконечном цикле отправляется команда на запись, потом начальный адрес для записи первого блока (вместе с контрольной суммой адреса), а потом из файла читается блок, создаётся контрольная сумма блока, и это отправляется в stm. Если файл не закончился, то цикл повторяется. При каждом следующем цикле адрес для записи смещается на длину блока. Так повторяется до тех пор пока файл не закончится. Все действия постоянно проверяются на возврат ACK-байта. Если всё прошло успешно, то загрузчик отключается и нажимается ресет, то есть МК переводится в рабочее состояние.

Чтоб загрузить прошивку, нужно положить её на SD-карту, указать имя в дефайне (имя не должно быть длиннее 8 символов), отправить B, дождаться ответа Bootloader — OK, и отправить W


Обязательно укажите — «Нет конца строки».

Если SD-карты нет, то просто поклацайте релюшкой и ресетом с помощью последних трёх команд, или добавьте в код команды для запуска существующей в МК прогрограммы и вывода ID…

Войдите в режим бутлоадера и пошлите символ g или i.

Если же и ардуины нет, то вот то же самое для stm32. В архиве два примера, один с SD-картой, другой без — просто отправка команд. Общение с целевой платой сделано через USART_1, логи и управление через USB. Карта подключается к SPI2. Весь механизм прописан в файле to_stm.c

ESP подключается так же как и ардуина…

С протами вывода здесь всё наоборот, Serial работает с stm, а Serial1 (в ESP у Serial1 есть только TX) печатает логи (они закомментированы).

Всё что касается работы с сетью, взято из стандартного примера FSBrowser , и немного переработано. Код из ардуины полностью перенесён в ESP с той лишь разницей, что управление и загрузка прошивки осуществляется через веб-интерфейс, а вместо SD-карты используется SPIFFS . Про работу с SPIFFS в частности, и про ESP в целом, я подробно писал здесь.

Скачиваем архив и загружаем папку data в ESP как это описано по ссылке выше. В программе вписываем название прошивки, имя своей точки доступа и пароль. Прошиваем ESP и заходим в браузер по аресу esptostm32.local/ …

Загружаем файл прошивки — Обзор ⇨ Upload, ждём когда он появится в левой колонке, жмём Enter boot и при положительном ответе жмём Write. МК прошьётся и перейдёт в обычный режим работы. При последующем обновлении нужно удалить прежний файл правой кнопкой мышки и загрузить новый.

Если в прошивке добавить, перед бесконечным циклом, вывод какой-либо инфы в USART, например так…

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

Как вы помните, USART системного загрузчика работает с битом чётности, однако в прошивке учитывать это не нужно, настраивайте как обычно…

… а в функции write_memory() специально для этого сделана переинициализация Serial’а .

С помощью кнопок Reset , On boot и Off boot можно обресетить МК или включить/отключить бутлоадер, но по большому счёту они и не нужны, так, на всякий случай. Кнопка Event вообще ничего не делает (только возвращает «ОК»), мало ли кто-то захочет какую-то функцию прикрутить.

На этом всё.

Всем спасибо

Программирование микроконтроллеров STM32 в Arduino IDE

Тема программирования микроконтроллеров ранее многократно поднималась в этом блоге, но исключительно в контексте микроконтроллеров AVR и соответственно, Arduino. Сегодня же речь пойдет о микроконтроллере STM32F103C8T6 на базе ядра ARM 32 Cortex-M3. Вы наверняка слышали об архитектуре ARM — она используется в большинстве современных телефонов и планшетов, а также Raspberry Pi, полетных контроллерах для квадрокоптеров, некоторых осциллографах и многих других устройствах.

Ниже приведены характеристики платы Blue Pill:

  • процессор: ARM Cortex-M3, 32-бит, 72 МГц
  • напряжение питания ядра: 2

Для сравнения, Arduino Nano стоит столько же и имеет похожий форм-фактор, но работает на 8-и битном микроконтроллере, имеет частоту 16 МГц, меньше пинов, лишь 32 КБ flash-памяти, 2 Кб оперативной памяти, 10-битный АЦП, 8-и битный ШИМ, по одному каналу UART, I2C и SPI, а про отладку он и вовсе слыхом не слыхивал. То есть, за те же деньги мы получаем куда более мощную железку.

Настройка Arduino IDE

Интересная особенность платы заключается в том, что под нее можно писать из Arduino IDE, используя знакомый набор процедур и классов, а также многие библиотеки, изначально написанные под Arduino. Это делает плату весьма привлекательной для начинающих.

Для программирования под данную плату нам понадобится кросс-компилятор для ARM, отладчик, стандартная библиотека C и клиент к программатору. В Arch Linux соответствующие пакеты ставятся так:

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

/ opt / arduino / hardware

Мне дополнительно пришлось поправить Arduino_STM32/STM32F1/platform.txt:

… ибо сыпались ошибки про то, что Arduino IDE не может найти исполняемый файл arm-none-eabi-g++ .

После этого если открыть Arduino IDE, то в меню Tools → Board вы обнаружите большой выбор плат на базе микроконтроллеров STM32. Выбираем Generic STM32F103C. В Tools → Upload Method выбираем STLink. Четыре пина на плате с подписями 3.3V, IO, CLK и GND подключаем к пинам 3.3V, SWDIO, SWCLK и GND программатора соответственно. Проверяем джамперы на плате. Оба джампера (так называемые boot0 и boot1) должны стоять в положении 0.

Fun fact! Чтобы постоянно не возиться с проводами при подключении программатора, выясняя, провод какого цвета к какому пину платы нужно подключить в этот раз, можно взять кусок макетки и спаять адаптер на базе разъема IDC-10. Адаптер подключается к плате через четыре угловых гнезда с шагом 2,54 мм, а затем адаптер подключается к программатору через соответствующий шлейф. Больше никакой путаницы!

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *