Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: IAP программирование Option Bytes (STM32F1)
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Alt.F4
Здравствуйте.
Создавал эту тему в разделе для начинающих, но там никто с подобным не сталкивался. Работаем по примерам от 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 при этом не устанавливаются).
Как это можно объяснить?
Спасибо.
Integro
Цитата(Alt.F4 @ Jan 17 2015, 10:04) *
if(FLASH_GetWriteProtectionOptionByte() != ~FLASH_WRProt_Pages0to1)


Что по вашему должна вернуть функция FLASH_GetWriteProtectionOptionByte?
Из описания функции: Returns the FLASH Write Protection Option Bytes Register value.
Вы же результат сравниваете с адресом, условие не выполняется, запись не проиходит как и ресет.
Alt.F4
Цитата(Integro @ Jan 19 2015, 10:31) *
Что по вашему должна вернуть функция FLASH_GetWriteProtectionOptionByte?
Из описания функции: Returns the FLASH Write Protection Option Bytes Register value.
Вы же результат сравниваете с адресом, условие не выполняется, запись не проиходит как и ресет.
Это шутка? Где Вы видите сравнение с адресом и почему Вы решили, что условие не выполняется, если я написал, что все прогоняю в дебагере???
Alt.F4
Заснял 2 минуты, вот ссылка на видео.
1. Дебаг по функциям библиотеки, показываю, что защита от записи не установилась, а все остальные позиции Option Byte прописались как надо.
2. Дебаг того же самого по дизассемблеру подвисает на самом интересном месте, но по итогу мы получаем тоже самое.
3. Пишем любое другое условие и ловит защиту от записи, причем без изменения других позиций Option Byte, магия?
Спасибо.

P.S. Чтобы обнулить Option Byte, необходимо изменить состояние Read Protection, поэтому в ST-Link Utility я сперва ее устанавливаю и затем сбрасываю.
Golikov A.
а нет требования о последовательности команд при установке протекций? Просто когда отладчиком ходите там много разных обращений проходит, если этот блок разом проскакивать не будет лучше7
Integro
Цитата(Alt.F4 @ Jan 20 2015, 01:14) *
Это шутка? Где Вы видите сравнение с адресом и почему Вы решили, что условие не выполняется, если я написал, что все прогоняю в дебагере???

Виноват, не те аргументы посмотрел. Тогда да, ситуация интересная, завтра попробую у себя воспроизвести, да и где-то был рабочий код.
Сергей Борщ
Цитата(Alt.F4 @ Jan 20 2015, 17:53) *
Заснял 2 минуты,
Посмотрел. Ничего не понял. Вы двигаете мышь быстрее, чем я соображаю. Содержимого регистров не видно, содержимое памяти вы тоже не смотрите, ходите по-прежнему по Сишному исходнику. У меня создается стойкое впечатление, что разобраться вы не хотите. Понятно же, что ваше условие на ход программы напрямую не влияет, значит причина разного поведения где-то глубже. Чтобы ее понять надо пройти по дизассемлированным командам, наблюдая за содержимым регистров и анализируя смысл каждой ассемблерной команды. Просто проскакав по вызовам библиотечных функций найти ее невозможно.
Alt.F4
Уважаемый Сергей Борщ, спасибо большое, что помогли разобраться во всей магии установки опций!!!
По итогу мы узнали, что:
1. Стирание Option Bytes (т.е. включение защиты от чтения) и запись нового значения RDP (отключение защиты от чтения) не приводит к стиранию флэш. Стирание происходит, только если новое значение RDP пишется после ресета.
2. В дебагере IAR NVIC_SystemReset(); всегда приводит к сбросу, однако IDE сама переносит точку останова на следующую функцию, поэтому при отладке мы этого не замечаем.
3. Если выставить неверное условие, как я писал в первом сообщении, то мы ловим защиту от чтения и не установку других значений Option Bytes по причине того, что запись во флэш очень длительный процесс и при ресете мы на него всегда попадаем, в итоге в Option Bytes все оказывается стерто.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.