|
IAP программирование Option Bytes (STM32F1) |
|
|
|
Jan 17 2015, 07:04
|
Профессионал
    
Группа: Свой
Сообщений: 1 468
Регистрация: 28-03-10
Из: Беларусь
Пользователь №: 56 256

|
Здравствуйте. Создавал эту тему в разделе для начинающих, но там никто с подобным не сталкивался. Работаем по примерам от ST: Код if(FLASH_GetWriteProtectionOptionByte() != ~FLASH_WRProt_Pages0to1) { FLASH_Unlock(); FLASH_EraseOptionBytes(); FLASH_UserOptionByteConfig(OB_IWDG_SW, OB_STOP_RST, OB_STDBY_RST); FLASH_EnableWriteProtection(FLASH_WRProt_Pages0to1); NVIC_SystemReset();} Данный код работает как надо, т.е. по итогу мы получаем защиту от записи 0 и 1 страницы и прописанные User Bits, но смущает одна вещь. В дебагере IAR после NVIC_SystemReset(); указатель не прыгает в Reset, а продолжает дальше выполнение кода, почему? А теперь самый прикол, если написать вместо: if(FLASH_GetWriteProtectionOptionByte() != ~FLASH_WRProt_Pages0to1) любое другое условие,например: if(FLASH_GetWriteProtectionOptionByte() != FLASH_WRProt_Pages0to1) или такое u8 k=0; if(!k), то на NVIC_SystemReset(); дебаг прекращается и мы ловим защиту от чтения (причем защита от записи и User Bits при этом не устанавливаются). Как это можно объяснить? Спасибо.
|
|
|
|
|
 |
Ответов
(1 - 7)
|
Jan 19 2015, 07:31
|

Частый гость
 
Группа: Свой
Сообщений: 167
Регистрация: 25-12-09
Из: Минск
Пользователь №: 54 460

|
Цитата(Alt.F4 @ Jan 17 2015, 10:04)  if(FLASH_GetWriteProtectionOptionByte() != ~FLASH_WRProt_Pages0to1) Что по вашему должна вернуть функция FLASH_GetWriteProtectionOptionByte? Из описания функции: Returns the FLASH Write Protection Option Bytes Register value. Вы же результат сравниваете с адресом, условие не выполняется, запись не проиходит как и ресет.
|
|
|
|
|
Jan 20 2015, 15:53
|
Профессионал
    
Группа: Свой
Сообщений: 1 468
Регистрация: 28-03-10
Из: Беларусь
Пользователь №: 56 256

|
Заснял 2 минуты, вот ссылка на видео. 1. Дебаг по функциям библиотеки, показываю, что защита от записи не установилась, а все остальные позиции Option Byte прописались как надо. 2. Дебаг того же самого по дизассемблеру подвисает на самом интересном месте, но по итогу мы получаем тоже самое. 3. Пишем любое другое условие и ловит защиту от записи, причем без изменения других позиций Option Byte, магия? Спасибо. P.S. Чтобы обнулить Option Byte, необходимо изменить состояние Read Protection, поэтому в ST-Link Utility я сперва ее устанавливаю и затем сбрасываю.
|
|
|
|
|
Jan 20 2015, 19:57
|

Частый гость
 
Группа: Свой
Сообщений: 167
Регистрация: 25-12-09
Из: Минск
Пользователь №: 54 460

|
Цитата(Alt.F4 @ Jan 20 2015, 01:14)  Это шутка? Где Вы видите сравнение с адресом и почему Вы решили, что условие не выполняется, если я написал, что все прогоняю в дебагере??? Виноват, не те аргументы посмотрел. Тогда да, ситуация интересная, завтра попробую у себя воспроизвести, да и где-то был рабочий код.
|
|
|
|
|
Jan 21 2015, 07:28
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(Alt.F4 @ Jan 20 2015, 17:53)  Заснял 2 минуты, Посмотрел. Ничего не понял. Вы двигаете мышь быстрее, чем я соображаю. Содержимого регистров не видно, содержимое памяти вы тоже не смотрите, ходите по-прежнему по Сишному исходнику. У меня создается стойкое впечатление, что разобраться вы не хотите. Понятно же, что ваше условие на ход программы напрямую не влияет, значит причина разного поведения где-то глубже. Чтобы ее понять надо пройти по дизассемлированным командам, наблюдая за содержимым регистров и анализируя смысл каждой ассемблерной команды. Просто проскакав по вызовам библиотечных функций найти ее невозможно.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jan 21 2015, 19:31
|
Профессионал
    
Группа: Свой
Сообщений: 1 468
Регистрация: 28-03-10
Из: Беларусь
Пользователь №: 56 256

|
Уважаемый Сергей Борщ, спасибо большое, что помогли разобраться во всей магии установки опций!!! По итогу мы узнали, что: 1. Стирание Option Bytes (т.е. включение защиты от чтения) и запись нового значения RDP (отключение защиты от чтения) не приводит к стиранию флэш. Стирание происходит, только если новое значение RDP пишется после ресета. 2. В дебагере IAR NVIC_SystemReset(); всегда приводит к сбросу, однако IDE сама переносит точку останова на следующую функцию, поэтому при отладке мы этого не замечаем. 3. Если выставить неверное условие, как я писал в первом сообщении, то мы ловим защиту от чтения и не установку других значений Option Bytes по причине того, что запись во флэш очень длительный процесс и при ресете мы на него всегда попадаем, в итоге в Option Bytes все оказывается стерто.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|