MiklPolikov 0 25 октября, 2021 Опубликовано 25 октября, 2021 · Жалоба Хочу программно устанавливать защиту от копирования прошивки. Вопрос: Эта область памяти программируется точно так же, как и вся остальная FLASH ? Т.е. сначала стираем страницу ? Если страница где OPTION BYTES стерта, и в этот момент пропало питание, то происходит невозвратный глюк ? Как понимаю, по адресу 0x1FFF F800 всего 4шт 32х битных регистра, и дальше вся страница пустая ? Т.е. запомнить и перезаписать обратно нужно только их ? Заранее спасибо ! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 25 октября, 2021 Опубликовано 25 октября, 2021 · Жалоба 3 часа назад, MiklPolikov сказал: Эта область памяти программируется точно так же, как и вся остальная FLASH ? Нет, в руководстве пользователя отдельный раздел про Option Bytes и их программирование/стирание 3 часа назад, MiklPolikov сказал: сначала стираем страницу ? Да. 3 часа назад, MiklPolikov сказал: Если страница где OPTION BYTES стерта, и в этот момент пропало питание, то происходит невозвратный глюк ? Не совсем - прошивка остается защищенной от чтения, после подачи питания можно изнутри программы вычитать option bytes и поставить в желаемое положение. 3 часа назад, MiklPolikov сказал: Как понимаю, по адресу 0x1FFF F800 всего 4шт 32х битных регистра, и дальше вся страница пустая ? Дальше просто ничего нет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 131 25 октября, 2021 Опубликовано 25 октября, 2021 · Жалоба Это такая же по технологии область Flash, но биты управления стиранием/записью другие. Цитата Если страница где OPTION BYTES стерта, и в этот момент пропало питание, то происходит невозвратный глюк? Что такое "невозвратный глюк"? При стертом RDP (0xFF) защита Flash будет соответствовать Level 1. Вот мой установщик Level 1: вызывается в загрузчике, срабатывает только когда RDP установлен в Level 0 #define MCU_OPT_BEG 0x1FFFF800 #define LockNVMOp() FLASH->CR = FLASH_CR_LOCK #define UnlockROMOp() FLASH->KEYR = 0x45670123, FLASH->KEYR = 0xCDEF89AB #define UnlockOptOp() FLASH->OPTKEYR = 0x45670123, FLASH->OPTKEYR = 0xCDEF89AB #define ClrROMOpSReg() FLASH->SR = FLASH_SR_PGERR | FLASH_SR_WRPERR | FLASH_SR_EOP #define UpdSysOpt() FLASH->CR = FLASH_CR_OBL_LAUNCH #define isROMBsy() (FLASH->SR & FLASH_SR_BSY) void hw_InitOpt(void) { #define RDP_LVL0 0xAA #define RDP_LVL1 0x12 #define WRP_SECT (B1 | B0) #define RDP(t) (OPT(t)[0]) #define WRP (&OPT(u16)[4]) #define OPT(t) ((volatile t *)MCU_OPT_BEG) if(RDP(u8) == RDP_LVL0) { UnlockROMOp(); UnlockOptOp(); FLASH->CR |= FLASH_CR_OPTER; FLASH->CR |= FLASH_CR_STRT; while(isROMBsy()){} ClrROMOpSReg(); FLASH->CR = FLASH_CR_OPTPG | FLASH_CR_OPTWRE; RDP(u16) = (u8)~RDP_LVL1 << 8 | RDP_LVL1; while(isROMBsy()){} ClrROMOpSReg(); WRP[0] = WRP_SECT << 8 | (u8)~WRP_SECT; while(isROMBsy()){} ClrROMOpSReg(); LockNVMOp(); UpdSysOpt(); } } P.S. Еще и загрузчик от записи защищает, устанавливая защиту на сектора 1 и 2. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SSerge 4 25 октября, 2021 Опубликовано 25 октября, 2021 · Жалоба В том же самом RM0360: 3.2.2 Flash program and erase operations 3 часа назад, MiklPolikov сказал: Если страница где OPTION BYTES стерта, и в этот момент пропало питание, то происходит невозвратный глюк ? Возвратный :), невозвратным он станет если RPD установится в Level2. 2 минуты назад, Сергей Борщ сказал: Не совсем - прошивка остается защищенной от чтения, после подачи питания можно изнутри программы вычитать option bytes и поставить в желаемое положение. "When the RPD is reprogrammed to the value 0xAA to move back to Level 0, a mass erase of the main Flash memory is performed." Но это только если снять и снова подать питание (или сделать ресет), потому что option bytes считываются и применяются после сброса, а не сразу после их изменения. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться