Почему STM32 не запускает программу после прошивки?
Обновлено Редакция GAW
У STM32F1 после каждого сброса аппаратно читаются выводы BOOT0 и BOOT1 (PB2), и по ним выбирается, какая память отображается на адрес 0x0000 0000. Только при BOOT0 = 0 там оказывается флеш-память с вашей программой.
Режимы загрузки STM32F1 (RM0008, табл. 9)
| BOOT1 | BOOT0 | Откуда стартует | Что увидите |
|---|---|---|---|
| любой | 0 | основная флеш-память | ваша программа |
| 0 | 1 | системная память | встроенный загрузчик ST, программа не работает |
| 1 | 1 | SRAM | случайный код или зависание |
RM0008 уточняет: уровни BOOT защёлкиваются на четвёртом фронте тактового сигнала после сброса и повторно читаются при выходе из Standby. Значит, переставить перемычку на работающей плате мало — нужен сброс.
Порядок проверки
- BOOT0 — после прошивки по UART верните его в 0; если вывод не подключён, поставьте резистор на землю.
- Сброс после записи — нажмите RESET, включите Run after programming в STM32CubeProgrammer или дайте команду
--start. - Кварц — если программа сразу ждёт готовности HSE, а кварц не запускается, она зависает до первой строки; разбор — в ответе «Почему не запускается кварц STM32».
- Отладочные выводы — если после прошивки пропала связь с ST-LINK, программа заняла PA13 и PA14: решение в ответе «ST-LINK перестал видеть STM32 после прошивки».
Режимы загрузки других семейств описаны в словаре на странице «Режим загрузки», перемычки Blue Pill — на странице «Blue Pill», встроенный загрузчик — в статье «Флеш-память и загрузчик STM32».
Похожие вопросы
Почему под отладчиком программа работает, а после сброса — нет?
Отладчик после загрузки обычно сам запускает программу с адреса из её таблицы векторов, не глядя на BOOT0. Отпустили отладчик и нажали RESET — кристалл заново читает BOOT0 и, если там 1, уходит в загрузчик. Вторая частая причина — программа ждёт отладчик, например выводит текст через semihosting.
Какой резистор ставить на BOOT0?
Резистор на землю, чтобы вывод не висел в воздухе, и перемычку или кнопку на питание для входа в загрузчик. На Blue Pill BOOT0 задаётся перемычкой через резистор 100 кОм — на своей плате можно сделать так же.
Программа стартует только иногда — тоже BOOT0?
Часто да: незадействованный BOOT0 ловит наводки, и уровень при сбросе случаен. Если BOOT0 подтянут надёжно, проверьте питание и запуск кварца — программа может зависать в ожидании готовности HSE.
Источники
- STMicroelectronics. RM0008 Reference manual STM32F101/F102/F103/F105/F107, Rev 21 (February 2021) — разд. 3.4, табл. 9: BOOT1 x / BOOT0 0 — основная флеш-память, BOOT1 0 / BOOT0 1 — системная память, BOOT1 1 / BOOT0 1 — SRAM; уровни BOOT защёлкиваются на 4-м фронте SYSCLK после сброса и заново считываются при выходе из Standby; после этого процессор берёт вершину стека с адреса 0x0000 0000 и начинает с 0x0000 0004
- STMicroelectronics. DS5319 STM32F103x8/STM32F103xB datasheet, Rev 20 (July 2025) — вывод BOOT0 — отдельный вход выбора режима загрузки; BOOT1 совмещён с PB2
- STMicroelectronics. UM2237 STM32CubeProgrammer software description, Rev 29 (November 2025) — опция Run after programming — запуск программы сразу после записи; разд. 3.2.7 — команда -s, --start [адрес] для запуска программы из командной строки
Нашли ошибку?
Смотрите также
- Режим загрузки STM32 (BOOT0, BOOT1)Выводы, выбирающие, откуда стартует STM32
- STM32 Blue PillSTM32F103C8T6: функции выводов, 5 В-выводы, питание, загрузка
- Flash и загрузчик STM32Страницы и секторы, BOOT0, системный загрузчик, AN3155, IAP, option bytes, RDP
- Почему STM32 не запускается от внешнего кварца?Генератор HSE не раскачивается: запас усиления, конденсаторы, частота
- Почему ST-LINK перестал подключаться к STM32 после прошивки?Программа заняла SWD или ушла в сон — подключаться под сбросом