Плата на базе STM32F103C8T6 («Blue Pill») отказывается определяться по USB, а встроенная прошивка уже не работает — типичная ситуация, когда микроконтроллер нужно прошить внешним программатором через интерфейс SWD. У STM32 нет единственного «правильного» способа записи прошивки: выбор зависит от того, есть ли у вас отладчик, свободный UART, рабочий USB-порт и в каком состоянии находится сам чип.

В этой статье разберём все основные способы прошивки микроконтроллеров STM32: через отладчики ST-Link и J-Link, через встроенный заводской загрузчик по UART и USB (DFU), а также через open-source инструменты вроде OpenOCD. Для каждого метода укажем, какое оборудование понадобится, каким софтом пользоваться и в каких ситуациях способ предпочтителен.

Основные способы прошивки STM32

Микроконтроллеры STM32 поддерживают несколько независимых каналов записи прошивки, и это заложено на уровне архитектуры. Первый класс способов — отладочные интерфейсы SWD и JTAG, которые работают всегда, независимо от содержимого памяти чипа. Второй класс — фирменный bootloader, зашитый в системную память на заводе: он позволяет прошить контроллер через UART, USB, а у некоторых серий — через CAN, I2C или SPI.

Какой именно интерфейс активирует заводской загрузчик, зависит от конкретной серии и даже ревизии чипа. Точный перечень поддерживаемых интерфейсов для вашей модели указан в документе AN2606 от STMicroelectronics — сверьтесь с ним перед подключением.

  • 🔌 SWD/JTAG — прошивка и отладка через ST-Link, J-Link или клоны; универсальный способ для разработки.
  • 🔄 UART-загрузчик — прошивка через USB-UART адаптер с переводом чипа в режим bootloader.
  • 💾 USB DFU — прошивка напрямую по USB без дополнительного железа, если серия это поддерживает.
  • 🛠️ OpenOCD / pyOCD — открытые инструменты для тех, кто работает без фирменных утилит ST.

Самый распространённый вариант для разработчика — отладчик ST-Link в паре с официальной утилитой STM32CubeProgrammer. Подойдёт как фирменный ST-Link/V2, так и недорогой клон с AliExpress: для базовой прошивки по SWD их возможности одинаковы. К микроконтроллеру подключаются четыре линии: SWDIO, SWCLK, GND и питание 3.3V; линию NRST желательно подключить тоже — она помогает, когда чип «завис» или ножки SWD переназначены прошивкой.

Порядок действий в STM32CubeProgrammer простой: запустите программу, выберите тип подключения ST-LINK, нажмите Connect, затем откройте файл прошивки (.hex, .bin или .elf) и нажмите Download. Для файла .bin дополнительно укажите адрес загрузки — обычно это начало Flash-памяти 0x08000000.

☑️ Прошивка STM32 через ST-Link

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

Если утилита не видит чип, проверьте три вещи: целостность питания 3.3 В, правильность распайки SWD и не включена ли защита чтения RDP. При активированной защите уровня 1 чип прошивается только после полного стирания — CubeProgrammer предложит это сделать автоматически при снятии защиты.

⚠️ Внимание: не подавайте питание на плату одновременно от ST-Link и от внешнего источника, если не уверены в схеме — встречное питание может вывести из строя стабилизатор или сам программатор.

Кроме ST-Link, с STM32 работают и другие отладчики. J-Link от Segger — профессиональный инструмент с собственным пакетом утилит J-Flash и надёжной поддержкой в IDE. Для разовых задач это избыточно, но в командной разработке J-Link ценят за стабильность и скорость.

Ещё один вариант — отладчики стандарта CMSIS-DAP (DAP-Link): они дешевы, определяются системой без драйверов и поддерживаются в Keil, OpenOCD и pyOCD. Также популярную отладочную плату Nucleo можно использовать как программатор для внешних плат: на ней стоит встроенный ST-Link, который выведен на разъём и прошивает сторонние чипы после снятия перемычек.

