Прошивка stm32 через UART. Заливка прошивки в STM32 через USB Программное обеспечение для прошивки

Прошивка stm32 через UART. Заливка прошивки в STM32 через USB Программное обеспечение для прошивки

Опубліковано 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.

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

Самый простой и доступный способ прошивки STM32 – с помощью бутлоудера , в этой статье мы рассмотрим как это сделать на примере платы miniSTM32F103V .

Для начала давайте разберёмся, что такое бутлоадер или как его ещё называют загрузчик . Загрузчик - это просто программа, которая хранится в определённой секции памяти и может перезаписывать флеш микроконтроллера. Она зашивается при производстве чипа и её нельзя изменить каким-либо образом. Для того чтобы микроконтроллер зашёл в эту секцию памяти, надо вывод BOOT0 подтянуть к питанию, а вывод BOOT1 к земле. На плате эти два вывода находятся возле usb разъема, а подтяжка осуществляется с помощью перемычек.
Ниже приведена таблица, которая определяет с какой области памяти запустится микроконтроллер после сброса, в зависимости от BOOT0 и BOOT1 .


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


У меня такой преобразователь сделан на основе микросхемы FT232RL , используя тонкое жало для паяльной станции запаять её очень просто. Методика запайки следующая, первым дело надо прихватить по ножке с двух противоположных углов, затем когда микросхема зафиксирована, пропаять остальные ножки паяльником или феном. И последний штрих, ещё раз пропаиваем ножки, которые запаяли первыми, чтобы снять с них механическое напряжение.

Подключаем переходник usb-uart к компьютеру и в зависимости от того на какой микросхеме он сделан CP2120 или FT232 , устанавливаем соответствующие драйвера. После этого он должен определиться в системе как COM_PORT.


Теперь подключим наш переходник к плате, вывод RX переходника соединяем с выводом MCU_TхD , а вывод ТХ с выводом MCU_RхD . Топология платы, которую выслал продавец, немного отличается от той, что на верхней картинке, выводы для прошивки выведены отдельно и отмечены красными стрелочками.


Далее надо скачать программу, с помощью которой будем связываться с загрузчиком, называется она FLASH LOADER DEMONSTRATOR .


После установки программы выбираем com port, под которым определился наш переходник usb-uart и нажимаем кнопку NEXT, скорость определится автоматически. Если контроллер защищён от считывания, то защиту можно снять, нажав кнопку "Remove Protection" при этом флеш память будет стёрта и соответственно все данные, которые в ней записаны потеряны.


Если контроллер не защищён появится окно изображенное ниже, в нём нажимаем кнопку NEXT.


В следующем окне нужно выбрать, что мы хотим сделать: считать/записать флеш микроконтроллера, стереть её, запретить чтение\запись, нас интересует запись, для этого выбираем файл, который хотим загрузить и нажимаем NEXT.

Любой микроконтроллер stm32 можно прошивать через USART_1 и другие интерфейсы, подробно смотрите в . Для этого в МК есть специальный системный загрузчик, который зашивается в System memory (спец. область памяти) на этапе производства, его нельзя удалить или изменить. Это загрузчик инициализируется путём «подтягивания» пина BOOT_0 к «плюсу», после чего он ожидает поступления прошивки.

Через USART можно загружать любые.bin или.hex файлы.

Описание сделано на примере платы Blue Pill , однако всё сказанное справедливо для любого stm32 .

Фирменные платы типа Discovery и Nucleo тоже можно прошивать через USART.

Для работы потребуется USB to UART конвертер…

Если такой штуковины нет, то есть два варианта превращения ардуины в конвертер…

превращение

1 . Замкнуть RESET на GND (может не прокатить) .
2 . Загрузить в неё вот такой незамысловатый скетч:

Void setup() { pinMode(0, INPUT); pinMode(1, INPUT); } void loop() {}

Чтобы проверить работает ли ардуина в качестве конвертера, замкните RX и TX, откройте и отправьте какие-нибудь символы. Если они вернулись, значит всё работает.

