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

STM32学习之Flash(主存储块、系统存储器和选项字节)详解2

[复制链接]
奮闘ing 发布时间:2015-11-23 17:33
选项字节
4 x/ V8 y4 Z" w0 @4 w. z     选项字节用于存储芯片使用者对芯片的配置信息。& a8 o+ ], i0 b: i' M  O& ~) d2 J2 p
目前,所有的STM32101xx、STM32102xx、STM32103xx、STM32105xx、STM32107xx产品,选项字节都是16字节。但是这16字节,每两个字节组成一个正反对,即,字节1是字节0的反码,字节3是字节2的反码,...,字节15是字节14的反码,所以,芯片使用者只要设置8个字节就行了,另外8个字节系统自动填充为反码。因此,有时候,也说STM32的选项字节是8个字节,但是占了16字节的空间。选项字节的8字节正码概述如下:

8 E; ]: G% }7 C" o" `, w+ z# T8 W) S: W5 f
RDP   字节0。读保护字节,存储对主存储块的读保护设置。 ; Z. c+ f' @# t* k6 f5 n: _) b
USER  字节2。用户字节,配置看门狗、停机、待机。 & }1 ]; \8 u4 J2 }" ~& w0 n
Data0  字节4。数据字节0,由芯片使用者自由使用。 - F- h( D( C, s, ?& w" Q
Data1  字节6。数据字节1,由芯片使用者自由使用。
; P, j, J2 O+ \) XWRP0  字节8。写保护字节0,存储对主存储块的写保护设置。 ( a9 l7 P' h$ h6 @
WRP1  字节10。写保护字节1,存储对主存储块的写保护设置。
7 W, ?0 g* P' I  d6 F, O8 W" oWRP2  字节12。写保护字节2,存储对主存储块的写保护设置。 2 ^1 q& u- f4 b* i# I, |# ^
WRP3  字节14。写保护字节3,存储对主存储块的写保护设置。 + w$ q& h1 y6 H6 p7 U/ S, e0 D

1 w% R- z7 a4 e' k9 W选项字节写使能
& ]' b0 G5 h( v, ]
     在FLASH_CR中,有一个OPTWRE位,该位为0时,不允许进行选项字节操作(擦除、编程)。这称为选项字节写使能。只有该位为1时,才能进行选项字节操作。 该位不能软件置1,但可以软件清零。只有向FLASH_OPTKEYR依次写入KEY1和KEY2后,硬件会自动对该位置1,此时,才允许选项字节操作。这称为解锁(打开)选项字节写使能。该位为1后,可以由软件清零,关闭写使能。复位后,该位为0。错误操作不会永远关闭写使能,只要写入正确的键序列,则又可以打开写使能。写使能已打开时,再次打开,不会出错,并且依然是打开的。 很显然,进行选项字节操作前,先要解开闪存锁,然后打开选项字节写使能,之后,才能进行选项字节操作。 3 J# P+ q: K" ?; o( L( r

1 K4 d  o& t# C$ R6 u: i) a9 N/ z9 z选项字节擦除 & w7 h/ w' L: i' T9 L2 u
     建议使用如下步骤对选项字节进行擦除: 9 ~7 |4 h/ {, B3 ]* v
1.检查FLASH_SR寄存器的BSY位,以确认没有其他正在进行的闪存操作。  

" O+ ^: D* g" G- z; T3 }2.解锁FLASH_CR寄存器的OPTWRE位。即,打开写使能。 5 f0 U1 @1 T' C& r. A& c' o
3.设置FLASH_CR寄存器的OPTER位为1。选择选项字节擦除操作。  
* H0 W/ w. T& S, A/ D4 y
4.设置FLASH_CR寄存器的STRT位为1。 3 o0 K' M+ _8 C) `
5.等待FLASH_SR寄存器的BSY位变为0,表示操作完成。 3 G3 z6 ^2 _) H3 x# B7 f
6.查询FLASH_SR寄存器的EOP位,EOP为1时,表示操作成功。
1 `& |9 ?1 |! k* E4 f9 k
7.读出选项字节并验证数据。
# ?9 X, @& |) B( K& j由于选项字节只有16字节,因此,擦除时是整个选项字节都被擦除了。
# Y6 P& J+ u% ~4 B7 h2 P9 P+ S' Z  E7 [
选项字节编程 0 K0 j/ R5 O8 Q% J) R
     建议使用如下步骤对选项字节进行编程: 6 F2 j+ c8 P- l; y1 S
1.检查FLASH_SR寄存器的BSY位,以确认没有其他正在进行的编程操作。  
3 J; D. l$ ?& I9 \1 L6 G! w& t2.解锁FLASH_CR寄存器的OPTWRE位。即,打开写使能。  ! y- M7 ]6 I3 a5 _) k3 A
3.设置FLASH_CR寄存器的OPTPG位为1。选择编程操作。  
. G+ |/ y  p: B+ N# ^+ A4.写入要编程的半字到指定的地址。启动编程操作。 ) Q1 Q8 c8 ~9 ~& W
5.等待FLASH_SR寄存器的BSY位变为0,表示操作完成。 , X# r1 k4 n' l7 Y$ M
6.查询FLASH_SR寄存器的EOP位,EOP为1时,表示操作成功。
+ F4 F( g2 q3 `6 R5 A) q3 w  W7.读出写入的选项字节并验证数据。 对选项字节编程时,FPEC使用半字中的低字节并自动地计算出高字节(高字节为低字节的反码),并开始编程操作,这将保证选项字节和它的反码始终是正确的。 " \+ g* X. U, L+ K3 `# L/ y. e
; P: B2 n$ }; f' @8 {
主存储块的保护
! v9 @2 v- P; C- O     可以对主存储块中的数据进行读保护、写保护。 读保护用于保护数据不被非法读出。防止程序泄密。 9 [" B- ?! }; i- o: ]
写保护用于保护数据不被非法改写,增强程序的健壮性。
& j& ?. B. @/ ~- \% p2 C$ L$ d2 H* f! Y
读保护
6 a  r5 X4 ]* J  R3 h7 u+ Q     主存储块启动读保护后,简单的说具有以下特性:
" ?4 d/ x/ l) L8 K$ J, J5 F1.从主存储块启动的程序,可以对整个主存储块执行读操作,不允许对主存储块的前4KB进行擦除编程操作,可以对4KB之后的区域进行擦除编程操作。 . I3 r$ W! S! p7 m
2.从SRAM启动的程序,不能对主存储块进行读、页擦除、编程操作,但可以进行主存储块整片擦除操作。
+ K- @- }% u! x- }* z5 w3.使用调试接口不能访问主存储块。这些特性足以阻止主存储器数据的非法读出,又能保证程序的正常运行。
! e1 V- r6 s- K% S! Q& ?4 E只有当RDP选项字节的值为RDPRT键值时,读保护才被关闭,否则,读保护就是启动的。因此,擦除选项字节的操作,将启动主存储块的读保护。如果要关闭读保护,必须将RDP选项字节编程为RDPRT键值。并且,如果编程选项字节,使RDP由非键值变为键值(即由保护变为非保护)时,STM32将会先擦除整个主存储块,再编程RDP。芯片出厂时,RDP会事先写入RDPRT键值,关闭写保护功能。
+ e9 _5 b& n7 K; d
7 V$ X& Y2 o; C" P, i: I* U写保护
2 L* x8 ^7 D! W1 b8 D. |& }      STM32主存储块可以分域进行写保护。如果试图对写保护的域进行擦除或编程操作,在闪存状态寄存器(FLASH_SR)中会返回一个写保护错误标志。STM32主存储块每个域4KB,WRP0-WRP3选项字节中的每一位对应一个域,位为0时,写保护有效。对于超过128KB的产品,WRP3.15保护了域31及之后的所有域。显然,擦除选项字节将导致解除主存储块的写保护。0 C$ q7 v# a$ z. k$ c) E

