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

Как снять защиту от записи (WRP) с STM32F103?

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

Защита от записи (WRP) у STM32F1 запрещает стирать и программировать отдельные группы страниц флеш-памяти. Признак — программатор подключается, но стирание или запись заканчиваются ошибкой, а в регистре состояния флеш-памяти выставлен флаг ошибки защиты.

Два варианта снятия (PM0075, разд. 2.4.3)

ШагВариант 1: снять WRP, RDP = 0xA5Вариант 2: снять WRP, оставить защиту от чтения
1стереть всю область байтов конфигурациистереть всю область байтов конфигурации
2до сброса записать RDP = 0x00A5—
3системный сброс (после работы отладчиком — по питанию)системный сброс
Итог, если защиты чтения не былоWRP снята, программа сохраниласьWRP снята, но RDP = 0xFF — защита от чтения включилась
Итог, если защита чтения былаWRP снята, основная флеш-память стёртаWRP снята, защита от чтения осталась

Ключевая тонкость — значение RDP после стирания. По таблице 6 PM0075 незащищённой память считается только при RDP = 0xA5 с правильным дополнением; стёртое значение 0xFF — уже защита. Поэтому сам по себе шаг «стереть байты конфигурации» не стирает программу, но после сброса закрывает её от чтения. Массовое стирание по разд. 2.3 PM0075 происходит, только когда защита чтения меняется с «защищено» на «не защищено». Библиотека HAL от ST так и поступает: функция стирания байтов конфигурации запоминает уровень RDP и сразу записывает его обратно, до сброса (наш разбор кода HAL).

Как это сделать в STM32CubeProgrammer

  1. Подключитесь по SWD в режиме Connect under reset.
  2. На вкладке байтов конфигурации проверьте уровень защиты чтения. Если он 0 (0xA5), снимите галочки защиты страниц (WRP), оставьте RDP = 0xA5 и примените — по PM0075 изменение байтов, кроме защиты чтения, массового стирания не вызывает. Если уровень 1, учтите: его снятие сотрёт всю основную флеш-память.
  3. Отключите питание и подключитесь снова.

Байты конфигурации описаны в словаре на странице «Байты конфигурации (option bytes)», защита от чтения — на странице «Защита от чтения RDP», работа с программой — в статье «STM32CubeProgrammer и ST-LINK».

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

Можно ли снять WRP и сохранить прошивку?

Да, если защита чтения не была включена: сотрите байты конфигурации и, не сбрасывая микроконтроллер, запишите RDP = 0xA5 — действующая защита при этом не меняется с «защищено» на «не защищено», и массового стирания нет. Если сбросить чип между этими шагами, загрузится RDP = 0xFF, защита включится, и её последующее снятие сотрёт программу.

Откуда на новом чипе взялась защита от записи?

Её ставит программа или загрузчик, записав биты WRP, — так защищают собственный загрузчик от случайной перезаписи. На платах с перепаянными или б/у микросхемами защита может остаться от предыдущей прошивки.

Почему после снятия защиты отладчик снова не подключается?

Байты конфигурации перезагружаются только после сброса, а если защиту от чтения снимали при подключённом отладчике, PM0075 требует сброса по питанию. Отключите питание платы на пару секунд и подключитесь заново.

Источники

  1. STMicroelectronics. PM0075 STM32F10xxx Flash memory microcontrollers, programming manual (Doc ID 17863 Rev 2, August 2012) — разд. 2.4.2: защита от записи — страницами по 4 (low/medium density) или по 2 (high density, страницы 0–61); включается битами WRP[3:0] и системным сбросом; запись в защищённую страницу даёт флаг ошибки в FLASH_SR; разд. 2.3: массовое стирание выполняется, только когда защита чтения меняется с «защищено» на «не защищено», при изменении других байтов его нет; стёртое значение RDP защищает память; разд. 2.4.3 — два варианта снятия WRP: стереть байты, записать RDP 0x00A5, сброс — или только стереть байты и сбросить, оставив защиту от чтения; табл. 6 и примечание: стёртое значение RDP 0xFF означает защиту, стирание байтов само не стирает память; при снятии RDP с подключённым отладчиком нужен сброс по питанию
  2. STMicroelectronics. STM32CubeF1 HAL, stm32f1xx_hal_flash_ex.c (commit bd368aa) — HAL_FLASHEx_OBErase: сначала читает текущий уровень защиты чтения, затем стирает байты конфигурации и сразу записывает прежний уровень RDP обратно; этой функцией пользуется и снятие WRP (FLASH_OB_DisableWRP); новые байты загружаются после HAL_FLASH_OB_Launch (системный сброс)
  3. STMicroelectronics. UM2237 STM32CubeProgrammer software description, Rev 29 (November 2025) — вкладка и команда -ob для байтов конфигурации; разд. 3.2.17 — команда -rdu, --readunprotect: снять защиту от чтения, перевести RDP с уровня 1 на уровень 0

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