找回密码
 注册
7月份电巢直播计划

STM32的Flash写了保护怎么办?

2021-7-22 10:54| 查看: 20| 评论: 0

摘要: 关于STM32对内部Flash的保护 为了防止对Flash的非法访问,所有STM32的芯片都提供对Flash的保护,具体分为写保护和读保护。 如果对Flash设置了写保护,那就无法对Flash进行编程和擦除。在开发STM32的时候,如 ...
关于STM32对内部Flash的保护
    为了防止对Flash的非法访问,所有STM32的芯片都提供对Flash的保护,具体分为写保护和读保护。

    如果对Flash设置了写保护,那就无法对Flash进行编程和擦除。在开发STM32的时候,如果出现这种情况,通常仿真器都支持对Flash进行解锁,像jlink,stlink等仿真器都支持这个功能。
    在使用MDK进行调试的时候,可能会遇到如下图所示的报错信息,这时候就要排查Flash是不是被保护起来了。

    读保护即大家通常说的“加密”,是作用于整个Flash存储区域。一旦设置了Flash的读保护,内置的Flash存储区只能通过程序的正常执行才能读出,而不能通过下述任何一种方式读出:


  • 通过调试器(JTAG或SWD)
  • 从RAM中启动并执行的程序
    写保护是以四页(1KB/页) Flash存储区为单位提供写保护,对被保护的页实施编程或擦除操作将不被执行,同时产生操作错误标志,读与写设置的效果见下表:


    当Flash读保护生效时,CPU执行程序可以读受保护的Flash区,但存在两个例外情况:


  • 调试执行程序时

  • 从RAM启动并执行程序时

    STM32还提供了一个特别的保护,即对Flash存储区施加读保护后,即使没有启用写保护,Flash的第 0 ~ 3 页也将处于写保护状态,这是为了防止修改复位或中断向量而跳转到RAM区执行非法程序代码。
Flash保护的相关函数   





FLASH_Unlock();   //Flash解锁 FLASH_ReadOutProtection(DISABLE);  //Flash读保护禁止   FLASH_ReadOutProtection(ENABLE);   //Flash读保护允许STM32如何设置读保护和解除读保护?
    读保护设置后将不能读出Flash中的内容。

如何设置读保护
    在程序的开头加入“设置读保护”的代码即可,每次运行代码时都检查一下,如果没有开就打开,如果打开了就跳过。其中,设置读保护的代码如下:















int main(void){  ...  if (FLASH_GetReadOutProtectionStatus()!=SET)//检查设置读保护与否  {    FLASH_Unlock();         //写保护时可以不用这句话,可用可不用    FLASH_ReadOutProtection(ENABLE);     //设置读保护  }  ...  while(1)  {    ...  }}
    上面的代码执行后,使用j-link就不能读出程序了,实现了代码读保护。需要注意的是,芯片读保护后无法再次烧写新的程序到Flash中,必须要解除读保护才可以。但是当解除读保护的时候STM32会自动擦除整个Flash,起到保护数据的作用。
通过代码解除Flash保护

    解除读保护可以设置在按键里面,方便实现解锁,也可以设置在命令中。如下是解除读保护代码:










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保护
    在STLink连接目标板的情况下打开程序烧写软件ST-Link Utility,在菜单栏的Target下选择connect,因为这时候Flash已经被锁住了,能看到如下图所示的错误提示。


    下面来操作如何解除Flash保护。
    请确保当前已经正确连接了STLink和目标板,在菜单栏Target里打开Option Bytes...选项,发现在这里Read Out Protection选项是Enable,这个表示无法通过SWD读取STM32内部Flash的程序。

    将Read Out Protection选项设置为Disable,并点击Apply。
    这时候Flash已经成功解锁了,跟上文提到的解除Flash保护的结果一样,内部Flash已经被擦除了,如下图红框中所示。

    完成以上步骤之后,在菜单栏Target下选择Disconnect断开与目标板连接。
    重新进入MDK,可以正常对目标板烧写程序了。
通过ST-Link Utility来设置Flash保护

    在菜单栏Target里打开Option Bytes...选项,可以看到下面有Flash sector protection选项。选择Select all之后,发现所有Page的Protection项都已经变成Write Protection了,只要选择Apply选项就可以对Flash进行写保护,如上图所示。


推荐关注

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』
本站资讯文章系编辑转载,转载目的在于传递更多信息,并不代表本站赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与本站联系,我们将在第一时间删除内容!
[声明]本站文章版权归原作者所有 内容为作者个人观点 本站只提供参考并不构成任何投资及应用建议。
本站拥有对此声明的最终解释权。
收藏 邀请
关闭

推荐内容上一条 /1 下一条

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号 )

GMT+8, 2021-7-27 20:51 , Processed in 0.062500 second(s), 24 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19925233282

返回顶部