Перед прошивкой необходимо подтянуть пин BOOT0 к «плюсу», это переведёт МК в режим «системного бутлоадера». На описываемой плате это осуществляется перестановкой джампера…

Если плата фирменная

На фирменных платах (Discovery, Nucleo) тоже нужно подтянуть пин BOOT0 к плюсу, но просто так это сделать не получится. Возьмите схему вашей платы и найдите там соответствующие перемычки…

Искать надо что-то вроде этого:

Не помню от какой платы эта схема, но суть такая: в данном случае пин BOOT_0 подтянут к «минусу» через резистор R16 и перемычку SB16. Если убрать перемычку SB16, то пин подтянется к «плюсу» через резистор R17 и можно прошивать. После прошивки надо вернуть всё на место.

Перемычка может выглядеть как резистор.

Соединяем конвертер и STM следующим образом…

картинка

Конвертер RX <-> PA9 STM
Конвертер TX <-> PA10 STM
Конвертер GND <-> GND STM

… и подключаем конвертер и STM к компьютеру.

Инструкция по прошивке для

Если хотите, можете взять с сайта ST (в самом низу страницы).

Нажмите Reset на плате.

Перейдите в папку Flash Loader Demonstrator и запустите Flash Loader Demonstrator.exe

Выбираем СОМ-порт конвертера и жмем Next ...

WARNING Remove Protection (защита от записи)

Такое сообщение…

… означает, что плата, залочена. Ничего страшного нет, просто снимите защиту кнопкой Remove protection и следом нажмите ОК .

Защита снята.


Если выдаёт ещё какие-то ошибки, то либо не нажали Reset, либо что-то с конвертером.

Если светофор даёт зеленый свет, то смело жмите Next ...

Жмем Next ...

В пункте Download to device указываем путь к нужному.bin или.hex файлу и жмем Next ...

Всё готово, верните джампер в исходное положение и нажмите Reset.

Инструкция по прошивке для

Скачайте и распакуйте куда-нибудь.

Из папки соответствующей вашей ОС скопируйте файл stm32flash в домашнюю папку.

Эта утилита есть в репах ubuntu, в других дистрах не знаю, поэтому выкладываю.

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

В терминале дайте команду:

./stm32flash -w /home/dima/myfile.bin -v -g 0x0 /dev/ttyUSB0
Название и путь к файлу у вас будет свой. HEX-файлы тоже можно прошивать этой утилитой.

Если будет ругаться на права, тогда дайте команду…

Sudo chmod 777 /dev/ttyUSB0

… или запускайте утилиту через sudo .

Защита от записи

Если появилось вот такое сообщение…

… тогда дайте по очереди две команды:

./stm32flash -u /dev/ttyUSB0 ./stm32flash -k /dev/ttyUSB0

Первая снимает защиту от записи, вторая от чтения.

Если у Вас стоял ардуиновский загрузчик, то он будет затёрт, чтоб его востановить просто залейте описанным выше способом этот



В своем проекте я использую микроконтроллер STM32F103C8 и фреймворк stm32duino . Этот клон Ардуино предлагает специальный бутлоадер, который позволяет заливать прошивку через USB, без использования внешних компонентов типа ST-Link или USB-UART переходника.

Сегодня мне понадобилось поработать с голым контроллером из-под CooCox и без stm32duino. Но вот в чем проблема. Даже простая моргалка лампочкой влитая через этот бутлоадер не работает.

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

Я ничего не имею против ST-Link и других отладчиков. Но в моем готовом устройстве его не будет, но точно будет USB. Почему бы сразу не заложить возможность обновлять прошивку через USB? Лично я нахожу этот способ удобным. тем более что все равно у меня уже подключен шнурок по которому идет питание и USB Serial.

Давайте посмотрим как работает бутлоадер. Для начала на примере контроллеров AVR. Почему я о нем вспомнил? Я переходил с Arduino и подсознательно ожидал такого же поведения. Но в STM32 оказалось все по другому. Потому хочу рассказать о разнице этих двух микроконтроллеров.

