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

【经验分享】STM32的Flash写了保护怎么办?

[复制链接]
STMCU小助手 发布时间:2022-3-14 21:53
关于STM32对内部Flash的保护 3 F, T8 V" V5 E' q+ k- @* y
    为了防止对Flash的非法访问,所有STM32的芯片都提供对Flash的保护,具体分为写保护和读保护。
    如果对Flash设置了写保护,那就无法对Flash进行编程和擦除。在开发STM32的时候,如果出现这种情况,通常仿真器都支持对Flash进行解锁,像jlink,stlink等仿真器都支持这个功能。
    在使用MDK进行调试的时候,可能会遇到如下图所示的报错信息,这时候就要排查Flash是不是被保护起来了。
/ ?8 \* [7 h& K2 q3 P; s0 J: `
Y]JPGI[{_9{OV{RELK$G.png
# X; M0 v( t4 ~/ ~
    读保护即大家通常说的“加密”,是作用于整个Flash存储区域。一旦设置了Flash的读保护,内置的Flash存储区只能通过程序的正常执行才能读出,而不能通过下述任何一种方式读出:+ R6 r3 {) m, B! B+ P
  • 通过调试器(JTAG或SWD)
  • 从RAM中启动并执行的程序

    # R8 y5 ~5 y7 J2 O& ?' I7 v
    写保护是以四页(1KB/页) Flash存储区为单位提供写保护,对被保护的页实施编程或擦除操作将不被执行,同时产生操作错误标志,读与写设置的效果见下表:
" ~- b( c6 G* b9 ?- o. T: v
{T`I}2VIH@3@_QFCY7@IB4H.png

; i* B+ [$ m  m4 k* K) X# E' Q
    当Flash读保护生效时,CPU执行程序可以读受保护的Flash区,但存在两个例外情况: ; k7 W  c8 Y9 M4 q4 h+ s& s
  • 调试执行程序时
    / f2 N  D0 V' F- i$ c6 P' L
  • 从RAM启动并执行程序时
    8 S4 `; r: \& Z- y# Y1 Z

    ( e9 u+ I* w7 K/ o9 [
    : X5 ?% q& d8 U5 s) y
    STM32还提供了一个特别的保护,即对Flash存储区施加读保护后,即使没有启用写保护,Flash的第 0 ~ 3 页也将处于写保护状态,这是为了防止修改复位或中断向量而跳转到RAM区执行非法程序代码。

9 c5 }: g; _% C6 B- n" y- `Flash保护的相关函数   
  1. <font face="Tahoma" size="3">FLASH_Unlock();   //Flash解锁 </font><div><font face="Tahoma" size="3">FLASH_ReadOutProtection(DISABLE);  //Flash读保护禁止   </font></div><div><font face="Tahoma" size="3">FLASH_ReadOutProtection(ENABLE);   //Flash读保护允许</font></div>
复制代码

' s' X% m4 z7 y, z
STM32如何设置读保护和解除读保护?
    读保护设置后将不能读出Flash中的内容。
