STM32 Flash Loader: прошивка микроконтроллера через встроенный загрузчик

Если STM32 Flash Loader Demonstrator выдаёт ошибку «No response from the target» или «Unrecognized device», в большинстве случаев причина не в неисправном чипе, а в неправильном уровне на выводе BOOT0 или перепутанных линиях TX/RX адаптера USB-UART. Проверку стоит начинать именно с этих двух пунктов, прежде чем подозревать повреждение микроконтроллера.

В микроконтроллеры STM32 компания STMicroelectronics на этапе производства записывает системный загрузчик (system memory bootloader) — небольшую программу в защищённой области памяти, которую невозможно стереть обычными средствами. Она позволяет прошить основную Flash-память без программатора ST-Link: достаточно недорогого преобразователя USB-UART и утилиты вроде STM32 Flash Loader Demonstrator или более современного STM32CubeProgrammer. Это удобно при серийной прошивке устройств, восстановлении «залоченных» плат и в ситуациях, когда отладочный интерфейс SWD недоступен или отключён в прошивке.

Что такое системный загрузчик STM32 и когда он нужен

Системный загрузчик — это заводская прошивка, хранящаяся в отдельной области System Memory. Микроконтроллер начинает выполнять её, если при старте вывод BOOT0 притянут к высокому уровню (логической единице). При низком уровне BOOT0 чип стартует из обычной пользовательской Flash-памяти. В некоторых семействах, например STM32F0 и STM32F4, поведение дополнительно зависит от вывода BOOT1 или от option bytes — точную схему для конкретной модели нужно смотреть в reference manual и в документе AN2606, где ST описывает загрузчики всех семейств.

В зависимости от серии чипа загрузчик умеет принимать прошивку через разные интерфейсы: UART (есть практически у всех), USB DFU (у многих F1, F3, F4, F7), I2C, SPI, а у новых линеек — CAN и даже FDCAN. Набор поддерживаемых интерфейсов и точные выводы для каждого конкретного MCU перечислены в AN2606 — это главный справочный документ по теме.

Типичные сценарии, когда без загрузчика не обойтись:

  • 🔧 восстановление платы, где прошивка отключила пины SWD или включила защиту от чтения;
  • 🏭 серийная прошивка устройств на производстве без покупки программаторов;
  • 🧪 прошивка самодельных плат, где разъём SWD просто не разведён;
  • 🔄 обновление прошивки готового изделия конечным пользователем через USB или UART.

Что понадобится для прошивки через UART

Минимальный набор для работы через классический STM32 Flash Loader по UART невелик. Вам потребуется преобразователь USB-UART с уровнями 3,3 В — на базе CP2102, CH340, FT232 или аналогичном чипе. Адаптеры с уровнями 5 В использовать нежелательно: хотя многие выводы STM32 толерантны к 5 В, это зависит от конкретного пина и серии, и безопаснее работать на 3,3 В.

Из программного обеспечения есть два основных варианта. Первый — устаревший, но всё ещё встречающийся Flash Loader Demonstrator (пакет UM0462), который работает только с UART. Второй — актуальный STM32CubeProgrammer, поддерживающий UART, USB DFU, ST-Link и другие интерфейсы. Для новых серий микроконтроллеров (например, STM32H7, STM32G0, STM32L5) старый Demonstrator не подходит — используйте CubeProgrammer.

⚠️ Внимание: линии TX и RX подключаются перекрёстно — TX адаптера к RX микроконтроллера и наоборот. Прямое соединение «TX к TX» — самая частая причина ошибки «No response from the target».

Типовая схема подключения для семейства STM32F1 (для других серий номера пинов уточняйте в AN2606):

  • 🔌 PA9 (USART1_TX) — к RX адаптера USB-UART;
  • 🔌 PA10 (USART1_RX) — к TX адаптера;
  • 🔌 GND адаптера — к GND платы (общий провод обязателен);
  • 🔌 BOOT0 — через перемычку или резистор на высокий уровень (3,3 В).