📊 Каким программатором вы прошиваете STM32?
ST-Link (оригинал или клон)
J-Link
USB-UART через bootloader
USB DFU без программатора

Прошивка через встроенный bootloader: UART и USB DFU

Если отладчика под рукой нет, STM32 можно прошить через заводской загрузчик. Для активации режима ножку BOOT0 подтягивают к высокому уровню (подают логическую единицу), после чего чип перезагружают. Дальше возможны два сценария в зависимости от серии микроконтроллера.

UART-вариант работает практически на всех STM32: понадобится любой USB-UART адаптер с уровнями 3.3 В. Подключите его к выводам загрузчика (для многих серий это PA9/PA10, но точные пины смотрите в AN2606 для вашей модели), затем прошейте чип через STM32CubeProgrammer, выбрав тип подключения UART, или через консольную утилиту stm32flash.

USB DFU доступен на сериях с аппаратным USB (например, STM32F4, STM32F7, STM32L4 и других — уточняйте по документации). В этом режиме плата подключается к компьютеру напрямую кабелем USB и определяется как устройство STM32 BOOTLOADER. Прошивка выполняется тем же CubeProgrammer (режим USB) или утилитой dfu-util:

dfu-util -a 0 -s 0x08000000:leave -D firmware.bin
⚠️ Внимание: USB-UART адаптер должен работать с логическими уровнями 3.3 В. Подача 5-вольтовых уровней на входы STM32 может повредить порт микроконтроллера — убедитесь, что адаптер переключён на 3.3 В или используйте преобразователь уровней.
💡

После прошивки через bootloader верните BOOT0 на низкий уровень и перезагрузите плату — иначе чип снова стартует в режиме загрузчика, а ваша прошивка не запустится.

Сравнение способов прошивки

Чтобы выбрать подходящий метод, удобно свести их ключевые параметры в одну таблицу. Учитывайте, что поддержка DFU и конкретных UART-пинов зависит от серии чипа.

СпособОборудованиеСофтОтладкаКогда выбирать
SWD (ST-Link)ST-Link или клонSTM32CubeProgrammerДаРазработка и регулярная прошивка
SWD (J-Link)J-LinkJ-Flash, IDEДаПрофессиональная разработка
UART bootloaderUSB-UART адаптерCubeProgrammer, stm32flashНетНет отладчика, есть UART
USB DFUТолько USB-кабельCubeProgrammer, dfu-utilНетСерии с аппаратным USB
OpenOCD/pyOCDST-Link, CMSIS-DAPКонсольные утилитыДаАвтоматизация, Linux-окружение

Из таблицы видно главное различие: только отладочные интерфейсы (SWD) дают возможность не просто записать прошивку, но и отлаживать её — ставить точки останова, смотреть регистры и память. Загрузчики годятся исключительно для записи готового бинарника.

💡

Для разработки берите ST-Link — это единственный недорогой способ получить и прошивку, и полноценную отладку. Bootloader по UART или DFU оставьте как запасной вариант и для серийного обновления прошивок у конечного пользователя.

Прошивка через OpenOCD и из среды разработки

Тем, кто работает в Linux или строит автоматизированный конвейер сборки, удобнее консольные инструменты. OpenOCD поддерживает ST-Link и CMSIS-DAP и прошивает чип одной командой:

openocd -f interface/stlink.cfg -f target/stm32f1x.cfg -c "program firmware.elf verify reset exit"

Конфигурационный файл цели (stm32f1x.cfg, stm32f4x.cfg и т.д.) подбирается под вашу серию — они входят в стандартную поставку OpenOCD. Команда program выполняет запись, верификацию и сброс, то есть полный цикл за один запуск.

Если вы пишете код в STM32CubeIDE, отдельная прошивка вообще не требуется: среда сама собирает проект и загружает его через подключенный ST-Link по кнопке Run или Debug. Аналогично работают Keil MDK и IAR Embedded Workbench. Популярная у любителей платформа Arduino IDE с ядром STM32 тоже умеет прошивать платы и через ST-Link, и через DFU, и через UART — способ выбирается в меню инструментов платы.

