|
IAP программирование Option Bytes (STM32F1) |
|
|
3 страниц
1 2 3 >
|
 |
Ответов
(1 - 14)
|
Jan 15 2015, 08:40
|

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

|
Цитата(Alt.F4 @ Jan 15 2015, 09:31)  Никак не получается программно изменить Option Bytes. Использую примеры ST Может именно поэтому? Я писал по документации, у меня все пишется: Код bool flash::rewrite_option_bytes(OB_TypeDef const * new_values) { FLASH->OPTKEYR = 0x45670123; FLASH->OPTKEYR = 0xCDEF89AB; if(!(FLASH->CR & FLASH_CR_OPTWRE)) return false; FLASH->CR |= FLASH_CR_OPTER; FLASH->CR |= FLASH_CR_STRT; if(!wait(PAGE_ERASE_TIMEOUT)) return false; uint16_t const * pNew = (uint16_t const *)new_values; uint16_t * pOld = (uint16_t *)OB; for(uint_fast8_t i = 0; i < sizeof(*OB) / sizeof(uint16_t); ++i) { if((*pNew & 0xFF) != (*pOld & 0xFF)) { FLASH->CR = FLASH_CR_OPTPG; *pOld = *pNew; wait(); FLASH->CR = 0; if((*pNew & 0xFF) != (*pOld & 0xFF)) return false; } pNew++; pOld++; } return true; } Цитата(Alt.F4 @ Jan 15 2015, 09:31)  Если перед записью добавить FLASH_EraseOptionBytes(), то каким-то чудесным образом включается защита от чтения Она включается полностью в соответствии с документацией. "Чтение документации вслух - 100 евро/час".
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jan 15 2015, 09:42
|
Профессионал
    
Группа: Свой
Сообщений: 1 468
Регистрация: 28-03-10
Из: Беларусь
Пользователь №: 56 256

|
Хочется использовать стандартную библиотеку, чтобы код был максимально читабелен и была высокая переносимость. Цитата Она включается полностью в соответствии с документацией. А вот и неправда, в описании сказано "This functions erases all option bytes except the Read protection (RDP)." Т.е. она просто не затрагивает Read protection, да и в исходниках видно, что идет проверка, установлена ли защита и после стирания ячеек, она снова устанавливается, если была. Еще вопрос, почему все байты продублированы с инверсией? При записи значений, они автоматически инвертируются? Спасибо.
|
|
|
|
|
Jan 15 2015, 10:54
|

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

|
Цитата(Alt.F4 @ Jan 15 2015, 11:42)  Хочется использовать стандартную библиотеку, чтобы код был максимально читабелен и была высокая переносимость. Мыши плакали, кололись... Про читабельность вообще молчу - экран исходника на действие, которое можно описать одной строкой. Переносимость тоже под вопросом. Цитата(Alt.F4 @ Jan 15 2015, 11:42)  А вот и неправда, в описании сказано "This functions erases all option bytes except the Read protection (RDP)." В описании к чему? К библиотеке? Ну и продолжайте топтаться по граблям. Потому что в описании на процессор сказано, что Option Bytes стираются все целиком, что стертое состояние байтов RDP означает включенную защиту и попытка переписать их в состояние "Защита отключена" приводит к полному стиранию флеша перед записью нового значения. Но читать документацию - это для слабых. Цитата(Alt.F4 @ Jan 15 2015, 11:42)  Еще вопрос, почему все байты продублированы с инверсией? При записи значений, они автоматически инвертируются? "Чтение документации вслух - 100 евро в час". STM32F100xx value line Flash programming
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jan 16 2015, 11:37
|
Профессионал
    
Группа: Свой
Сообщений: 1 468
Регистрация: 28-03-10
Из: Беларусь
Пользователь №: 56 256

