你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32的Flash写了保护怎么办?

[复制链接]
STMCU小助手 发布时间:2020-12-24 13:45
STM32的Flash写了保护怎么办?
关于STM32对内部Flash的保护
    为了防止对Flash的非法访问,所有STM32的芯片都提供对Flash的保护,具体分为写保护和读保护。
    如果对Flash设置了写保护,那就无法对Flash进行编程和擦除。在开发STM32的时候,如果出现这种情况,通常仿真器都支持对Flash进行解锁,像jlink,stlink等仿真器都支持这个功能。
    在使用MDK进行调试的时候,可能会遇到如下图所示的报错信息,这时候就要排查Flash是不是被保护起来了。
1.1.png
    读保护即大家通常说的“加密”,是作用于整个Flash存储区域。一旦设置了Flash的读保护,内置的Flash存储区只能通过程序的正常执行才能读出,而不能通过下述任何一种方式读出:
u  通过调试器(JTAG或SWD)
u  从RAM中启动并执行的程序
    写保护是以四页(1KB/页) Flash存储区为单位提供写保护,对被保护的页实施编程或擦除操作将不被执行,同时产生操作错误标志,读与写设置的效果见下表:
1.2.png
    当Flash读保护生效时,CPU执行程序可以读受保护的Flash区,但存在两个例外情况:
l  调试执行程序时
l  从RAM启动并执行程序时
   STM32还提供了一个特别的保护,即对Flash存储区施加读保护后,即使没有启用写保护,Flash的第 0 ~ 3 页也将处于写保护状态,这是为了防止修改复位或中断向量而跳转到RAM区执行非法程序代码。
Flash保护的相关函数   
  1. FLASH_Unlock();   //Flash解锁- I0 X5 {0 z- Y( j: n  P
  2. 6 z& o  Z! G" o! t" _& ^
  3. FLASH_ReadOutProtection(DISABLE);  //Flash读保护禁止  
    . }5 L! _- N" g
  4. 6 }0 X- I; T! E' z# V/ h3 m
  5. FLASH_ReadOutProtection(ENABLE);   //Flash读保护允许
复制代码
. n0 G6 @& \0 y
STM32如何设置读保护和解除读保护?
    读保护设置后将不能读出Flash中的内容。
如何设置读保护
    在程序的开头加入“设置读保护”的代码即可,每次运行代码时都检查一下,如果没有开就打开,如果打开了就跳过。其中,设置读保护的代码如下:
  1. int main(void)
    / C* x; A3 T# _: G4 @8 ?/ C9 i# F; s
  2. ( w% R1 W, C$ x: a0 }  ]; Z
  3. {2 G6 o4 \, r) ?! R9 y1 F9 v
  4. ' k. ^4 I# T& x! r3 d
  5.   ..., N+ ]: \& @) b" M
  6. ' V# g  p2 Z$ _# r4 R7 D% {; t$ [
  7.   if (FLASH_GetReadOutProtectionStatus()!=SET)//检查设置读保护与否8 A4 p- u/ ?0 P+ s, G: a+ ^0 n
  8. % k0 {3 u: N# ~+ d/ R* n! O
  9.   {0 P6 |, M  I6 L! ~7 t
  10.   m% @) y" e) y4 t# N' J# v6 p7 f
  11.     FLASH_Unlock();         //写保护时可以不用这句话,可用可不用
    # e2 h6 n$ B0 a  d$ x( C
  12. / g& k, l# u* G6 z8 X
  13.     FLASH_ReadOutProtection(ENABLE);     //设置读保护3 p1 O0 s; f( Q0 ]" K7 V

  14. - E4 A4 ^% O! A1 U; A& t
  15.   }
    . _2 H) _/ x' E' D2 u) r3 H" x  R
  16. 8 X& c$ k* `5 j. k7 F4 j
  17.   ...
    * k$ x* n- J4 Q# z: X7 O
  18. 9 ~7 d: D; j. ~% X
  19.   while(1)
    , S! h9 ?4 g9 ?  Y8 a

  20. 2 h$ s/ u9 m* l8 ~, e* {& L2 L
  21.   {
    5 J0 T5 i- v2 V8 k! U! u

  22. # m( n8 S8 Z# m
  23.     ...2 K- V0 X4 V6 }1 e  K

  24. $ y- T0 ~) q1 Q# {! l
  25.   }
    7 k6 r3 @1 A! P- a$ w  ?/ }7 n

  26. $ n# [, ]! n: i2 n% m! |5 F* ?
  27. }
复制代码
4 S/ C2 p* p. j$ F4 [
    上面的代码执行后,使用j-link就不能读出程序了,实现了代码读保护。需要注意的是,芯片读保护后无法再次烧写新的程序到Flash中,必须要解除读保护才可以。但是当解除读保护的时候STM32会自动擦除整个Flash,起到保护数据的作用。
通过代码解除Flash保护
    解除读保护可以设置在按键里面,方便实现解锁,也可以设置在命令中。如下是解除读保护代码:
  1. void Off_Protect(void) //关闭保护: E  T, N. Q/ ]9 Y) ~6 T
  2. {4 Z/ t' O( r2 u, S
  3. if(FLASH_GetReadOutProtectionStatus() != RESET)
    ' H2 L+ R% k# s8 R. w) n1 v
  4.    {# o* u4 d. g9 Q; u* C7 ]
  5. FLASH_Unlock(); //不解锁FALSH也可设置读保护,可用可不用
    ! M  ?- `3 \) a$ p
  6. FLASH_ReadOutProtection(DISABLE);
    ) n% \# l# p0 G) x, f) R$ J
  7. FLASH_Lock(); //上锁  m7 k' @& w% @! U
  8.    }
    9 K; a. g" {3 z" z0 R9 ]7 J; ^
  9. }
