Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Защита Flash из программы
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
AndreyKeil
Доброго времени суток всем!
Вопрос, думаю понятен из темы. В качестве примера взял образец кода из библиотеки версии "STM32F10x_StdPeriph_Lib_V3.5.0".
Проц STM32F103T8 тактируется от внешнего кварца. Нужно записать защиту в Option-байты. Опытным путем установил,при попытке записи в регистр OB->RDP процессор зависает.
Код
      /* Restore the last read protection Option Byte value */
             OB->RDP = (uint16_t)rdptmp;

У кого какие мысли по этому поводу?
Sagittarius
Цитата(AndreyKeil @ Mar 12 2012, 15:59) *
Проц STM32F103T8 тактируется от внешнего кварца. Нужно записать защиту в Option-байты. Опытным путем установил,при попытке записи в регистр OB->RDP процессор зависает. У кого какие мысли по этому поводу?

код, который производит запись расположен в ОЗУ?
прерывания запрещены?
запись в option key register разрешена (FLASH_OPTKEYR и т.д.) ?
AndreyKeil
Код расположен во FLASH
прерывания запрещены
запись в option_key register разрешена (проверял).
Единственное, что неверно указал, тактируется процессор от HSI еще до инициализации HSE и PLL.
Sagittarius
Цитата(AndreyKeil @ Mar 12 2012, 21:29) *
Код расположен во FLASH

на сколько понимаю (оптион не писал, писал только основную флеш) на время записи контроллер флеша блокируется, и проц не может читать дальнейшие команды. Функция, которая пишет во флеш должна быть в ОЗУ. Для IAR достаточно приписать __ramfunc при объявлении функции и он сам запихнет ее в ОЗУ.
AndreyKeil
В этой программе присутствует и запись в основную флеш. При этом, код расположен также во флеши. Все работает прекрасно, не глючит. laughing.gif
Там странная команда присутствует:
Цитата
OB->RDP = (uint16_t)rdptmp;

При выполнении этой команды вся флеш стирается... wacko.gif
В переменной rdptmp находится число 0xA5.
Sagittarius
Цитата(AndreyKeil @ Mar 12 2012, 22:08) *
В этой программе присутствует и запись в основную флеш. При этом, код расположен также во флеши. Все работает прекрасно, не глючит. laughing.gif
Там странная команда присутствует:

При выполнении этой команды вся флеш стирается... wacko.gif
В переменной 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 то какой это проект в примерах? интересно было бы глянуть что там и как работает.

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

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

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

AndreyKeil
Цитата(Alfa @ Mar 13 2012, 07:46) *
to AndreyKeil

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

Совершенно верно. Затирание флеша и происходит. Но именно этот код представлен в примерах от ST.
Пробовал закомментировать эту команду. Тогда подвисание происходит уже в процедуре
Код
FLASH_EnableWriteProtection(ProtectedPages)

в месте:
Код
OB->WRP0 = WRP0_Data;
Alfa
Цитата(AndreyKeil @ Mar 13 2012, 09:22) *
Совершенно верно. Затирание флеша и происходит. Но именно этот код представлен в примерах от ST.
Пробовал закомментировать эту команду. Тогда подвисание происходит уже в процедуре
Код
FLASH_EnableWriteProtection(ProtectedPages)

в месте:
Код
OB->WRP0 = WRP0_Data;


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

Для разлочки там предлагается два варианта. Один со стиранием флеша, другой - без.....
AndreyKeil
В №9 посте писал, что пробовал без стирания флеша. Тогда проц подвисает(или неизвестно что с ним происходит) при попытке записи в OPTION-байт. Запись, при этом, разрешена: бит OPTWRE взведен, бит OPTPG взведен, бит LOCK снят, все в регистре FLASH_CR
Прошелся отладчиком ST-LINK, в результате, по записи в OPTION байт, уходит в HARD_FAULT
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.