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

Байты конфигурации (option bytes)

Некоторые настройки микроконтроллера должны действовать ещё до того, как программа начнёт выполняться, и сохраняться без питания: защита прошивки, режим сторожевого таймера, порог сброса по питанию. У STM32 они хранятся в отдельной маленькой области флеш-памяти — байтах конфигурации.

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

Байты конфигурации (option bytes) — небольшая область энергонезависимой памяти STM32, в которой хранятся настройки самого микроконтроллера, а не программы: защита от чтения, защита страниц или секторов от записи, режим сторожевого таймера IWDG, поведение при входе в режимы Stop и Standby, у STM32F4 — порог детектора пониженного питания. Схема загрузки байтов конфигурации (option byte loader, OBL) читает их при каждом системном сбросе, поэтому настройки начинают действовать ещё до первой команды программы.

Что в них хранится

STM32F103 (PM0075)STM32F405/407 (RM0090)
Адрес0x1FFF F800, 16 байт0x1FFF C000
Защита от чтениябайт RDPбайт RDP, три уровня
Защита от записиWRP0–WRP3, по группам страницnWRP, по секторам 0–11
Сторожевой таймерWDG_SW: аппаратный или программный запуск IWDGWDG_SW
Stop и StandbynRST_STOP, nRST_STDBY: сброс вместо входа в режимто же
Порог BORнетBOR_LEV: три уровня или выключен
Данные пользователяData0, Data1нет

Если бит WDG_SW равен нулю, сторожевой таймер запускается аппаратно сразу после сброса и программа не может его остановить. Биты nRST_STOP и nRST_STDBY позволяют вместо входа в режим пониженного потребления получить сброс (RM0008, разд. 7.1.1).

Как их меняют

У STM32F1 байты хранятся парами с дополнениями: при загрузке схема сверяет байт и его дополнение, а при ошибке ставит флаг OPTERR и считает байт равным 0xFF. Для записи после разблокировки флеш-памяти те же ключи KEY1 и KEY2 записывают в регистр FLASH_OPTKEYR, затем область стирают битом OPTER и записывают полусловами с битом OPTPG; дополнение контроллер вычисляет сам (PM0075, разд. 2.3.5). У STM32F4 порядок другой: ключи OPTKEY1 = 0x0819 2A3B и OPTKEY2 = 0x4C5D 6E7F снимают блокировку OPTLOCK, новое значение пишут в FLASH_OPTCR и запускают запись битом OPTSTRT — контроллер сам стирает и перезаписывает всю область (RM0090, разд. 3.7.2).

На практике байты меняют программатором или утилитой — например, STM32CubeProgrammer, в том числе через встроенный загрузчик, — а не из своей программы. Подробная последовательность, защита от записи и уровни защиты разобраны в статье «Flash и загрузчик STM32», а адреса страниц и секторов показывает калькулятор секторов флеш-памяти STM32.

Не путать с фьюзами AVR и eFuse: фьюзы AVR перезаписываются, но задают другие вещи — источник тактирования, размер загрузчика, а eFuse у ESP32 программируются однократно. Байты конфигурации STM32 можно стирать и записывать заново, пока защита от чтения уровня 2 у STM32F4 не запретила их менять.

Частые вопросы

Где хранятся байты конфигурации STM32F103?

В информационном блоке флеш-памяти, 16 байт с адреса 0x1FFF F800. Каждый из восьми байтов хранится вместе со своим дополнением, а при сбросе их копию загружают в регистры FLASH_OBR и FLASH_WRPR — оттуда программа и читает текущие настройки (PM0075, разд. 2.5).

Почему после изменения байтов ничего не поменялось?

Новые значения загружаются только при сбросе: у STM32F1 и STM32F4 — при системном сбросе. Если меняли защиту от чтения при подключённом отладчике, нужен сброс по питанию — так требуют и PM0075, и RM0090.

Чем опасно стирание байтов конфигурации STM32F1?

Стёртый байт RDP равен 0xFF, а это значение защиты от чтения. Поэтому, меняя любые байты, после стирания области нужно снова записать RDP = 0x00A5, иначе после сброса флеш-память окажется защищённой (PM0075, разд. 2.3.5 и 2.4).

Источники

  1. STMicroelectronics. PM0075 Rev 2 (August 2012). STM32F10xxx Flash memory microcontrollers, programming manual — разд. 2.3.5: восемь байтов — 4 защиты от записи, 1 защиты от чтения, 1 настроек, 2 данных пользователя; доступ через ключи KEY1 и KEY2 в FLASH_OPTKEYR (бит OPTWRE), запись полусловом с битом OPTPG, дополнение FPEC вычисляет сам, стирание битом OPTER; разд. 2.5, табл. 7–9: адреса 0x1FFF F800–0x1FFF F80F, байты RDP, USER (WDG_SW, nRST_STOP, nRST_STDBY), Data0, Data1, WRP0–WRP3; загрузчик OBL читает их при каждом системном сбросе в FLASH_OBR и FLASH_WRPR, при несовпадении с дополнением — флаг OPTERR и байт принимается равным 0xFF; новые значения действуют после системного сброса
  2. STMicroelectronics. RM0090 Rev 21 (June 2024). Reference manual: STM32F405/415, STM32F407/417, STM32F427/437 and STM32F429/439 — разд. 3.7.1, табл. 15 и 16: байты по адресу 0x1FFF C000 — RDP, USER (nRST_STDBY, nRST_STOP, WDG_SW), BOR_LEV, nWRP секторов 0–11; разд. 3.7.2: ключи OPTKEY1 = 0x0819 2A3B и OPTKEY2 = 0x4C5D 6E7F снимают бит OPTLOCK, значение пишут в FLASH_OPTCR и запускают битом OPTSTRT; область стирается и записывается целиком
  3. STMicroelectronics. RM0008 Rev 21. Reference manual: STM32F101xx, STM32F102xx, STM32F103xx, STM32F105xx and STM32F107xx — разд. 3.3.3, табл. 4–8: Option bytes — 16 байт с адреса 0x1FFF F800 в информационном блоке; разд. 7.1.1: сброс вместо входа в Stop или Standby по битам nRST_STOP и nRST_STDBY

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