复制代码

) m5 d+ S0 h' `9 V) Q+ R

; O. n2 W" k7 {6 n( N
程序中设置一个按键或者命令,可以随时解除Flash的读保护,让芯片又可以重新烧录程序。如果没有留,还可以专门写一个程序,下载到RAM中去运行,用来解除读保护。
8 q1 x( V& C" O6 P) w7 l
注意:执行后,Flash会自动全部擦除。

; @* N1 I6 G/ j* M1 d" T! c
  1. int main(void)6 @* F/ q9 M! O8 {. m; N8 l
  2. {1 {( R7 n) O9 x9 q. d
  3. Chip_Init();
    & i( _& v6 M, m$ ]# `
  4. FLASH_Unlock(); //不解锁FALSH也可设置读保护,可用可不用
    # z3 {" P  P0 y! W+ e# Z' e9 c9 z& ]
  5. FLASH_ReadOutProtection(DISABLE);7 q1 ~' E6 D  Z
  6. }) ?& C5 f8 |) n! h
复制代码
5 W% y5 r& t: H2 Q) X3 p" K
5 a" s1 \3 `/ Z, ?
通过ST-Link Utility来解除Flash保护
    在STLink连接目标板的情况下打开程序烧写软件ST-Link Utility,在菜单栏的Target下选择connect,因为这时候Flash已经被锁住了,能看到如下图所示的错误提示。
1.3.png
    下面来操作如何解除Flash保护。
    请确保当前已经正确连接了STLink和目标板,在菜单栏Target里打开Option Bytes...选项,发现在这里Read Out Protection选项是Enable,这个表示无法通过SWD读取STM32内部Flash的程序。
1.4.png
    将Read Out Protection选项设置为Disable,并点击Apply。
    这时候Flash已经成功解锁了,跟上文提到的解除Flash保护的结果一样,内部Flash已经被擦除了,如下图红框中所示。
1.5.png
    完成以上步骤之后,在菜单栏Target下选择Disconnect断开与目标板连接。
    重新进入MDK,可以正常对目标板烧写程序了。
通过ST-Link Utility来设置Flash保护
1.6.png
    在菜单栏Target里打开Option Bytes...选项,可以看到下面有Flash sector protection选项。选择Select all之后,发现所有Page的Protection项都已经变成Write Protection了,只要选择Apply选项就可以对Flash进行写保护,如上图所示。
文章出处: Moon
( F) _4 ~: v. u5 \/ \9 O! p
赞 收藏 评论1 发布时间:2020-12-24 13:45

举报

1个回答
sincomaster 回答时间:2020-12-24 14:18:04
谢谢分享
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版