近期看到关于stm32产品远程升级IAP,也抱着研究的态度尝试了下,参考STM32官方的对XX闪存编程手册,实现对FLASH的擦除,读写都没问题,但是考虑产品的安全性,希望可以实现FLASH的读写保护,但是参照手册,对选择字节的配置老是出现问题,选择字节的写函数:
FLASH_OperatorStatus USERByteProgram(u32 Address, u16 Data)
{
u8 Index = 1;
u16 cache;
while (FLASHBusyStatus && ++Index);
if (Unlock() == LOCK) return OperatorFail;
cache = FLASH_ReadDataByte(Address);
if (cache != 0XFFFF)
{
USERByteErase(); //擦除选择字节
}
// cache = FLASH_ReadDataByte(Address);
if (Index != 0)
{
FLASH->OPTKEYR = FLASH_KEY1;
FLASH->OPTKEYR = FLASH_KEY2; //解锁OPTKEYR
FLASHSetOPTPG(1);
*(vu16*)Address = Data;
Index = 1;
while (!FLASHEopStatus && ++Index);
// FLASHSetPG(0);
FLASHSetOPTPG(0);
FLASHClearOPTWRE;
FLASHClearEOP;
FLASHSetLock(1);
if (Index != 0) return OperatorSuccess;
}
return OperatorFail;
}
/***很奇怪的现象就是,为什么每次解锁OPTWRE后其置1正常,但是当执行到设置OPTPG=1和*(vu16*)Address = Data;时,OPTWRE自动清除,这个好像和手册上写的不符合(手册上应该是软件清0啊,不太理解)而且每次调试都会导致FLASH被锁死,需要重新用串口解锁,很麻烦。 求指导***/
|