stm32f103c8t6 FLASH保护
·
软件完成后,如果想对flash 进行保护,禁止他人非法读取flash,可进行如下操作:
FLASH_Unlock();
//这个指令会禁止 读取FALSH (包括DAP JLINK都无法读取flash)
status = FLASH_ReadOutProtection(ENABLE);
FLASH_Lock();
NVIC_SystemReset();
执行以上代码后,无论是DAP还是jlink都不能正常读取整个flash。
【注意】千万不要轻易执行以上代码,否则,系统无法正常更新程序,仅能运行程序!
如何解除锁定呢?
FLASH_Unlock();
//如果之前执行过enable,再执行disable,会清空整个FLASH
status = FLASH_ReadOutProtection(DISABLE);
FLASH_Lock();
NVIC_SystemReset();
执行上面代码后,硬件会自动清除整个FLAHS。
如果想测试这个程序,可以将这两个程序写在串口任务中,根据串口收到的命令执行不同的分支!
如何写锁定自己的某几个页
/**
* @brief 使用标准库保护 Flash 的前 4KB (Page 0 - Page 3)
* @note 如果保护成功执行,系统将自动复位!
*/
void Flash_Protect_Sector0_StdLibrary(void)
{
// 定义我们要保护的区域:前 4KB (Page 0 - 3)
uint32_t target_pages = FLASH_WRProt_Pages0to3;
FLASH_Status status;
// 获取当前的写保护状态
// FLASH_GetWriteProtectionOptionByte 返回的是 WRP 寄存器的值
// 如果对应的位为 1 (SET),表示该区域处于"未保护"状态
// 如果对应的位为 0 (RESET),表示该区域处于"保护"状态
uint32_t wrp_status = 0;
wrp_status = FLASH_GetWriteProtectionOptionByte();
// 检查是否已经处于保护状态
// 如果 (wrp_status & target_pages) 不为 0,说明这些页中至少有一页未被保护
if ((wrp_status & target_pages) != RESET)
{
// 1. 解锁 Flash
FLASH_Unlock();
// 2. 启用写保护
// 注意:这里不需要显式解锁 Option Bytes,标准库的这个函数内部处理了流程
// 此函数会将对应位置 0
status = FLASH_EnableWriteProtection(target_pages);
// 3. 检查是否操作成功
if (status == FLASH_COMPLETE)
{
// 4. 锁定 Flash
FLASH_Lock();
// 5. 产生系统复位以加载新的 Option Bytes
// 必须复位,否则保护不会立即生效
NVIC_SystemReset();
}
else
{
// 如果失败,记得锁定 Flash
FLASH_Lock();
}
}
// 如果已经保护了,则什么都不做,继续运行
}
更多推荐
所有评论(0)