Пошаговая инструкция: прошивка через Flash Loader Demonstrator

Порядок действий одинаков для всех серий, отличаются только выводы и поддерживаемые скорости. Сначала переведите плату в режим загрузчика: установите BOOT0 в высокий уровень и подайте питание или нажмите Reset. Именно в момент старта чип опрашивает BOOT0 — переключение перемычки «на ходу» без сброса ничего не даст.

Далее запустите программу и выполните подключение. В Flash Loader Demonstrator на первом экране выберите COM-порт адаптера, скорость (обычно работают значения 9600–115200 бод; загрузчик определяет скорость автоматически по стартовому байту) и нажмите Next. Если связь установлена, программа покажет размер Flash и версию загрузчика. Затем выберите файл прошивки в формате .hex, .bin или .s19 и запустите запись кнопкой Next.

☑️ Проверка перед прошивкой STM32 через UART

Выполнено: 0 / 6

После завершения записи полезно включить верификацию — программа сравнит записанные данные с файлом. Затем верните BOOT0 в низкий уровень, нажмите Reset, и микроконтроллер стартует с новой прошивкой. Если программа поддерживает опцию Jump to the user program, можно запустить код прямо из загрузчика, не трогая перемычки.

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

Для современных проектов удобнее использовать STM32CubeProgrammer. После установки выберите в правом верхнем углу тип подключения: UART для последовательного порта или USB для режима DFU. Нажмите Connect — при успехе отобразится информация о чипе. Затем перейдите на вкладку Erasing & Programming, укажите файл, отметьте опцию верификации и нажмите Start Programming.

Режим USB DFU особенно удобен на платах, где выведен разъём USB, а UART-адаптера под рукой нет. Микроконтроллер в этом режиме определяется компьютером как USB-устройство «STM32 BOOTLOADER» или «STM Device in DFU Mode». Для Windows может потребоваться установка драйвера DFU — он входит в комплект CubeProgrammer. Учтите, что DFU поддерживают не все серии: например, у части STM32F1 загрузчик работает только по UART, поэтому сверяйтесь с AN2606 для вашей модели.

Почему загрузчик не виден по USB, хотя чип поддерживает DFU

Возможные причины: не подтянут BOOT0 при старте; используется «зарядный» USB-кабель без линий данных; на плате не разведены или не подключены линии D+/D- к микроконтроллеру; у части серий загрузчик требует внешний кварцевый резонатор (HSE) для работы USB — без него DFU не стартует. Проверьте эти пункты по очереди.

Сравнение инструментов для прошивки STM32

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

ИнструментИнтерфейсыСтатусКогда выбирать
Flash Loader DemonstratorUARTУстаревшийСтарые серии (F1, F2, L1), простые задачи
STM32CubeProgrammerUART, USB DFU, ST-Link, SPI, I2CАктуальныйУниверсальный выбор для всех серий
STM32CubeIDE / ST-Link UtilitySWD/JTAG (нужен ST-Link)АктуальныйОтладка и разработка
stm32flash (консольная)UARTСторонняя, открытаяАвтоматизация, Linux, скрипты

Для автоматизации прошивки в скриптах удобна консольная утилита stm32flash. Пример команды записи hex-файла:

stm32flash -w firmware.hex -v -g 0x0 /dev/ttyUSB0

Здесь флаг -w задаёт запись файла, -v включает верификацию, а -g 0x0 — запуск программы после прошивки. Порт указывается в соответствии с вашей системой: /dev/ttyUSB0 для Linux, COM3 и т.п. для Windows.

📊 Каким способом вы чаще всего прошиваете STM32?
Через ST-Link (SWD)
Через UART-загрузчик
Через USB DFU
Через Arduino/другие среды

Типичные ошибки и способы их устранения

