一、STM32对内部Flash的保护措施
所有STM32的芯片都提供对Flash的保护,防止对Flash的非法访问 – 写保护和读保护。
1、读保护即大家通常说的“加密”,是作用于整个Flash存储区域。一旦设置了Flash的读保护,内置的Flash存储区只能通过程序的正常执行才能读出,而不能通过下述任何一种方式读出:A、 通过调试器(JTAG或SWD); B、从RAM中启动并执行的程序;
2、写保护是以四页(1KB/页) Flash存储区为单位提供写保护,对被保护的页实施编程或擦除操作将不被执行,同时产生操作错误标志。
读与写设置的效果见下表:
读保护 | 写保护 | 对Flash的操作功能 |
有效 | 有效 | CPU只能读,禁止调试和非法访问。 |
有效 | 无效 | CPU可以读写,禁止调试和非法访问,页0~3为写保护。 |
无效 | 有效 | CPU可读,允许调试和非法访问。 |
无效 | 无效 | CPU可以读写,允许调试和非法访问。 |
二、当Flash读保护生效时,CPU执行程序可以读受保护的Flash区,但存在两个例外情况:
1、调试执行程序时;
2、从RAM启动并执行程序时
STM32还提供了一个特别的保护,即对Flash存储区施加读保护后,即使没有启用写保护,Flash的第 0 ~ 3 页也将处于写保护状态,这是为了防止修改复位或中断向量而跳转到RAM区执行非法程序代码。
三、Flash保护的相关函数
FLASH_Unlock(); //Flash解锁
FLASH_ReadOutProtection(DISABLE); //Flash读保护禁止
FLASH_ReadOutProtection(ENABLE); //Flash读保护允许
四、stm32设置读保护和解除读保护操作
1、功能:读保护设置后将不能读出flash中的内容;当解除读保护的时候stm32会自动擦除整个flash,起到保护数据的作用。
2、设置读保护:在程序的开头加入“设置读保护”的代码即可,每次运行代码时都检查一下,如果没有开就打开,如果打开了就跳过。
3、解除读保护:解除读保护可以设置在按键里面,方便实现解锁,也可以设置在命令中。
4、设置读保护的代码:
int main(void)
{...if (FLASH_GetReadOutProtectionStatus()!=SET) //检查设置读保护与否 { FLASH_Unlock(); //写保护时可以不用这句话,可用可不用FLASH_ReadOutProtection(ENABLE); //设置读保护 }...while(1){...}
}
上面的代码执行后,使用j-link就不能读出程序了,实现了代码读保护。
注意:芯片读保护后,无法再次烧写新的程序到flash中,必须要解除读保护才可以,测试需谨慎。
5、解除读保护代码:
void Off_Protect(void) //关闭保护
{ if(FLASH_GetReadOutProtectionStatus() != RESET){FLASH_Unlock(); //不解锁FALSH也可设置读保护,可用可不用FLASH_ReadOutProtection(DISABLE);FLASH_Lock(); //上锁 }
}
程序中设置一个按键或者命令,可以随时解除flash的读保护,让芯片又可以重新烧录程序。如果没有留,还可以专门写一个程序,下载到RAM中去运行,用来解除读保护。执行后,flash会自动全部擦除。
int main(void)
{Chip_Init();FLASH_Unlock(); //不解锁FALSH也可设置读保护,可用可不用FLASH_ReadOutProtection(DISABLE);
}
五、测试
下载并执行设置读保护代码后,再次下载程序显示:
说明已经启动了 读保护,无法再次下载程序了。
通过ST-LINK Utility连接芯片,提示读保护,无法读取flash数据:
这个时候,需要调用解除读保护的代码即可恢复。
转载自:https://wenku.baidu.com/view/539f9f0754270722192e453610661ed9ad5155fb.html?rec_flag=default&sxts=1560582755950