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

Защита Flash из программы

Доброго времени суток всем!

Вопрос, думаю понятен из темы. В качестве примера взял образец кода из библиотеки версии "STM32F10x_StdPeriph_Lib_V3.5.0".

Проц STM32F103T8 тактируется от внешнего кварца. Нужно записать защиту в Option-байты. Опытным путем установил,при попытке записи в регистр OB->RDP процессор зависает.

      /* Restore the last read protection Option Byte value */
             OB->RDP = (uint16_t)rdptmp;

У кого какие мысли по этому поводу?

asd.zip

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Проц STM32F103T8 тактируется от внешнего кварца. Нужно записать защиту в Option-байты. Опытным путем установил,при попытке записи в регистр OB->RDP процессор зависает. У кого какие мысли по этому поводу?

код, который производит запись расположен в ОЗУ?

прерывания запрещены?

запись в option key register разрешена (FLASH_OPTKEYR и т.д.) ?

 

Изменено пользователем Sagittarius

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Код расположен во FLASH

прерывания запрещены

запись в option_key register разрешена (проверял).

Единственное, что неверно указал, тактируется процессор от HSI еще до инициализации HSE и PLL.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Код расположен во FLASH

на сколько понимаю (оптион не писал, писал только основную флеш) на время записи контроллер флеша блокируется, и проц не может читать дальнейшие команды. Функция, которая пишет во флеш должна быть в ОЗУ. Для IAR достаточно приписать __ramfunc при объявлении функции и он сам запихнет ее в ОЗУ.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В этой программе присутствует и запись в основную флеш. При этом, код расположен также во флеши. Все работает прекрасно, не глючит. :laughing:

Там странная команда присутствует:

OB->RDP = (uint16_t)rdptmp;

При выполнении этой команды вся флеш стирается... :wacko:

В переменной rdptmp находится число 0xA5.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В этой программе присутствует и запись в основную флеш. При этом, код расположен также во флеши. Все работает прекрасно, не глючит. :laughing:

Там странная команда присутствует:

 

При выполнении этой команды вся флеш стирается... :wacko:

В переменной rdptmp находится число 0xA5.

странно это

http://www.st.com/internet/com/TECHNICAL_R.../CD00283419.pdf

Flash Programming Manual на STM32F1xxx, страница 10

 

During a write operation to the Flash memory, any attempt to read the Flash memory will

stall the bus. The read operation will proceed correctly once the write operation has

completed. This means that code or data fetches cannot be made while a write/erase

operation is ongoing.

 

если посмотреть отладчиком то где будет выполняемый код по записи в основную флеш?

Если все в IAR то какой это проект в примерах? интересно было бы глянуть что там и как работает.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если ходить отладчиком, то отладчик "отваливается" в месте, где уже указывал. После этого флеш становится недоступной по чтению. Мне приходится снимать это сторонним программатором, т.е. разрешать ститывание флеши.

 

Пример находится в любой библиотеке от ST, например: ...\STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Examples\FLASH\Write_Protection\main.c

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

to AndreyKeil

 

Затирание всей флеши происходит при попытке снять биты защиты от чтения... Может здесь собака порылась?

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

to AndreyKeil

 

Затирание всей флеши происходит при попытке снять биты защиты от чтения... Может здесь собака порылась?

Совершенно верно. Затирание флеша и происходит. Но именно этот код представлен в примерах от ST.

Пробовал закомментировать эту команду. Тогда подвисание происходит уже в процедуре

FLASH_EnableWriteProtection(ProtectedPages)

в месте:

 OB->WRP0 = WRP0_Data;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Совершенно верно. Затирание флеша и происходит. Но именно этот код представлен в примерах от ST.

Пробовал закомментировать эту команду. Тогда подвисание происходит уже в процедуре

FLASH_EnableWriteProtection(ProtectedPages)

в месте:

 OB->WRP0 = WRP0_Data;

 

Про залочку-разлочку почитайте PM0075 STM32F10xxx Flash memory microcontrollers...

 

Для разлочки там предлагается два варианта. Один со стиранием флеша, другой - без.....

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В №9 посте писал, что пробовал без стирания флеша. Тогда проц подвисает(или неизвестно что с ним происходит) при попытке записи в OPTION-байт. Запись, при этом, разрешена: бит OPTWRE взведен, бит OPTPG взведен, бит LOCK снят, все в регистре FLASH_CR

Прошелся отладчиком ST-LINK, в результате, по записи в OPTION байт, уходит в HARD_FAULT

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...