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

STM32的Flash写了保护怎么办?

[复制链接]
STMCU小助手 发布时间:2021-9-17 14:21
关于STM32对内部Flash的保护
    为了防止对Flash的非法访问,所有STM32的芯片都提供对Flash的保护,具体分为写保护和读保护。
( N4 {- _  l8 C# E$ C( a( W- U) K( s- l8 D! [& F

# N) E9 y# ~) N/ ~    如果对Flash设置了写保护,那就无法对Flash进行编程和擦除。在开发STM32的时候,如果出现这种情况,通常仿真器都支持对Flash进行解锁,像jlink,stlink等仿真器都支持这个功能。
; ?) d# \. ?* Z. i1 y: u6 O/ B8 b5 l4 a2 h& {" r+ T4 K

7 [3 Z. q- e: M, l, Y6 I    在使用MDK进行调试的时候,可能会遇到如下图所示的报错信息,这时候就要排查Flash是不是被保护起来了。
1 P+ X/ F5 Y- N+ i* w
13.png
    读保护即大家通常说的“加密”,是作用于整个Flash存储区域。一旦设置了Flash的读保护,内置的Flash存储区只能通过程序的正常执行才能读出,而不能通过下述任何一种方式读出:, Q- |  A4 s4 t4 |

4 l! w/ O, e$ A) H" g
. j3 m9 R8 U3 E) i! [% z5 m
通过调试器(JTAG或SWD)
) q0 S3 w' n% C, q
- A% \* g# M3 Y' ]* w
3 O( N; d6 T7 O( v; {
从RAM中启动并执行的程序' a5 @+ Y7 B  f! j. \; `& T, R
  \9 m/ ]7 K8 w  x+ j2 k

  B$ w( y4 z7 A. f    写保护是以四页(1KB/页) Flash存储区为单位提供写保护,对被保护的页实施编程或擦除操作将不被执行,同时产生操作错误标志,读与写设置的效果见下表:
+ H; Q6 v( p1 s5 q+ w' b8 v8 X
15.png
    当Flash读保护生效时,CPU执行程序可以读受保护的Flash区,但存在两个例外情况:
2 L  m; p) ]( b0 g- ?7 u% v2 i; S4 S3 z2 i3 v
- C  b  h, [% T& _1 H" B( r- m' c$ P
调试执行程序时
/ G# h8 }/ f/ U8 m0 v$ V! m1 d! K3 h. R
. i; b+ g; m+ R
从RAM启动并执行程序时 - v4 ~0 W0 E3 c" X$ r- J
1 ?4 |" ]0 W  ?6 G
9 O+ Z+ ]. m( [2 R+ o& R+ r/ T
    STM32还提供了一个特别的保护,即对Flash存储区施加读保护后,即使没有启用写保护,Flash的第 0 ~ 3 页也将处于写保护状态,这是为了防止修改复位或中断向量而跳转到RAM区执行非法程序代码。
; o8 u' H  G3 N1 g+ hFlash保护的相关函数.
, I' k& a4 x& ^5 w# Z! Q: l) k% K
  1. FLASH_Unlock();   //Flash解锁 - `: v+ P  ?; i1 t* Q+ q
  2. FLASH_ReadOutProtection(DISABLE);  //Flash读保护禁止   
    : o. u3 C1 e( _) z0 B! G0 w
  3. FLASH_ReadOutProtection(ENABLE);   //Flash读保护允许
复制代码
STM32如何设置读保护和解除读保护?
6 }& d+ b0 j! H+ L% i( {  _- d

& e4 E" V" ^) W2 M* e; j/ {    读保护设置后将不能读出Flash中的内容。
  g1 H- y* t1 Z' u8 n' v/ C" r' G

3 x+ |& y: q: n7 w3 U4 N$ Q如何设置读保护5 \1 @/ [1 _6 s$ y7 O# K* j' c, {- \
" @7 F  Y. r( R' E9 f

9 `+ c  ?: v0 M    在程序的开头加入“设置读保护”的代码即可,每次运行代码时都检查一下,如果没有开就打开,如果打开了就跳过。其中,设置读保护的代码如下:
$ q. c, q- N9 D% N

  1. ) T" ^8 Y) u+ S8 a7 [5 I$ I4 E
  2. int main(void)/ i; l4 u7 O1 k5 W
  3. {+ k* J. \( _" Q) ]6 J2 [& ]
  4.   ...' i0 I" y4 Y6 h* @) W  n5 K; x. @) u
  5.   if (FLASH_GetReadOutProtectionStatus()!=SET)//检查设置读保护与否
    ( O% M( ?0 }* k  G" ?4 O6 |
  6.   {* \$ j5 I$ z. r/ t- E
  7.     FLASH_Unlock();         //写保护时可以不用这句话,可用可不用
    / ^) V& z% y- Q- [3 c
  8.     FLASH_ReadOutProtection(ENABLE);     //设置读保护% n' G  s, z0 ?+ a5 Q
  9.   }
    ' R; o+ U' y4 F( `: u2 k
  10.   ...
    1 v  u) b8 Z" h% I, h
  11.   while(1)' ^" s. S# T) @, I
  12.   {- t8 o' T+ B! @+ b! d, e& K
  13.     ...! T$ D- D( I7 v9 C
  14.   }
    / I9 ]7 T$ y2 q% Y; @4 A- s/ ?) Q
  15. }
复制代码
上面的代码执行后,使用j-link就不能读出程序了,实现了代码读保护。需要注意的是,芯片读保护后无法再次烧写新的程序到Flash中,必须要解除读保护才可以。但是当解除读保护的时候STM32会自动擦除整个Flash,起到保护数据的作用。
, z4 c7 \, }- `8 F, A/ O7 x% m0 e4 t# g7 B
2 e  ]" N6 x3 O# r  \/ k
通过代码解除Flash保护0 X  }, n- I7 T
9 u! O3 `% K% H( j8 q

2 H) a. e2 K- f: |0 s2 N, g! ~; g6 c    解除读保护可以设置在按键里面,方便实现解锁,也可以设置在命令中。如下是解除读保护代码:
: y- f$ {/ [3 b9 _
  1. void Off_Protect(void) //关闭保护
    + y& M, V, Q0 ^2 R: p
  2. {
    6 Q) O3 A* t2 r& P" k
  3. if(FLASH_GetReadOutProtectionStatus() != RESET)/ P9 ^8 z# F6 s/ ]1 e2 \
  4.   {6 [! T0 z4 |/ M7 z! `
  5.     FLASH_Unlock(); //不解锁FALSH也可设置读保护,可用可不用
      l  Y6 N3 |: I0 u0 }; k; F
  6.     FLASH_ReadOutProtection(DISABLE);; {9 s& l4 ~" x& t- O
  7.     FLASH_Lock();   //上锁
    * ^; l4 B5 p) S  l( P
  8.   }1 d; u0 d! Q8 a6 S. Z
  9. }
复制代码
程序中设置一个按键或者命令,可以随时解除Flash的读保护,让芯片又可以重新烧录程序。如果没有留,还可以专门写一个程序,下载到RAM中去运行,用来解除读保护。
$ e' R5 @  C, Y3 \, [) O' A8 R- ^7 \4 E/ o9 {) W

8 U* P" I0 I: Z2 |! i+ D    注意:执行后,Flash会自动全部擦除。% w: S6 x& G% m( X  w

  1. ( E8 T3 \2 Y0 z3 ]/ i; Q( u
  2. int main(void)
    % x- v# v7 C. {! m( j5 K4 e
  3. {
    8 ^' `/ [6 P6 F5 R  u" [
  4. Chip_Init();/ H) C2 D9 H1 b6 M
  5.   FLASH_Unlock(); //不解锁FALSH也可设置读保护,可用可不用
    ) k. A7 h- p3 i1 R
  6.   FLASH_ReadOutProtection(DISABLE);) `2 m' q2 H8 o' t
  7. }
复制代码
通过ST-Link Utility来解除Flash保护
% M4 w! a, W7 k, [1 S) y' z1 u' }( R+ j3 Q

! p& j7 P- i1 N2 m7 D    在STLink连接目标板的情况下打开程序烧写软件ST-Link Utility,在菜单栏的Target下选择connect,因为这时候Flash已经被锁住了,能看到如下图所示的错误提示。+ ^/ Z& V: [* |3 o7 X
16.png
    下面来操作如何解除Flash保护。, m# t( B# y$ q7 p
  W) s5 K2 }9 t5 H3 o& ?
" M7 t9 o7 \8 ?& ~# D7 ?
    请确保当前已经正确连接了STLink和目标板,在菜单栏Target里打开Option Bytes...选项,发现在这里Read Out Protection选项是Enable,这个表示无法通过SWD读取STM32内部Flash的程序。
3 Y: [, u5 v/ C$ h9 x. M# I5 L5 C
17.png
    将Read Out Protection选项设置为Disable,并点击Apply。
/ i5 o, D# r9 L, k4 o; I
5 o, q8 m7 [+ J* s  R$ i
. M/ C2 ^/ b' N+ a9 a! W$ |, x
    这时候Flash已经成功解锁了,跟上文提到的解除Flash保护的结果一样,内部Flash已经被擦除了,如下图红框中所示。
* Q9 l( R; i% L- ]
18.png
    完成以上步骤之后,在菜单栏Target下选择Disconnect断开与目标板连接。
7 y# }+ b" M! ]- \8 N- o
: ~  b; S" q/ q

) K' e* C# }4 q% x/ y7 O# K    重新进入MDK,可以正常对目标板烧写程序了。/ L# p: t9 Q0 o1 n2 J) w5 i# e/ H
1 _6 u7 v- M# z0 Q+ y
1 Q% g5 a5 T' Z2 M9 M1 \
通过ST-Link Utility来设置Flash保护5 w& t- r0 N8 m9 W0 b9 Y& g2 W
19.png
    在菜单栏Target里打开Option Bytes...选项,可以看到下面有Flash sector protection选项。选择Select all之后,发现所有Page的Protection项都已经变成Write Protection了,只要选择Apply选项就可以对Flash进行写保护,如上图所示。. j! j+ i1 ]" K+ Z0 F5 _* h

( T9 I$ q' \* k5 P8 H) P+ g

. E4 a9 Y1 m/ ^+ N* Y
4 L* l; K5 G9 M. R

3 |1 s/ E9 H+ F. R: |& ~' e5 M, Z. I" T
收藏 评论1 发布时间:2021-9-17 14:21

举报

1个回答
1+1=2 回答时间:2021-9-18 10:20:31
操作步骤:步骤一:配置BOOT0和BOOT1引脚电平,使程序可以在RAM中运行9 c0 Y8 v3 Z$ }! j" i3 N
步骤二:下载程序到RAM中,通过在RAM中运行程序进行flash读写保护的解除
: {' `9 L- X: U0 O' h; r+ g3 \步骤三:正常下载程序& c4 L# d; Z& b/ R& t4 z. Y

所属标签

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