Режим загрузки STM32 (BOOT0, BOOT1)
На платах с STM32 почти всегда есть перемычка или кнопка BOOT0. Она решает, что запустится после сброса: ваша программа или встроенный загрузчик ST, через который прошивают микроконтроллер по UART без программатора.
Обновлено Редакция GAW
Выводы BOOT0 и BOOT1 — входы STM32, уровни которых при сбросе определяют режим загрузки: из какой памяти микроконтроллер начнёт выполнять код. У STM32F1 и STM32F4 режимов три (RM0008, табл. 9; RM0090, разд. 2.4):
| BOOT1 | BOOT0 | Откуда загрузка |
|---|---|---|
| любой | 0 | основная флеш-память — обычный запуск программы |
| 0 | 1 | системная память — встроенный загрузчик ST |
| 1 | 1 | встроенная SRAM |
Как это работает
Уровни выводов защёлкиваются на четвёртом фронте SYSCLK после сброса и ещё раз — при выходе из режима Standby, поэтому в Standby их тоже нужно держать в нужном состоянии. Выбранная память отображается на адрес 0x0000 0000: оттуда ядро берёт начальный указатель стека, а со следующего слова — адрес обработчика сброса. При загрузке из SRAM программа сама переносит таблицу векторов.
У STM32F103 BOOT0 — отдельный вывод, а BOOT1 совмещён с PB2 (DS5319, табл. 5): после защёлкивания PB2 работает как обычный порт. На платах вроде Blue Pill оба вывода выведены на перемычки.
Таблица выше — для STM32F1 и STM32F4. В более новых семействах вывода BOOT1 нет: его роль играет бит nBOOT1 в байтах конфигурации, а сам BOOT0 можно брать не с вывода, а из бита nBOOT0 — его включают битом nSWBOOT0 или nBOOT_SEL. Так устроены, например, STM32F3 (только nBOOT1), STM32L4, STM32G4 и STM32U0; точную схему для своего семейства смотрите на его странице и в справочном руководстве.
Зачем нужен режим загрузчика
Встроенный загрузчик позволяет прошить чистый микроконтроллер через USART1 адаптером USB–UART, без программатора SWD. Его записывает ST на производстве, и программа пользователя его не стирает, поэтому этот путь прошивки остаётся, пока доступен BOOT0. Протокол, интерфейсы загрузчика разных линеек и защита памяти разобраны в статье «Flash и загрузчик STM32», а способы подключения к компьютеру — в ответе «Как подключить STM32 к компьютеру».
Не путать с выводами обвязки загрузки ESP32: идея та же — уровень при сбросе выбирает режим, — но у ESP32 это обычные GPIO с собственными подтяжками, а у STM32F1 и F4 BOOT0 — отдельный вывод, который служит только для выбора режима. И не путать сами выводы с загрузчиком: BOOT0 лишь выбирает, какой код запустить.
Частые вопросы
Как запустить встроенный загрузчик STM32F103?
Установить BOOT0 = 1 и BOOT1 (вывод PB2) = 0 и сбросить микроконтроллер. Он стартует из системной памяти, где записан загрузчик ST, и ждёт команд по USART1 (выводы PA9 и PA10). После прошивки BOOT0 возвращают в 0 и снова сбрасывают, чтобы запустилась программа.
Почему STM32 то запускает программу, то нет?
Часто виноват неподключённый BOOT0: без резистора на землю его уровень случаен, и микроконтроллер стартует то из флеш-памяти, то из загрузчика. BOOT0 прижимают к земле резистором, а единицу подают перемычкой или кнопкой только для прошивки.
Есть ли BOOT0 у всех STM32?
Вывод есть, но в новых семействах его можно заменить битом в байтах конфигурации. Например, у STM32U0 при nBOOT_SEL = 1 режим берётся из бита nBOOT0, и с завода именно так и настроено — вывод BOOT0 не используется (RM0503, табл. 6 и 13). У STM32F1 и STM32F4 режим задают только выводы.
Источники
- STMicroelectronics. RM0008 Rev 21. Reference manual: STM32F101xx, STM32F102xx, STM32F103xx, STM32F105xx and STM32F107xx — разд. 3.4, табл. 9: BOOT1 = x, BOOT0 = 0 — основная флеш-память; 0 и 1 — системная память; 1 и 1 — встроенная SRAM; уровни защёлкиваются на 4-м фронте SYSCLK после сброса и снова читаются при выходе из Standby; выбранная память отображается на адрес 0x0000 0000, ядро берёт оттуда указатель стека и с 0x0000 0004 — вектор сброса; при загрузке из SRAM таблицу векторов переносят программно; у XL-density бит BFB2 позволяет стартовать из банка 2; встроенный загрузчик — USART1 (у XL-density и USART2, у connectivity line — CAN2 и USB DFU); разд. 3.3.3: стирание всей памяти не затрагивает информационный блок с системной памятью
- STMicroelectronics. RM0090 Rev 21 (June 2024). Reference manual: STM32F405/415, STM32F407/417, STM32F427/437 and STM32F429/439 — разд. 2.4: те же три режима выводами BOOT1 и BOOT0, защёлкивание на 4-м фронте SYSCLK после сброса
- STMicroelectronics. DS5319 Rev 20 (July 2025). STM32F103x8, STM32F103xB datasheet — табл. 5: BOOT0 — отдельный вывод, BOOT1 совмещён с PB2
- STMicroelectronics. RM0503 Rev 4. STM32U0 series advanced Arm-based 32-bit MCUs, reference manual — разд. 2.5, табл. 6: при nBOOT_SEL = 1 вместо вывода BOOT0 используется бит nBOOT0 байтов конфигурации; табл. 13: с завода nBOOT_SEL = 1 — вывод BOOT0 не используется
Нашли ошибку?
Смотрите также
- Flash и загрузчик STM32Страницы и секторы, BOOT0, системный загрузчик, AN3155, IAP, option bytes, RDP
- Загрузчик (bootloader)Прошивка МК без программатора через UART или USB
- STM32 Blue PillSTM32F103C8T6: функции выводов, 5 В-выводы, питание, загрузка
- Как подключить STM32 к компьютеру?Три пути: SWD-программатор, загрузчик по UART, USB DFU
- Вывод обвязки загрузкиGPIO, уровень которого при сбросе задаёт режим загрузки