×
嵌入式 > 嵌入式开发 > 详情

STM32对内部Flash的保护措施

发布时间:2020-08-25 发布时间:
|
1、STM32内部Flash保护措施

所有STM32的芯片都提供对Flash的保护,防止对Flash的非法访问 - 写保护和读保护。
1)、读保护即大家通常说的“加密”,是作用于整个Flash存储区域。一旦设置了Flash的读保护,内置的Flash存储区只能通过程序的正常执行才能读出,而不能通过下述任何一种方式读出:
通过调试器(JTAG或SWD);
从RAM中启动并执行的程序;
2)、写保护是以四页(1KB/页) Flash存储区为单位提供写保护,对被保护的页实施编程或擦除操作将不被执行,同时产生操作错误标志。
读与写设置的效果见下表:
读保护 写保护对Flash的操作功能
有效 有效 CPU只能读,禁止调试和非法访问。
有效 无效 CPU可以读写,禁止调试和非法访问,页0~3为写保护。
无效 有效 CPU可读,允许调试和非法访问。
无效 无效 CPU可以读写,允许调试和非法访问。
2、当Flash读保护生效时,CPU执行程序可以读受保护的Flash区,但存在两个例外情况:
1)、调试执行程序时;
2)、从RAM启动并执行程序时
STM32还提供了一个特别的保护,即对Flash存储区施加读保护后,即使没有启用写保护,Flash的第 0 ~ 3 页也将处于写保护状态,这是为了防止修改复位或中断向量而跳转到RAM区执行非法程序代码。
3、Flash保护相关函数
FLASH_Unlock();//Flash解锁
FLASH_ReadOutProtection(DISABLE);//Flash读保护禁止
FLASH_ReadOutProtection(ENABLE);//Flash读保护允许

以下摘自论坛:

/zixunimg/eepwimg/www.openedv.com/posts/list/9353.htm

(1)设置读保护
intmain(void)
{
....
if(FLASH_GetReadOutProtectionStatus()!=SET)
{
//FLASH_Unlock();
FLASH_ReadOutProtection(ENABLE);
}
......
while(1)
{
.....
}
}
读保护后无法使用j-link将程序读出,当然也无法在线仿真了

这个写到程序当中并执行过后,使用j-link就不能‘读出’程序了,就是‘读保护’了!我已经试过了,没有使用此程序可以读出下载到芯片中的程序,但是如果使用了此程序就无法读出程序了。
但是也无法再次烧写新的程序到芯片中了(要测试请慎重!!!!!!)
可以再主程序当中设置一按键专门清除“读保护”,一旦按下按键则清除“读保护”时芯片可以重新被烧写。(我没有怎么做现在后悔死了!)
方法二:补救的方法,专门写一个清除“读保护”程序,使用RAM中运行程序的方法,运行此程序解锁“读保护”。明天再去测试下,此方法。


在主程序中,通过一个按键,写入取消“读保护”
if(FLASH_GetReadOutProtectionStatus()!=RESET)
{
FLASH_Unlock();
FLASH_ReadOutProtection(DISABLE);
}
使用j-link,可以正常读写程序和在线调试。
如果没有在主程序中有写这条指令,此芯片就无法再次烧写程序(可以擦出但是擦出后还是无法烧写程序)。
只有通过将此取消“读保护”程序,烧写到RAM中运行后,才能取消“读保护”(要尝试的请慎重!!!别救不会来就糟糕了)



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
ARM入门篇之(一)概念