7.STM32的代码保护
通 过选择字节的设置,可以实现代码的读保护和写保护,在上面6中讲到的,RDP和WRP分别是读保护和写保护,将RDP设置指定的数值,可以实现代码的读保 护,也就是不允许任何设备读取FLASH里面的应用代码,将WRP里设置指定的数值,可以实现代码的写保护,不允许任何设备改写FLASH里面的应用代 码。其中设置读保护的代码如下:
//等待前次操作完毕(检查FLASH_SR寄存器的BSY位)
status = FLASH_WaitForLastOperation(EraseTimeout); if(status == FLASH_COMPLETE)//如果FLASH处于可以操作状态,开始进行指定操作
{
//解锁 CR寄存器中的OPTWRE位
FLASH->OPTKEYR = FLASH_KEY1;
FLASH->OPTKEYR = FLASH_KEY2;
//擦除整个选择字节区域
FLASH->CR |= CR_OPTER_Set;
FLASH->CR |= CR_STRT_Set; //等待擦除操作完毕
status = FLASH_WaitForLastOperation(EraseTimeout); if(status == FLASH_COMPLETE)//如果擦除操作完毕
{
//禁止OPTER位
FLASH->CR &= CR_OPTER_Reset; //使能选择字节编程操作
FLASH->CR |= CR_OPTPG_Set; if(NewState != DISABLE)//禁止读出操作
{
OB->RDP = 0x00;
}
else//使能读出操作
{
OB->RDP = RDP_Key;
} //等待写入完毕
status = FLASH_WaitForLastOperation(EraseTimeout);
if(status != FLASH_BUSY)
{
//写入操作完毕,禁止OPTPG位
FLASH->CR &= CR_OPTPG_Reset;
}
}
写保护代码如下:
//等待前次操作完毕(检查FLASH_SR寄存器的BSY位)
status = FLASH_WaitForLastOperation(ProgramTimeout);
if(status == FLASH_COMPLETE)//如果FLASH处于可以操作状态,开始进行编程操作
{
//解锁 CR寄存器中的OPTWRE位
FLASH->OPTKEYR = FLASH_KEY1;
FLASH->OPTKEYR = FLASH_KEY2;
//设置FLASH_CR寄存器的OPTPG位为1
FLASH->CR |= CR_OPTPG_Set; if(WRP0_Data != 0xFF)//如果不是全部不写保护
{
OB->WRP0 = WRP0_Data;//写入WRP0
//等待写入操作完毕
status = FLASH_WaitForLastOperation(ProgramTimeout);
}
if((status == FLASH_COMPLETE) && (WRP1_Data != 0xFF))
{
OB->WRP1 = WRP1_Data;
//等待写入操作完毕
status = FLASH_WaitForLastOperation(ProgramTimeout);
} if((status == FLASH_COMPLETE) && (WRP2_Data != 0xFF))
{
OB->WRP2 = WRP2_Data;
//等待写入操作完毕
status = FLASH_WaitForLastOperation(ProgramTimeout);
}
if((status == FLASH_COMPLETE)&& (WRP3_Data != 0xFF))
{
OB->WRP3 = WRP3_Data;
//等待写入操作完毕
status = FLASH_WaitForLastOperation(ProgramTimeout);
}
if(status != FLASH_BUSY)
{
//如果编程操作完毕,禁止OPTPG位
FLASH->CR &= CR_OPTPG_Reset;
}
}
|