Как прошить STM32: полное руководство по прошивке микроконтроллеров

Программатор ST-Link подключён, а STM32CubeProgrammer выдаёт ошибку «No target connected» — чаще всего причина в обрыве линии SWDIO/SWCLK, отсутствии питания целевой платы или перепутанных контактах разъёма. Прошивка микроконтроллеров STM32 — задача, с которой сталкивается каждый разработчик встраиваемых систем, и способов записать прошивку в чип существует несколько: через отладочный интерфейс SWD, через встроенный UART-загрузчик, через USB DFU и даже через CAN.

В этом материале разберём, как прошить STM32 каждым из основных способов, какие инструменты понадобятся, как подготовить файл прошивки и что делать, если микроконтроллер не отвечает. Инструкция подходит для популярных серий STM32F1, STM32F4, STM32G0, STM32L4 и других линеек на ядрах Cortex-M.

Что понадобится для прошивки STM32

Минимальный набор зависит от выбранного способа прошивки. Для работы через SWD потребуется программатор — оригинальный ST-Link/V2, его совместимый клон или встроенный отладчик на отладочных платах Nucleo и Discovery. Для прошивки через UART-загрузчик достаточно любого USB-UART адаптера с уровнями 3,3 В, а для DFU-режима — только USB-кабель, если микроконтроллер поддерживает эту функцию.

Из программного обеспечения основным инструментом служит STM32CubeProgrammer — официальная бесплатная утилита от STMicroelectronics, которая объединяет все способы прошивки в одном интерфейсе. Альтернативы: STM32 ST-LINK Utility (устаревшая, но рабочая), OpenOCD для продвинутых сценариев и среды разработки вроде STM32CubeIDE, где прошивка загружается прямо из проекта.

  • 🔌 ST-Link или плата Nucleo/Discovery со встроенным отладчиком — для SWD
  • 🔧 USB-UART адаптер на 3,3 В (не 5 В!) — для прошивки через системный загрузчик
  • 💾 Файл прошивки в формате .hex, .bin или .elf
  • 💻 Установленный STM32CubeProgrammer и драйверы ST-Link

Подготовка: питание, подключение и драйверы

Перед подключением программатора убедитесь, что целевая плата запитана. ST-Link по умолчанию не питает целевое устройство — контакт VCC на разъёме служит только для измерения опорного напряжения. Подайте на плату 3,3 В от внешнего источника или с самой отладочной платы, если она это предусматривает.

Для SWD-подключения достаточно четырёх линий: SWDIO, SWCLK, GND и VTref (3,3 В). Линия NRST желательна, но не обязательна — она помогает подключаться к чипу, находящемуся в спящем режиме или с переназначенными отладочными пинами. Драйверы ST-Link устанавливаются автоматически вместе с STM32CubeProgrammer; при проблемах с определением устройства в Windows проверьте Диспетчер устройств.

⚠️ Внимание: никогда не подавайте на выводы STM32 напряжение выше 3,6 В (если иное не указано в datasheet конкретной модели). USB-UART адаптеры с логикой 5 В могут повредить входы микроконтроллера — используйте адаптер с переключателем уровней или согласование уровней.

☑️ Проверка перед прошивкой

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

Это основной и самый надёжный способ. Откройте STM32CubeProgrammer, в правом верхнем углу выберите тип подключения ST-LINK и нажмите кнопку Connect. Если соединение установлено, в нижней части окна появится информация о чипе: серия, объём flash-памяти и Device ID.

Далее перейдите на вкладку Erasing & Programming (иконка со стрелкой вниз), укажите путь к файлу прошивки через Browse и нажмите Start Programming. Для файлов .bin дополнительно задайте стартовый адрес — для большинства STM32 это 0x08000000. После завершения можно включить верификацию и опцию Run after programming, чтобы микроконтроллер сразу начал выполнять прошивку.

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

Если подключение не устанавливается, попробуйте в настройках соединения снизить частоту SWD, выбрать режим Under Reset и подключить линию NRST. Это помогает, когда прошивка в чипе сразу переводит пины SWD на другие функции или уводит процессор в сон.

Прошивка через UART-загрузчик (BOOT0)

Во все STM32 на заводе зашит системный загрузчик (bootloader), который активируется при определённом состоянии вывода BOOT0. Чтобы войти в режим загрузчика, подтяните BOOT0 к высокому уровню (на многих платах для этого есть джампер или кнопка) и перезапустите микроконтроллер сбросом или переподключением питания.

