Байты конфигурации (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: аппаратный или программный запуск IWDG | WDG_SW |
| Stop и Standby | nRST_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).
Источники
- 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; новые значения действуют после системного сброса
- 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; область стирается и записывается целиком
- 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
Нашли ошибку?
Смотрите также
- Flash и загрузчик STM32Страницы и секторы, BOOT0, системный загрузчик, AN3155, IAP, option bytes, RDP
- Защита от чтения (RDP)Запрет чтения прошивки STM32 отладчиком и загрузчиком
- Сторожевой таймерWatchdog: сброс МК при зависании программы
- Детектор пониженного питанияBrown-out detector: сброс МК при просадке питания
- Карта флеш-памяти STM32Секторы и страницы, адрес → сектор, что стирать, CubeProgrammer и HAL