- u! L7 g2 F$ U( j4 |
如何设置读保护
    在程序的开头加入“设置读保护”的代码即可,每次运行代码时都检查一下,如果没有开就打开,如果打开了就跳过。其中,设置读保护的代码如下:
  1. int main(void)
    , ^$ e" G/ l  {2 Y
  2. {
    " y. h- M) i) |' N5 D0 [/ V
  3.   ...- b( z  {# H6 W/ w* k
  4. if (FLASH_GetReadOutProtectionStatus()!=SET)//检查设置读保护与否7 a, C9 D% {! S& L" t6 L
  5.   {/ S1 Z+ A# T6 f& d, ~/ C# i8 _
  6.     FLASH_Unlock();         //写保护时可以不用这句话,可用可不用& f# Z; D7 X7 J
  7.     FLASH_ReadOutProtection(ENABLE);     //设置读保护
    ( b4 W3 P+ m( U
  8.   }
    ; q+ K& h0 p2 |
  9.   ..., O, C- K: y: J6 t2 Q/ {; s2 x
  10. while(1)
    * |. Z; l0 ]$ {# I8 }
  11.   {1 M' U$ B' N- {! V! s- a  `5 h
  12.     ...
    ! Q( z: _' P, x. H) Y
  13.   }
    $ \5 s' ^0 I# e
  14. }
复制代码

" d5 W7 A" d+ c% d/ ~8 A! S7 }& a6 {" T7 U6 \& h
    上面的代码执行后,使用j-link就不能读出程序了,实现了代码读保护。需要注意的是,芯片读保护后无法再次烧写新的程序到Flash中,必须要解除读保护才可以。但是当解除读保护的时候STM32会自动擦除整个Flash,起到保护数据的作用。

$ N4 Y9 e( a4 U' V* L3 {6 e% i2 v
通过代码解除Flash保护: o7 Y3 ~8 z. H2 g- r  T
    解除读保护可以设置在按键里面,方便实现解锁,也可以设置在命令中。如下是解除读保护代码:
  1. void Off_Protect(void) //关闭保护  Z) N8 g0 ?, J8 C. n$ d
  2. {
    ) S3 C, _1 ^. W" f
  3. if(FLASH_GetReadOutProtectionStatus() != RESET)2 Z* G5 F' s1 j8 J
  4.   {
    / q  s* X6 P* i* \/ }$ [6 F9 \
  5.     FLASH_Unlock(); //不解锁FALSH也可设置读保护,可用可不用
    " r* K: Z; q0 L+ S% g. m
  6.     FLASH_ReadOutProtection(DISABLE);
    3 j' H' c' T# d! G4 l
  7.     FLASH_Lock();   //上锁0 C& W4 k/ q+ O" E" ~
  8.   }5 {: v; x2 U/ B! _6 @" ]. M
  9. }
复制代码
    程序中设置一个按键或者命令,可以随时解除Flash的读保护,让芯片又可以重新烧录程序。如果没有留,还可以专门写一个程序,下载到RAM中去运行,用来解除读保护。
    注意:执行后,Flash会自动全部擦除。
  1. int main(void)
    & f+ Z% T9 |) ]* p9 {; w& ]1 J) y
  2. {0 d' \  _1 Y2 R
  3. Chip_Init();
    ( T  X( s& H8 w9 v1 B) J. S6 E
  4.   FLASH_Unlock(); //不解锁FALSH也可设置读保护,可用可不用' a3 E$ [' M6 |1 [, ?; N
  5.   FLASH_ReadOutProtection(DISABLE);
    # f+ s# g- U; P* U0 b% P
  6. }
复制代码

* m( E: s9 P1 x! Z' a6 w8 P
通过ST-Link Utility来解除Flash保护
    在STLink连接目标板的情况下打开程序烧写软件ST-Link Utility,在菜单栏的Target下选择connect,因为这时候Flash已经被锁住了,能看到如下图所示的错误提示。

2 r/ ?! ?  D8 ^8 s) v- g
%U54CS_}CUJIHO(7`IOD0[6.png

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

% R2 R* t7 j: L# [6 I$ m' T
M5~21]2RWFIPUMH$W1FPQ.png
" b' v( F9 k! d7 v( E
    将Read Out Protection选项设置为Disable,并点击Apply。
    这时候Flash已经成功解锁了,跟上文提到的解除Flash保护的结果一样,内部Flash已经被擦除了,如下图红框中所示。
FD6D75G8G0NSS{MV}E]4I.png
6 C- Y# V3 ^# y* m4 l
3 T- M9 m* j* t5 I2 ?% J
    完成以上步骤之后,在菜单栏Target下选择Disconnect断开与目标板连接。
    重新进入MDK,可以正常对目标板烧写程序了。
通过ST-Link Utility来设置Flash保护

1 V3 _8 ^/ @! p' X9 X
8FJVF%YWZ)8YXNP_2{H5IV5.png
" O0 Q/ V) j3 T% s$ ]$ K+ j
    在菜单栏Target里打开Option Bytes...选项,可以看到下面有Flash sector protection选项。选择Select all之后,发现所有Page的Protection项都已经变成Write Protection了,只要选择Apply选项就可以对Flash进行写保护,如上图所示。
/ ~5 {0 p2 E% b$ B. u. _

7 g( K5 C! f2 [, v8 X$ A4 F
赞 收藏 评论0 发布时间:2022-3-14 21:53

举报

0个回答

所属标签

相似技术帖

官网相关资源

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