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

Можно ли считать прошивку из STM32 с защитой от чтения?

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

Защита от чтения (Read Out Protection, RDP) задаётся байтом в области байтов конфигурации (option bytes). Пока она включена, флеш-память доступна только программе, которая выполняется из неё же. Отладчик по SWD или JTAG, встроенный загрузчик ST и код, загруженный в ОЗУ, получают отказ — у STM32F4 при попытке чтения возникает ошибка шины (RM0090, разд. 3.7.3). Ниже — поведение STM32F1 и STM32F4; у других семейств набор уровней и условия снятия защиты отличаются, подробности — в справочном руководстве конкретного семейства.

УровеньSTM32F1 (PM0075)STM32F4 (RM0090)Что можно
Без защитыRDP = 0xA5уровень 0: RDP = 0xAAчитать и писать отладчиком и загрузчиком
Защиталюбое другое значениеуровень 1: любое, кроме 0xAA и 0xCCтолько снять защиту — со стиранием флеш
Необратимая защитанетуровень 2: RDP = 0xCCничего: отладка выключена навсегда

Почему снятие защиты не помогает

Снять защиту разрешено — именно так «оживляют» микросхему, в которую записали защищённую прошивку. Но STM32 сам стирает основную флеш-память перед тем, как применить новое значение RDP: у STM32F1 запись кода 0x00A5 сначала выполняет полное стирание (PM0075, разд. 2.4.2), у STM32F4 переход с уровня 1 на 0 стирает флеш и резервную SRAM (RM0090, разд. 3.7.3). После этого читать нечего.

У STM32F1 есть ещё одна тонкость: стёртый байт защиты равен 0xFF, а это тоже значение «защищено» (PM0075, табл. 6). Поэтому простое стирание области байтов конфигурации защиту не снимает.

Когда это важно знать

  • Вы защищаете свою прошивку — включайте RDP на серийных платах; уровень 2 у STM32F4 оставляйте для случаев, когда обновлять прошивку будет только ваш собственный загрузчик.
  • Плата «не прошивается» после чужой прошивки — снимите защиту и прошейте заново: как это сделать в STM32CubeProgrammer, рассказано в статье «STM32CubeProgrammer: прошивка STM32 через ST-LINK и загрузчик».

Что ещё хранится в байтах конфигурации, объясняет термин «байты конфигурации», уровни защиты — термин «защита от чтения», загрузчик и режимы загрузки — статья «Flash-память и загрузчик STM32».

Похожие вопросы

Работает ли прошивка на защищённом STM32?

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

Сотрутся ли байты конфигурации при снятии защиты?

У STM32F4 по RM0090 полное стирание затрагивает только пользовательскую флеш-память и резервную SRAM; остальные байты конфигурации, включая защиту от записи, остаются как были, область OTP тоже не меняется.

Можно ли снять уровень 2 защиты на STM32F4, если отладчик больше не подключается?

Нет. По RM0090 уровень 2 необратим: JTAG и SWD отключены навсегда, загрузка из ОЗУ и встроенного загрузчика запрещена, байты конфигурации не меняются. Обновлять прошивку такой микросхемы может только загрузчик, заложенный в саму пользовательскую программу.

Источники

  1. STMicroelectronics. PM0075 (Doc ID 17863 Rev 2). STM32F10xxx Flash memory microcontrollers, programming manual — разд. 2.4.1 — защита включается байтом RDP и применяется после сброса; чтение флеш недоступно, кроме кода, запущенного из самой флеш без отладки; доступ к данным через JTAG, SWD, SWV, ETM и при загрузке из ОЗУ запрещён; страницы 0–3 (0–1 у high-density) защищены от записи; табл. 6 — защищено при любом значении, кроме пары 0xA5 и дополнения; стирание байтов конфигурации даёт 0xFF — защита остаётся; разд. 2.4.2 — запись 0x00A5 сначала выполняет полное стирание основной флеш, затем сброс по питанию; снять защиту можно и через загрузчик
  2. STMicroelectronics. RM0090 Reference manual: STM32F405/415, STM32F407/417, STM32F427/437 and STM32F429/439, Rev 21 (June 2024) — разд. 3.7.3 — уровень 0: 0xAA, уровень 1: любое другое значение (по умолчанию после стирания байтов конфигурации) — при подключённой отладке, загрузке из ОЗУ или из системного загрузчика доступа к флеш нет, ошибка шины; переход 1 → 0 стирает флеш и резервную SRAM; уровень 2: 0xCC — отключены JTAG, SWV, ETM, загрузка из ОЗУ и загрузчика, байты конфигурации больше не меняются, операция необратима

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