|
Да, в доке написано, что при стирании Option Bytes включается Read Protection, а при выключении этой защиты стирается флэш. Однако проведя множество экспериментов удалось определить, что функция FLASH_EraseOptionBytes() работает как сказано в описании и не включает защиту от чтения при стирании Option Bytes, но есть один момент.
if(FLASH_GetWriteProtectionOptionByte() != ~FLASH_WRProt_Pages0to1) { FLASH_Unlock(); FLASH_EraseOptionBytes(); FLASH_EnableWriteProtection(FLASH_WRProt_Pages0to1); NVIC_SystemReset();}
Приведенный выше листинг работает правильно и в результате мы получаем выключенную защиту от чтения и включенную защиту от записи. Правда немного смущает, что: 1) в дебагере IAR после NVIC_SystemReset() указатель не прыгает в Reset, а продолжает дальше выполнение кода (Почему?) 2) в остальных ячейках nWRP1-nWRP3 (в nWRP0 и WRP0 все верно) записаны 0xFF, хотя по идее там автоматом должна выставляться инверсия 0x00.
И самый изюм всего, если написать неверное условие (например, if(FLASH_GetWriteProtectionOptionByte() != 0), то на NVIC_SystemReset(); дебаг прекращается и мы ловим защиту от чтения. Как это можно объяснить? Спасибо.
|
|
|
|
|
Jan 16 2015, 12:32
|

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

|
Цитата(Alt.F4 @ Jan 16 2015, 13:37)  функция FLASH_EraseOptionBytes() работает как сказано в описании и не включает защиту от чтения при стирании Option Bytes, Поздравляю, вы нашли брешь в защите  Цитата(Alt.F4 @ Jan 16 2015, 13:37)  2) в остальных ячейках nWRP1-nWRP3 (в nWRP0 и WRP0 все верно) записаны 0xFF, хотя по идее там автоматом должна выставляться инверсия 0x00. После стирания не должна. И это тоже написано в документации. Я только что еще раз прочитал и убедился в этом, но сюда выкладывать выдержку не буду, чтобы вы тоже прочитали сами. Пока будете искать это место в документации, попутно найдете еще много полезного. Цитата(Alt.F4 @ Jan 16 2015, 13:37)  Как это можно объяснить? При "правильном" условии оно не выполняется и стирания со всеми вытекающими не происходит.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jan 16 2015, 12:53
|

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

|
Цитата(ViKo @ Jan 16 2015, 14:43)  средствами самого Keil? Я не знаю. У меня Eclipse+OpenOCD, у Alt.F4 IAR.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jan 16 2015, 12:55
|
Профессионал
    
Группа: Свой
Сообщений: 1 468
Регистрация: 28-03-10
Из: Беларусь
Пользователь №: 56 256

|
Цитата Поздравляю, вы нашли брешь в защите Это скорее ошибка в доке, т.к. функция работает как описано в библиотеке. Цитата После стирания не должна. И это тоже написано в документации. Я только что еще раз прочитал и убедился в этом, но сюда выкладывать выдержку не буду, чтобы вы тоже прочитали сами. Пока будете искать это место в документации, попутно найдете еще много полезного. После стриния я делаю запись EnableWriteProtection(), по которой должно быть: "The FPEC takes the LSB and automatically computes the MSB (which is the complement of the LSB) and starts the programming operation." Но это не происходит... Цитата При "правильном" условии оно не выполняется и стирания со всеми вытекающими не происходит. Я же дебагером захожу в него, условие выполняется. Да и как ему не выполняться, если по умолчанию защиты от записи нет.
|
|
|
|
|
Jan 16 2015, 13:48
|

Универсальный солдатик
     
Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362

|
Цитата(Сергей Борщ @ Jan 16 2015, 15:53)  Я не знаю. У меня Eclipse+OpenOCD, у Alt.F4 IAR. Это понятно, но принципы те же. Неужели, чтобы задать защиту программы, ее нужно сначала запустить на выполнение? Нашел. Нужно добавить в проект файл ...OPT.s А дальше Keil-овский Wizard предложит свои услуги. Аналогично для программирования Flash OTP, там свой файлик, ...OTP.s Заблокировал прибор. Теперь не могу ни очистить флэш, ни...чего. И под сбросом не получается, сброс такой... Пошел качать Flash Loader Demonstrator.
|
|
|
|
|
Jan 16 2015, 13:52
|

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

|
Цитата(Alt.F4 @ Jan 16 2015, 14:55)  Это скорее ошибка в доке, т.к. функция работает как описано в библиотеке. Чудесатые чудеса. У меня все работает четко по документации: защиту снял - память стерлась. Цитата(Alt.F4 @ Jan 16 2015, 14:55)  После стриния я делаю запись EnableWriteProtection(), по которой должно быть: "The FPEC takes the LSB and automatically computes the MSB (which is the complement of the LSB) and starts the programming operation." Но это не происходит... Я не знаю, что делает эта библиотечная функция. Вероятно она пишет только те байты, которые отличаются от 0xFF, оставляя остальные стертыми. У вас же есть ее исходник, посмотрите там. Цитата(Alt.F4 @ Jan 16 2015, 14:55)  Я же дебагером захожу в него, условие выполняется. Да и как ему не выполняться, если по умолчанию защиты от записи нет. Вам виднее, но я в чудеса не верю. Защита от записи включается после сброса. Возможно вы наблюдаете все это не сбрасывая процессор. Цитата(ViKo @ Jan 16 2015, 15:48)  И под сбросом не получается, сброс такой... Хм. У меня OpenOCD снимает защиту через SWD. На разъем сброс не выведен.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|