Перейти к содержанию

Почему STM32 не запускает программу после прошивки?

Обновлено Редакция GAW

У STM32F1 после каждого сброса аппаратно читаются выводы BOOT0 и BOOT1 (PB2), и по ним выбирается, какая память отображается на адрес 0x0000 0000. Только при BOOT0 = 0 там оказывается флеш-память с вашей программой.

Режимы загрузки STM32F1 (RM0008, табл. 9)

BOOT1BOOT0Откуда стартуетЧто увидите
любой0основная флеш-памятьваша программа
01системная памятьвстроенный загрузчик ST, программа не работает
11SRAMслучайный код или зависание

RM0008 уточняет: уровни BOOT защёлкиваются на четвёртом фронте тактового сигнала после сброса и повторно читаются при выходе из Standby. Значит, переставить перемычку на работающей плате мало — нужен сброс.

Порядок проверки

  1. BOOT0 — после прошивки по UART верните его в 0; если вывод не подключён, поставьте резистор на землю.
  2. Сброс после записи — нажмите RESET, включите Run after programming в STM32CubeProgrammer или дайте команду --start.
  3. Кварц — если программа сразу ждёт готовности HSE, а кварц не запускается, она зависает до первой строки; разбор — в ответе «Почему не запускается кварц STM32».
  4. Отладочные выводы — если после прошивки пропала связь с 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.

Источники

  1. 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
  2. STMicroelectronics. DS5319 STM32F103x8/STM32F103xB datasheet, Rev 20 (July 2025) — вывод BOOT0 — отдельный вход выбора режима загрузки; BOOT1 совмещён с PB2
  3. STMicroelectronics. UM2237 STM32CubeProgrammer software description, Rev 29 (November 2025) — опция Run after programming — запуск программы сразу после записи; разд. 3.2.7 — команда -s, --start [адрес] для запуска программы из командной строки

Нашли ошибку?