Что делать, если чип «залочен» и не подключается по SWD

Такое бывает, когда прошивка отключила пины SWD или перевела чип в спящий режим сразу после старта. Помогает подключение линии NRST к программатору и выбор режима Connect Under Reset в STM32CubeProgrammer: утилита удерживает чип в сбросе и успевает подключиться до старта пользовательского кода. Если активирована защита RDP уровня 1, снимите её через CubeProgrammer — память при этом будет полностью стёрта, это штатное поведение. Защита уровня 2 необратима: чип останется доступным только для исполнения уже записанного кода.

Типичные ошибки при прошивке и их решение

Большинство проблем при прошивке STM32 сводится к нескольким повторяющимся причинам. Разберём, что проверять в первую очередь, если чип не прошивается или не запускается после записи.

  • 🔍 «No target connected» — проверьте распайку SWDIO/SWCLK, питание платы и попробуйте режим Connect Under Reset.
  • Чип прошивается, но не стартует — убедитесь, что BOOT0 возвращён на низкий уровень, а прошивка собрана под правильный адрес начала Flash.
  • 🔒 Ошибка записи при активном RDP — снимите защиту чтения через CubeProgrammer, память будет стёрта автоматически.
  • 🔁 DFU-устройство не определяется — проверьте кабель (нужен кабель с линиями данных), драйверы и то, что чип действительно в режиме bootloader.

Отдельный частый случай — клоны ST-Link с устаревшей прошивкой. CubeProgrammer может отказаться с ними работать или потребовать обновления firmware программатора. Обновление выполняется штатной утилитой ST-Link Upgrade, но на некоторых клонах процедура недоступна — тогда используйте OpenOCD, который менее требователен к версии прошивки отладчика.

⚠️ Внимание: режим защиты RDP Level 2 необратим — после его активации чип невозможно ни прошить, ни отладить, доступ остаётся только к выполнению уже записанной программы. Не включайте этот уровень на этапе разработки и экспериментов.
💡

Держите под рукой оба инструмента: STM32CubeProgrammer для диагностики и работы с option bytes, а OpenOCD или stm32flash — для автоматизации и случаев, когда фирменная утилита капризничает с клоном программатора.

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

Можно ли прошить STM32 без программатора?

Да, через встроенный заводской bootloader. Для серий с аппаратным USB достаточно обычного USB-кабеля (режим DFU), для остальных понадобится недорогой USB-UART адаптер. Перед прошивкой чип переводится в режим загрузчика подачей высокого уровня на вывод BOOT0. Перечень интерфейсов загрузчика для конкретной модели смотрите в документе AN2606.

Чем отличается ST-Link от J-Link?

Оба — отладчики по интерфейсам SWD/JTAG. ST-Link дешевле, штатно поддерживается экосистемой STM32 и достаточен для большинства задач. J-Link дороже, но предлагает более развитый софт и стабильную работу в профессиональных IDE. Для любительской разработки разница практически не ощущается.

Какой адрес указывать при прошивке .bin файла?

Для подавляющего большинства STM32 Flash-память начинается с адреса 0x08000000 — его и указывают при загрузке бинарного файла без метаданных. Файлы форматов .hex и .elf уже содержат адреса внутри, поэтому для них ничего вводить не нужно. Исключения возможны при использовании кастомных загрузчиков со смещением — тогда адрес задаётся документацией на этот загрузчик.

Почему CubeProgrammer не видит чип по SWD?

Частые причины: ошибка в распайке SWDIO/SWCLK, отсутствие питания целевой платы, переназначение отладочных пинов текущей прошивкой или включённая защита RDP. Подключите линию NRST и используйте режим Connect Under Reset — он решает большинство случаев «невидимого» чипа.

Можно ли прошить STM32 из Arduino IDE?

Да, после установки ядра STM32 для Arduino. В настройках платы выбирается способ загрузки: ST-Link, DFU или UART. Учтите, что для DFU и UART плата должна быть переведена в режим bootloader, а для ST-Link достаточно подключённого отладчика.