+ G# u) g6 i* ^1 i- c选项字节与它的寄存器映象 # [0 [/ B7 V) m6 i# J8 o
我们知道,FPEC有两个寄存器存储了选项字节的映象。那么,选项字节本体(在FLASH中)与映象(在寄存器中)究竟有什么区别呢?
$ r7 M) G" [5 q+ o3 U* F6 s选项字节的本体只是个FLASH,它的作用只是掉电存储选项字节内容而以,真正起作用的是寄存器中的映象。即,一个配置是否有效,不是看本体,而是看映象。而映象是在复位后,用本体的值加载的,此后,除非复位,映象将不再改变。所以,更改本体的数据后,不会立即生效,只有复位加载到映象中后,才会生效。 有一点要注意的是,当更改本体的值,使主存储块读保护变为不保护时,会先擦除整片主存储块,然后再改变本体。这是唯一一个改变本体会引发的动作。但即使这样,读保护依然要等到复位后,加载到映象后,才会解除。 3 }; p% ]) G: K$ v& U
  0 v: `1 ^" ?% ~
关于FLASH编程手册中文版的几处错误(不一定是,但是与我的理解不符)

1 w$ O# p  G5 C5 s" c) F9 R1.选项字节编程一节中: ! ?- \; s* y+ N: Q9 s' V( s+ i- R3 y
对FPEC解锁后,必须分别写入KEY1和KEY2(见2.3.1节)到FLASH_OPTKEYR寄存器,再设置FLASH_CR寄存器的OPTWRE位为’1’,此时可以对选项字节进行编程 ( V6 h# y, p* q, N" R6 v: {8 |
实际上,对FLASH_OPTKEYR写入KEY1和KEY2后,OPTWRE位会被硬件置1,而不是用软件写1。这一点在后面的寄存器描述中也可以得到验证。 2.对读保护的描述中:
5 ^& q" ?0 A. G; p; Q$ ^+ i对读保护的数值对无法理解。正确的应该是,RDP为RDPRT键值时,解除读保护,为其它值时,读保护生效。
- w5 A3 ]1 ~2 L" B! ~% [; o# @

  E3 Z# b2 u2 v0 ]3 V3 N
- h6 L2 U+ q' K, q9 W8 ]看了半天,原来只要几句就可以解决,当然是不考虑其他功能,只是简单的读写操作。
- n; }6 B9 n( i5 A$ _  [其中写操作如下:
9 u$ A- }9 k0 p' r/ I     FLASH_Unlock();  //解锁FLASH编程擦除控制器
2 P: g- R1 }& e6 l( N9 G& P8 _" g     FLASH_ClearFlag(FLASH_FLAG_BSY|FLASH_FLAG_EOP|FLASH_FLAG_PGERR|FLASH_FLAG_WRPRTERR);//清除标志位6 c  n" g! B6 s# F$ A! L6 @
     /*********************************************************************************
' p  g2 z1 u: i! D5 s! n' a( E2 j          //               FLASH_FLAG_BSY            FLASH忙标志位
, {0 m: i2 `5 v$ h2 s$ \1 y$ [          //               FLASH_FLAG_EOP            FLASH操作结束标志位
7 t0 `. W. a* Y0 E5 A          //               FLASH_FLAG_PGERR            FLASH编写错误标志位8 {; T: Y0 ?4 b
          //               FLASH_FLAG_WRPRTERR       FLASH页面写保护错误标净         / Q8 E9 I9 Q. L& F$ t
     **********************************************************************************/9 T3 Q0 A$ J3 J4 ~1 v" ~+ w0 t
     FLASH_ErasePage(FLASH_START_ADDR);     //擦除指定地址页
" [8 c( [2 o3 E  E' M: W% S$ B, y     FLASH_ProgramHalfWord(FLASH_START_ADDR+(addr+i)*2,dat); //从指定页的addr地址开始写/ h0 r% f8 w% V3 l0 _5 `
     FLASH_ClearFlag(FLASH_FLAG_BSY|FLASH_FLAG_EOP|FLASH_FLAG_PGERR|FLASH_FLAG_WRPRTERR);//清除标志位
9 [( A- H# {' \! w( r     FLASH_Lock();    //锁定FLASH编程擦除控制器
( p& b& O: v) a
- C. z/ T6 Y: z; i, @4 Q* U7 A从上面可以看出基本顺序是:解锁-》清除标志位(可以不要)-》擦除-》写半字-》清楚标志位(也可以不要)-》上锁。其中FLASH_START_ADDR是宏定义的0x8000000+2048*255,0x8000000是Flash的起始地址,2048是因为我用的是大容量芯片,根据上一笔记Flash地址可以看出芯片每页容量2K,即2048字节,255表示芯片的最后一页,这个根据不同芯片而定。之所以从后面页写起可以防止储存数据破坏用户程序。addr*2是因为每个数据占用2字节(半字),虽然写入的是1字节数据,但是编程是2字节为单位,也就是说一个字节的数据也会占用两个字节地址。2 l! Y4 z, h- h# X5 }2 y

: B2 m* m( s4 H- d& r& o: v, C读操作如下:
7 T% s  v; H( t7 q+ _. y    u16 value;) d  a1 a  j+ Z) G1 C% t
    value = *(u16*)(FLASH_START_ADDR+(addr*2));//从指定页的addr地址开始读
8 a* C" P4 f' }+ S7 I
收藏 4 评论4 发布时间:2015-11-23 17:33

举报

4个回答
Paderboy 回答时间:2015-11-23 18:38:07
呵呵。沙发哦。。。。( y( E, a* V# @( h5 g, o0 t
埃斯提爱慕 回答时间:2015-11-23 21:02:05
提示: 作者被禁止或删除 内容自动屏蔽
枫之叶 回答时间:2016-5-13 09:16:20
很好欸!还给了例子~这下可以对着看了~~
无薪税绵 回答时间:2017-1-26 22:20:06
这资料很好,谢谢楼主了。

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版