Итак. В микроконтроллерах AVR ATMega под бутлоадер можно зарезервировать некоторое количество памяти ближе к концу флеша. С помощью fuse битов можно регулировать с какого адреса будет стартовать программа. Если бутлоадера нет - программа стартует с адреса 0x0000. Если бутлоадер есть - он запускается с некоторого другого адреса (скажем, в ATMega32 с 0x3C00, если размер бутлоадера выбран 2к).


Когда бутлоадер сделал свои дела он передает управление основной программе с адреса 0x0000. Т.е. программа всегда стартует с адреса 0x0000. Компилятор и линковщик работают с учетом того, что код будет находится в начале адресного пространства.

В микроконтроллерах STM32 все не так. Все программы стартуют с адреса 0x0800000. Бутлоадер не является чем-то таким особенным. Это такая же программа, которая стартует с того же самого начального адреса. В процессе работы бутлоадер может принять прошивку (через USB или UART, считать с флешки, принять со спутника, достать из подпространства, whatever...) и записать ее по адресам выше чем находится сам загрузчик. Ну и, конечно же, в конце своей работы передать управление основной программе.


Так вот при компиляции прошивки нужно знать куда же бутлоадер запишет прошивку и соответствующим образом скорректировать адреса.

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

Есть, правда, некоторые ограничения по схемотехнике. Тут я, к сожалению, не силен. ЯТП нужен подтягивающий резистор 1.5к для порта PA12 (он же USB D+). Это позволяет загрузчику в нужные моменты времени подключаться и отключаться от USB.

  • Теперь микроконтроллер готов ппрошиваться через USB загрузчик. Но ведь еще нужно саму прошивку подправить. А сделать нужно 2 вещи:
    • Указать линкеру стартовый адрес. В CooCox это делается в настройках проекта, вкладка Link, раздел Memory Areas, Адрес IROM1 Start Address. Бутлоадер занимает первые 8 килобайт, значит стартовый адрес прошивки будет 0x0800000 + 0x2000 = 0x08002000. Поле Size, наверное, тоже стоит уменьшить на 8к.
    • Где нибудь вначале программы перед инициализацией периферии сделать вызов

      NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x2000);

  • Заливатор прошивки можно взять из проекта stm32duino . В директории tools ищите скрипт под называнием maple_upload. Я пользовал только виндовую версию - maple_upload.bat.
  • Запускать так:

    "maple_upload.bat" COM20 2 1EAF:0003 "Path\To\Firmware.bin"
    Вместо COM20 нужно подставить свой порт куда прицепился микроконтроллер.

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

    1EAF:0003 - это VID и PID

    2 - это параметр AltID, который указывает что прошивку нужно заливать по адресу 0x08002000 (читать ).

  • Еще чуток нюансов. Перед тем как заливать прошивку нужно запустить бутлоадер. Самый простой способ - нажать кнопку ресет. После этого запустится загрузчик и несколько секунд будет ждать прошивку. Если в этот момент никто не запустил maple_upload, загрузчик передаст управление основной прошивке.

    Из-за этого может возникнуть неудобство. Если микроконтроллер заглючил и повис, то он уже не слушает порт. Следовательно он не может услышать ключевую последовательность и перегрузиться в бутлоадер. Тогда только ресет в помощь.

    На этом все. Надеюсь моя статья прольет свет на то, как работает загрузчик в STM32 и как можно загружать прошивку через USB порт. К сожалению порог вхождения по прежнему высок, но вдруг кому-то моя статья поможет его преодолеть.

    Этот клон Ардуино предлагает специальный бутлоадер, который позволяет заливать прошивку через USB, без использования внешних компонентов типа ST-Link или USB-UART переходника.

    Сегодня мне понадобилось поработать с голым контроллером из-под CooCox и без stm32duino. Но вот в чем проблема. Даже простая моргалка лампочкой влитая через этот бутлоадер не работает.

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

    Я ничего не имею против ST-Link и других отладчиков. Но в моем готовом устройстве его не будет, но точно будет USB. Почему бы сразу не заложить возможность обновлять прошивку через USB? Лично я нахожу этот способ удобным. тем более что все равно у меня уже подключен шнурок по которому идет питание и USB Serial.

    Давайте посмотрим как работает бутлоадер. Для начала на примере контроллеров AVR. Почему я о нем вспомнил? Я переходил с Arduino и подсознательно ожидал такого же поведения. Но в STM32 оказалось все по другому. Потому хочу рассказать о разнице этих двух микроконтроллеров.

    Итак. В микроконтроллерах AVR ATMega под бутлоадер можно зарезервировать некоторое количество памяти ближе к концу флеша. С помощью fuse битов можно регулировать с какого адреса будет стартовать программа. Если бутлоадера нет - программа стартует с адреса 0x0000. Если бутлоадер есть - он запускается с некоторого другого адреса (скажем, в ATMega32 с 0x3C00, если размер бутлоадера выбран 2к).

    Когда бутлоадер сделал свои дела он передает управление основной программе с адреса 0x0000. Т.е. программа всегда стартует с адреса 0x0000. Компилятор и линковщик работают с учетом того, что код будет находится в начале адресного пространства.

    В микроконтроллерах STM32 все не так. Все программы стартуют с адреса 0x0800000. Бутлоадер не является чем-то таким особенным. Это такая же программа, которая стартует с того же самого начального адреса. В процессе работы бутлоадер может принять прошивку (через USB или UART, считать с флешки, принять со спутника, достать из подпространства, whatever...) и записать ее по адресам выше чем находится сам загрузчик. Ну и, конечно же, в конце своей работы передать управление основной программе.


    Так вот при компиляции прошивки нужно знать куда же бутлоадер запишет прошивку и соответствующим образом скорректировать адреса.

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

    Есть, правда, некоторые ограничения по схемотехнике. Тут я, к сожалению, не силен. ЯТП нужен подтягивающий резистор 1.5к для порта PA12 (он же USB D+). Это позволяет загрузчику в нужные моменты времени подключаться и отключаться от USB.

  • Теперь микроконтроллер готов ппрошиваться через USB загрузчик. Но ведь еще нужно саму прошивку подправить. А сделать нужно 2 вещи:
    • Указать линкеру стартовый адрес. В CooCox это делается в настройках проекта, вкладка Link, раздел Memory Areas, Адрес IROM1 Start Address. Бутлоадер занимает первые 8 килобайт, значит стартовый адрес прошивки будет 0x0800000 + 0x2000 = 0x08002000. Поле Size, наверное, тоже стоит уменьшить на 8к.
    • Где нибудь вначале программы перед инициализацией периферии сделать вызов

      NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x2000);

      UPDATE 17.05.2018: В современной версии STM32Cube функции NVIC_SetVectorTable() нет. Вместо этого можно в файле system_stm32f1xx.c (или аналогичного для другого микроконтроллера) исправить дефайн VECT_TAB_OFFSET

  • Заливатор прошивки можно взять из проекта stm32duino . В директории tools ищите скрипт под называнием maple_upload. Я пользовал только виндовую версию - maple_upload.bat.
  • Запускать так:

    "maple_upload.bat" COM20 2 1EAF:0003 "Path\To\Firmware.bin"
    Вместо COM20 нужно подставить свой порт куда прицепился микроконтроллер.

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

    1EAF:0003 - это VID и PID

    2 - это параметр AltID, который указывает что прошивку нужно заливать по адресу 0x08002000 (читать ).

  • Еще чуток нюансов. Перед тем как заливать прошивку нужно запустить бутлоадер. Самый простой способ - нажать кнопку ресет. После этого запустится загрузчик и несколько секунд будет ждать прошивку. Если в этот момент никто не запустил maple_upload, загрузчик передаст управление основной прошивке.

    Из-за этого может возникнуть неудобство. Если микроконтроллер заглючил и повис, то он уже не слушает порт. Следовательно он не может услышать ключевую последовательность и перегрузиться в бутлоадер. Тогда только ресет в помощь.

    На этом все. Надеюсь моя статья прольет свет на то, как работает загрузчик в STM32 и как можно загружать прошивку через USB порт. К сожалению порог вхождения по прежнему высок, но вдруг кому-то моя статья поможет его преодолеть.