реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> IAP программирование Option Bytes (STM32F1)
Alt.F4
сообщение Jan 17 2015, 07:04
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 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 при этом не устанавливаются).
Как это можно объяснить?
Спасибо.
Go to the top of the page
 
+Quote Post
Integro
сообщение Jan 19 2015, 07:31
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 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.
Вы же результат сравниваете с адресом, условие не выполняется, запись не проиходит как и ресет.
Go to the top of the page
 
+Quote Post
Alt.F4
сообщение Jan 19 2015, 22:14
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 468
Регистрация: 28-03-10
Из: Беларусь
Пользователь №: 56 256



Цитата(Integro @ Jan 19 2015, 10:31) *
Что по вашему должна вернуть функция FLASH_GetWriteProtectionOptionByte?
Из описания функции: Returns the FLASH Write Protection Option Bytes Register value.
Вы же результат сравниваете с адресом, условие не выполняется, запись не проиходит как и ресет.
Это шутка? Где Вы видите сравнение с адресом и почему Вы решили, что условие не выполняется, если я написал, что все прогоняю в дебагере???
Go to the top of the page
 
+Quote Post
Alt.F4
сообщение Jan 20 2015, 15:53
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 468
Регистрация: 28-03-10
Из: Беларусь
Пользователь №: 56 256



Заснял 2 минуты, вот ссылка на видео.
1. Дебаг по функциям библиотеки, показываю, что защита от записи не установилась, а все остальные позиции Option Byte прописались как надо.
2. Дебаг того же самого по дизассемблеру подвисает на самом интересном месте, но по итогу мы получаем тоже самое.
3. Пишем любое другое условие и ловит защиту от записи, причем без изменения других позиций Option Byte, магия?
Спасибо.

P.S. Чтобы обнулить Option Byte, необходимо изменить состояние Read Protection, поэтому в ST-Link Utility я сперва ее устанавливаю и затем сбрасываю.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Jan 20 2015, 17:14
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



а нет требования о последовательности команд при установке протекций? Просто когда отладчиком ходите там много разных обращений проходит, если этот блок разом проскакивать не будет лучше7
Go to the top of the page
 
+Quote Post
Integro
сообщение Jan 20 2015, 19:57
Сообщение #6


Частый гость
**

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



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

Виноват, не те аргументы посмотрел. Тогда да, ситуация интересная, завтра попробую у себя воспроизвести, да и где-то был рабочий код.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 21 2015, 07:28
Сообщение #7


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
Alt.F4
сообщение Jan 21 2015, 19:31
Сообщение #8


Профессионал
*****

Группа: Свой
Сообщений: 1 468
Регистрация: 28-03-10
Из: Беларусь
Пользователь №: 56 256



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

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 03:22
Рейтинг@Mail.ru


Страница сгенерированна за 0.01573 секунд с 7
ELECTRONIX ©2004-2016