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

STM32的Flash写了保护怎么办?

[复制链接]
STMCU小助手 发布时间:2021-9-17 14:21
关于STM32对内部Flash的保护
    为了防止对Flash的非法访问,所有STM32的芯片都提供对Flash的保护,具体分为写保护和读保护。! E6 z) F6 u( A; }; b$ @" g

; I4 C+ Z3 `. L) S+ z

, o* _, o6 x6 E$ c' @% c7 `    如果对Flash设置了写保护,那就无法对Flash进行编程和擦除。在开发STM32的时候,如果出现这种情况,通常仿真器都支持对Flash进行解锁,像jlink,stlink等仿真器都支持这个功能。4 u& |& d6 E2 |% l% V
# O) b" T  _$ Q5 Y# F$ r+ r* x4 J1 H
  Y* ~; f6 Q" Q% k
    在使用MDK进行调试的时候,可能会遇到如下图所示的报错信息,这时候就要排查Flash是不是被保护起来了。
. \. Z* m+ ?$ T0 h4 g. K  w# k
13.png
    读保护即大家通常说的“加密”,是作用于整个Flash存储区域。一旦设置了Flash的读保护,内置的Flash存储区只能通过程序的正常执行才能读出,而不能通过下述任何一种方式读出:
% ~, q# F" P7 D1 l+ ?( l8 g1 X  k6 ^" G" m  H  N) M% N0 v