Ошибка «No response from the target» означает, что программа не получила ответ от загрузчика. Проверяйте по порядку: правильность COM-порта, перекрёстное подключение TX/RX, наличие общего GND, уровень на BOOT0 и то, что сброс или подача питания произошли уже после установки перемычки. Также убедитесь, что порт не занят другой программой — например, открытым терминалом.

Сообщение «Unrecognized device» обычно говорит о том, что связь есть, но данные искажены. Возможные причины: слишком высокая скорость порта (попробуйте 9600 или 19200 бод), нестабильное питание, длинные или неэкранированные провода, а также адаптер с уровнями 5 В. Иногда помогает смена USB-порта или другой экземпляр адаптера — дешёвые клоны CH340 бывают капризны.

⚠️ Внимание: если в option bytes включена защита от чтения (RDP Level 1), загрузчик разрешит стереть Flash, но не даст прочитать её содержимое. Снятие защиты приводит к полному стиранию памяти — это штатное поведение, а не сбой.

Ещё одна ситуация: загрузчик отвечает, но запись обрывается на определённом адресе. Проверьте, что файл прошивки собран под правильный адрес начала Flash (для большинства STM32 это 0x08000000) и что размер прошивки не превышает объём памяти конкретной модификации чипа. У STM32 существуют версии с разным объёмом Flash при одинаковой маркировке корпуса.

Особенности для разных серий STM32

Хотя общий принцип одинаков, детали реализации загрузчика различаются между семействами. У STM32F1 загрузчик работает только через USART1 (пины PA9/PA10). У STM32F4 добавлены USB DFU, I2C, SPI и CAN, причём для USB часто требуется внешний кварц HSE. У новых серий STM32G0, STM32G4 и STM32H7 загрузчик поддерживает больше интерфейсов, а старый Flash Loader Demonstrator их уже не распознаёт — нужен CubeProgrammer.

Отдельный нюанс — серии с пустой Flash и специальными режимами: например, у некоторых STM32F0 есть «пустая проверка», когда чип сам стартует в загрузчик, если пользовательская Flash пуста, независимо от BOOT0. А у части моделей вывод BOOT0 объединён с другой функцией, и режим задаётся через option bytes. Все эти отличия подробно расписаны в AN2606 — держите этот документ под рукой при работе с новой серией.

⚠️ Внимание: не подавайте питание на плату одновременно от адаптера USB-UART и от внешнего источника без проверки схемы. Двойное питание может повредить стабилизатор платы или сам адаптер. Запитывайте устройство только из одного источника.

Часто задаваемые вопросы

Можно ли стереть или повредить заводской загрузчик STM32?

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

Чем заменить устаревший Flash Loader Demonstrator?

Официальная замена — STM32CubeProgrammer: он поддерживает UART, USB DFU, ST-Link и другие интерфейсы, работает со всеми современными сериями и доступен для Windows, Linux и macOS. Для автоматизации подойдёт консольная утилита stm32flash.

Почему программа не видит микроконтроллер по USB в режиме DFU?

Проверьте, что BOOT0 был в высоком уровне в момент подачи питания, кабель USB содержит линии данных (не «зарядный»), а ваша серия вообще поддерживает DFU — сверьтесь с AN2606. У части моделей для работы USB-загрузчика требуется внешний кварцевый резонатор HSE.

Нужно ли снимать защиту RDP перед прошивкой через загрузчик?

Запись новой прошивки при включённом RDP Level 1 возможна после полного стирания памяти — загрузчик выполнит его автоматически при снятии защиты. Чтение содержимого Flash при этом невозможно. Учтите, что RDP Level 2 — необратимый режим, отключить его нельзя.

Можно ли прошить STM32 без перемычки BOOT0?

Да, если ваша текущая прошивка умеет сама перезапускать чип в системный загрузчик (программный переход на адрес System Memory) — так реализуют обновление «по воздуху» или через USB в готовых устройствах. Также у серий с «пустой проверкой» чип с незапрограммированной Flash стартует в загрузчик автоматически. Конкретный адрес загрузчика и условия перехода зависят от семейства и указаны в AN2606.