STM32

您所在的位置:网站首页 stm32芯片烧坏了如何读出程序 STM32

STM32

2024-07-11 13:30| 来源: 网络整理| 查看: 265

参考网上文章《STM32-读保护功能和清除读保护功能设置》,根据自己操作。如有侵权,请联系我删除

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读保护允许

4、stm32置读保护跟清读保护操作

  功能:读保护设置后将不能读出flash 的内容;当解除读保护的时候stm32 会自动擦出整篇flash;   读保护设置:在程序的开头加入“读保护”代码,即实现了读保护功能;(每次程序运行先开保护)   解除读保护:解除读保护可以设置在按键里面,方便实现解锁,也不可不设按键在RAM中执行程序再清除读保护;   (1)设置读保护:

 int main(void) {     ....

           if(FLASH_GetReadOutProtectionStatus() != SET)     {         //FLASH_Unlock();不解锁FALSH也可设置读保护???         FLASH_ReadOutProtection(ENABLE);        }     ......     while(1)     {        .....      } }

    这个写到程序当中并执行过后,使用j-link就不能‘读出’程序了,就是‘读保护’了!没有使用此程序可以读出下载到芯片中的程序,但是如果使用了此程序就无法读出程序了。但是也无法再次烧写新的程序到芯片中了(要测试请慎重!!!!!!)

  可以在主程序当中设置一按键专门清除“读保护”,一旦按下按键则清除“读保护”时芯片可以重新被烧写。

  (2)解除读保护:在程序中的某个操作中(如按键等)加入如下代码,执行后 代码自己杀死了自己! if(FLASH_GetReadOutProtectionStatus() != RESET) { FLASH_Unlock(); FLASH_ReadOutProtection(DISABLE); }    这些函数在stm32f10x_flash 里面,注意:调用上面这个库的时候需在#include "stm32f10x_flash.h"前加#define _FLASH_PROG;否则报(没有定义)错。

   如果你没有做按键清除读保护这一步还有方法二补救:专门写一个清除“读保护”程序,使用RAM中运行程序的方法,运行此程序解锁“读保护”,执行后,FLASH会自动全部擦除。代码如下: int main(void) { FLASH_Unlock(); FLASH_ReadOutProtection(DISABLE); 

  while (1)   {   }; } ※对于在RAM中运行程序,说明如下: (1)我使用IAR + J-Link,不用把Boot0和boot1脚设置成从RAM启动也可在RAM中调试(我使用IAR没有RAM中运行选项)。 (2)在IAR环境中设置Link文件为lnkarm_ram.xcl或者自己修改STM32F10x_FLASH.icf文件

//define symbol __ICFEDIT_region_ROM_start__ = 0x080000F0;  //修改为如下: define symbol __ICFEDIT_region_ROM_start__ = 0x200000F0;

//define symbol __ICFEDIT_region_ROM_end__   = 0x0803FFFF;  //修改为如下 define symbol __ICFEDIT_region_ROM_end__   = 0x20001FFF;

//define symbol __ICFEDIT_region_RAM_start__ = 0x20000000; //修改为如下 define symbol __ICFEDIT_region_RAM_start__ = 0x20002000;

(3)Debuger选项Download tab中勾全部去掉。 按上面设置完成后,按Debug按钮,执行上面程序,读保护可解除。

(4)点击下载运行时。可能会提示错误(有时不提示) 当下载时,提示 CRC校验失败,选择 NO(右边)。 当下载时,提示无法擦除 sector 0,选择NO(右边)

(5)运行前使用J-Flash ARM"工具,Target->unsercure chip 解除了芯片的读保护。不然会出现上述各种报错。

if (FLASH_GetReadOutProtectionStatus() == RESET)  { FLASH_Unlock(); FLASH_ReadOutProtection(ENABLE);  } if (FLASH_GetReadOutProtectionStatus() == SET)  {  FLASH_Unlock(); FLASH_ReadOutProtection(DISABLE);  } CPU Flash读保护使能后,仿真器调试会失败。J-LINK有个解锁菜单,需要解锁才能正常再次烧写程序。当然解锁会导致Flash内容被全部擦出。 运行

启动"J-Flash ARM"工具,Target->unsercure chip 就解除了芯片的读保护。Target->unsercure chip 后一定要上电复位,系统不复位是不行的。

 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3