% O0 ^+ g8 y3 }. c- z通过调试器(JTAG或SWD), j. r6 `' N% t8 f5 e

+ v# P! ^! A& e9 G0 h5 m8 d+ Y

+ }, C7 Z2 ~( M( W! v& d6 ]0 f. r* e8 j从RAM中启动并执行的程序
0 L! f; d8 Q9 z$ ^- {1 c9 _- i1 w: R4 j

& i6 Y. b  H+ C# g& B/ }# g    写保护是以四页(1KB/页) Flash存储区为单位提供写保护,对被保护的页实施编程或擦除操作将不被执行,同时产生操作错误标志,读与写设置的效果见下表:
' U( M& m- C  `& I
15.png
    当Flash读保护生效时,CPU执行程序可以读受保护的Flash区,但存在两个例外情况: 1 \4 v, ]0 W$ }* z0 T; \! r
  [0 B/ o( x+ b

2 U2 D; C! c& F, N1 G; {/ j调试执行程序时
: r; T9 @" c6 I# T5 V4 Y  |. G3 v8 B6 U( C
3 a, e( Q' [! j6 C& w/ G& m, P
从RAM启动并执行程序时 8 H8 n) y  ^1 E9 i3 W& s7 _& O

6 y+ U3 x3 g( Y6 E% a$ C, S! C& q7 j4 c
3 x7 u" n1 r* Q, F7 [
    STM32还提供了一个特别的保护,即对Flash存储区施加读保护后,即使没有启用写保护,Flash的第 0 ~ 3 页也将处于写保护状态,这是为了防止修改复位或中断向量而跳转到RAM区执行非法程序代码。
2 ^6 B7 l5 m; y9 I9 O; A# NFlash保护的相关函数./ E+ m( A8 A9 C1 z) M
  1. FLASH_Unlock();   //Flash解锁
    1 ^6 {% Y  w" K# |; i
  2. FLASH_ReadOutProtection(DISABLE);  //Flash读保护禁止   
    6 h3 r, y2 ]' G1 h7 M5 z4 w
  3. FLASH_ReadOutProtection(ENABLE);   //Flash读保护允许
复制代码
STM32如何设置读保护和解除读保护?
. Q% i2 }8 D9 |8 j% ?
2 B2 v5 V6 o1 G1 j
6 _% _$ O8 r0 q' B' V: a
    读保护设置后将不能读出Flash中的内容。
' G0 D/ |+ v8 X2 p+ s7 A$ w/ `: g; n+ q7 ~( C

2 e, b1 `1 V) m4 f6 f; M如何设置读保护& a+ r3 o  K  u% d4 }6 V/ l2 r

9 t1 R9 A5 R- l4 R) V( z
) E; Y2 k7 u( q& H5 P% R* h
    在程序的开头加入“设置读保护”的代码即可,每次运行代码时都检查一下,如果没有开就打开,如果打开了就跳过。其中,设置读保护的代码如下:
$ ~5 Q9 `0 A& [

  1. 9 S7 p3 W* Z: z2 G0 `& O
  2. int main(void)
    6 p5 |4 B: f  l
  3. {
    ! V+ D+ ?0 Y# `" F" Z; f
  4.   ...3 }4 |4 I% C$ y8 N7 \4 M. L! g
  5.   if (FLASH_GetReadOutProtectionStatus()!=SET)//检查设置读保护与否
    4 [! _2 ~" i, [& H( K7 h! ]& J
  6.   {
    7 E. S  l2 b$ t0 a; e# V' _
  7.     FLASH_Unlock();         //写保护时可以不用这句话,可用可不用+ G! a$ q& u) r" t( m! D
  8.     FLASH_ReadOutProtection(ENABLE);     //设置读保护
    : v3 k7 g! R4 u0 j1 o$ \' d
  9.   }
    - Z. Y, a6 O  ~- G( h8 q6 o
  10.   .../ g% B( @+ C& Y4 {! o" o+ J. h9 F( e
  11.   while(1)3 D9 g% b9 M+ E+ x4 I$ r$ F
  12.   {! ]$ e& o5 Y9 R3 A' \
  13.     ...; x' B' m3 t( ?+ s9 I/ Q
  14.   }  M; s, b9 ]+ W/ ^
  15. }
复制代码
上面的代码执行后,使用j-link就不能读出程序了,实现了代码读保护。需要注意的是,芯片读保护后无法再次烧写新的程序到Flash中,必须要解除读保护才可以。但是当解除读保护的时候STM32会自动擦除整个Flash,起到保护数据的作用。
# v7 z- d1 r3 ^3 D; H- S, M
  X: f( W  f& I- q3 `3 G- f
# Q( t: y' a2 L
通过代码解除Flash保护7 _4 \2 P9 B# s7 W

4 s* C2 b5 x; C% @9 S, j
) ^" i6 i9 H" x% C6 C$ B5 F" x
    解除读保护可以设置在按键里面,方便实现解锁,也可以设置在命令中。如下是解除读保护代码:
9 E" y& q& Q) E" C6 `! U
  1. void Off_Protect(void) //关闭保护* x, P3 V/ {* I
  2. {
    ' _; {: G7 V% d; Q1 ?! ?' b: }
  3. if(FLASH_GetReadOutProtectionStatus() != RESET)5 [6 F% l- \) k  I7 r) z
  4.   {
    0 u# K0 b: g6 C+ y6 {
  5.     FLASH_Unlock(); //不解锁FALSH也可设置读保护,可用可不用
    ' S0 A/ b( Q% s. [) T1 f
  6.     FLASH_ReadOutProtection(DISABLE);" _! Q2 }) S3 L/ l
  7.     FLASH_Lock();   //上锁
    # c$ S0 S7 N7 L+ b+ D! l, o
  8.   }# N8 S1 K5 N( P! }
  9. }
复制代码
程序中设置一个按键或者命令,可以随时解除Flash的读保护,让芯片又可以重新烧录程序。如果没有留,还可以专门写一个程序,下载到RAM中去运行,用来解除读保护。
) \* o- h. s9 K- V; H: L; A+ Z5 g0 Q

* g0 u$ ?* c2 u+ \) @( Y+ f( B! h    注意:执行后,Flash会自动全部擦除。
3 R% {( q2 v5 z: B6 D8 N* ]
  1. 9 Q: L9 ?! d1 F( I2 V- [# L2 r; W
  2. int main(void)
    & f% S+ B  `; s7 L; R# R  R9 v  ?
  3. {
    5 P) ~8 i4 t& b
  4. Chip_Init();
    ( G2 {3 E/ _0 D; U& {# }' L; R+ l
  5.   FLASH_Unlock(); //不解锁FALSH也可设置读保护,可用可不用$ l8 S1 x! n9 }, O
  6.   FLASH_ReadOutProtection(DISABLE);* j2 u# A2 G7 m
  7. }
复制代码
通过ST-Link Utility来解除Flash保护- P. [+ W9 Y* K* a2 B* L( t! f

& P3 Y4 [# P% ~* h  a

2 G1 [$ t- P; B2 D( n7 B    在STLink连接目标板的情况下打开程序烧写软件ST-Link Utility,在菜单栏的Target下选择connect,因为这时候Flash已经被锁住了,能看到如下图所示的错误提示。
1 t& j- G8 C6 E9 y
16.png
    下面来操作如何解除Flash保护。- ^( |( ?9 D; {- e
8 a9 n% x# H$ M4 j: B. q' w. x

9 h0 E0 N3 T' D    请确保当前已经正确连接了STLink和目标板,在菜单栏Target里打开Option Bytes...选项,发现在这里Read Out Protection选项是Enable,这个表示无法通过SWD读取STM32内部Flash的程序。" F; C; Q  Z8 C3 I/ q- c2 n
17.png
    将Read Out Protection选项设置为Disable,并点击Apply。7 p# F2 j8 L& A9 O, E; [, \! W

& l3 L- V9 U, t" ]6 P5 q
0 _- X4 E1 g9 O  N$ V% q
    这时候Flash已经成功解锁了,跟上文提到的解除Flash保护的结果一样,内部Flash已经被擦除了,如下图红框中所示。4 q' r7 C2 \0 D
18.png
    完成以上步骤之后,在菜单栏Target下选择Disconnect断开与目标板连接。' r/ h, X& k' ^6 A; m
! J+ n) q8 I; \( n+ @- x: V
; @. Y2 U& `  t! i
    重新进入MDK,可以正常对目标板烧写程序了。
/ N9 x2 v1 a' R7 ~0 g  ]
) Q8 d7 E. F5 E& t4 d

: n) u* V6 G( F: y4 _4 H通过ST-Link Utility来设置Flash保护5 A+ q# O+ c4 x) ~2 |
19.png
    在菜单栏Target里打开Option Bytes...选项,可以看到下面有Flash sector protection选项。选择Select all之后,发现所有Page的Protection项都已经变成Write Protection了,只要选择Apply选项就可以对Flash进行写保护,如上图所示。! k3 y( J3 A% N$ J/ v  {
: o: }7 u9 L1 D9 d$ n

: q3 C7 h; M2 ]& w* l5 }$ a$ O' f: G
5 {1 y* A) }7 Z) E8 @9 z
4 ]0 z" z8 o# ?0 ~2 u5 v
6 m% u& `* S7 ?/ T3 \* g4 |
赞 收藏 评论1 发布时间:2021-9-17 14:21

举报

1个回答
1+1=2 回答时间:2021-9-18 10:20:31
操作步骤:步骤一:配置BOOT0和BOOT1引脚电平,使程序可以在RAM中运行& l% `9 H2 e) q- b) g1 C$ k
步骤二:下载程序到RAM中,通过在RAM中运行程序进行flash读写保护的解除
( X* o# Z7 n1 z步骤三:正常下载程序; f- Z6 h6 k% w9 r* `9 `9 ^
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版