Подключите USB-UART адаптер к выводам системного UART — для большинства STM32F1 это PA9 (TX адаптера → PA10, RX адаптера → PA9, земли соединяются). Точные выводы загрузчика зависят от серии чипа: сверьтесь с официальным документом AN2606 от STMicroelectronics, где перечислены пины загрузчика для каждой линейки. В CubeProgrammer выберите тип подключения UART, укажите COM-порт и скорость (обычно 115200), затем подключайтесь и прошивайте аналогично SWD.

⚠️ Внимание: после прошивки через загрузчик не забудьте вернуть BOOT0 в низкий уровень (на землю). Иначе микроконтроллер при каждом включении будет стартовать в режиме загрузчика, а ваша прошивка не запустится.

Почему загрузчик не отвечает на UART

Частые причины: неверные выводы UART для данной серии (смотрите AN2606), перепутаны RX/TX, BOOT0 не подтянут к питанию на момент сброса, либо на линии UART уже висит другая периферия, мешающая автонастройке скорости. Также загрузчик использует чётность Even — CubeProgrammer выставляет её сам, но сторонние терминалы нужно настраивать вручную.

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

Многие серии STM32 (например, STM32F4, STM32F7, STM32L4, STM32G4) поддерживают режим USB DFU (Device Firmware Upgrade) прямо из системного загрузчика. Войдите в bootloader через BOOT0, подключите плату по USB к компьютеру — в системе появится устройство «STM32 BOOTLOADER». В CubeProgrammer выберите тип подключения USB и прошейте стандартным способом.

Обратите внимание: не все серии имеют DFU в заводском загрузчике. Например, популярные STM32F103 поддерживают только UART-загрузчик, и для прошивки по USB на них используются сторонние загрузчики вроде STM32duino-bootloader, которые сами записываются через SWD или UART.

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

Выбор метода зависит от имеющегося оборудования, серии чипа и задачи. Таблица ниже поможет сориентироваться.

СпособОборудованиеПлюсыОграничения
SWD (ST-Link)Программатор ST-LinkРаботает всегда, поддерживает отладкуНужен программатор
UART-загрузчикUSB-UART адаптер 3,3 ВДёшево, без программатораНужен BOOT0, нет отладки
USB DFUТолько USB-кабельНичего дополнительно не нужноЕсть не во всех сериях
Из CubeIDEST-LinkПрошивка одной кнопкой из проектаТребует полной IDE

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

Ошибка Error: No STM32 target found означает, что программатор не видит чип. Проверяйте по порядку: питание платы, целостность линий SWDIO/SWCLK, отсутствие замыканий и правильность подключения GND. Иногда помогает удержание кнопки RESET на плате в момент нажатия Connect.

Сообщение о защите от чтения (RDP, Readout Protection) говорит о том, что в чипе включена защита прошивки. Снять её можно через CubeProgrammer в разделе Option Bytes, установив уровень RDP в AA (Level 0) — при этом вся flash-память будет полностью стёрта, это штатное поведение защиты.

  • 🔄 Cannot connect — снизьте частоту SWD, используйте режим Connect Under Reset
  • 🛡️ RDP active — сбросьте уровень защиты в Option Bytes (память сотрётся)
  • 📍 Неверный адрес — для .bin укажите стартовый адрес 0x08000000
  • 🔌 DFU не определяется — проверьте кабель (нужен кабель с линиями данных) и драйверы

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

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

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

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

Для подавляющего большинства STM32 flash-память начинается с адреса 0x08000000. Исключения и особенности конкретной модели указаны в её reference manual.

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

Попробуйте режим подключения Under Reset с подключённой линией NRST. Если включена защита RDP уровня 1, сбросьте её через Option Bytes — память при этом очистится. Защита уровня 2 (RDP Level 2) необратима и отключается только производителем условно — фактически чип останется закрытым.

Чем отличаются форматы .hex, .bin и .elf?

Файл .hex содержит адреса записи внутри себя, .bin — это «голые» данные, для которых адрес задаётся вручную, а .elf помимо прошивки содержит отладочную информацию. CubeProgrammer работает со всеми тремя форматами.

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

Да, при установленном пакете поддержки STM32 (STM32duino) платы прошиваются через ST-Link, DFU или UART прямо из Arduino IDE — способ загрузки выбирается в настройках платы.