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

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

[复制链接]
奮闘ing 发布时间:2015-11-23 17:33
选项字节
: W/ R3 S0 c' z1 w# q% I  M7 X     选项字节用于存储芯片使用者对芯片的配置信息。
- n* `" q8 U  ^" \3 T: r目前,所有的STM32101xx、STM32102xx、STM32103xx、STM32105xx、STM32107xx产品,选项字节都是16字节。但是这16字节,每两个字节组成一个正反对,即,字节1是字节0的反码,字节3是字节2的反码,...,字节15是字节14的反码,所以,芯片使用者只要设置8个字节就行了,另外8个字节系统自动填充为反码。因此,有时候,也说STM32的选项字节是8个字节,但是占了16字节的空间。选项字节的8字节正码概述如下:
# n5 `* S! T1 t% a$ J" g

3 g, g. I0 N  ]RDP   字节0。读保护字节,存储对主存储块的读保护设置。 % e: ~) I. h1 w$ k
USER  字节2。用户字节,配置看门狗、停机、待机。
% A$ t1 M) ^; R+ g: gData0  字节4。数据字节0,由芯片使用者自由使用。
# A, N/ i8 [  S2 W, Q; h% \% zData1  字节6。数据字节1,由芯片使用者自由使用。 7 H5 r( n# W6 I7 V
WRP0  字节8。写保护字节0,存储对主存储块的写保护设置。
) S) N7 p' A: Y# g1 ]! HWRP1  字节10。写保护字节1,存储对主存储块的写保护设置。4 l( T( B2 a% B8 N' ^
WRP2  字节12。写保护字节2,存储对主存储块的写保护设置。 : M8 N/ T; k0 b0 @: r
WRP3  字节14。写保护字节3,存储对主存储块的写保护设置。 ! S  d' f' U- h7 u( h+ v
1 f9 Z2 q% D$ T6 j) ~) T
选项字节写使能
( n7 j+ t- ^0 A5 k/ G  U  E, G
     在FLASH_CR中,有一个OPTWRE位,该位为0时,不允许进行选项字节操作(擦除、编程)。这称为选项字节写使能。只有该位为1时,才能进行选项字节操作。 该位不能软件置1,但可以软件清零。只有向FLASH_OPTKEYR依次写入KEY1和KEY2后,硬件会自动对该位置1,此时,才允许选项字节操作。这称为解锁(打开)选项字节写使能。该位为1后,可以由软件清零,关闭写使能。复位后,该位为0。错误操作不会永远关闭写使能,只要写入正确的键序列,则又可以打开写使能。写使能已打开时,再次打开,不会出错,并且依然是打开的。 很显然,进行选项字节操作前,先要解开闪存锁,然后打开选项字节写使能,之后,才能进行选项字节操作。
$ B/ ~2 E# v7 ?6 p. A% ]9 f( |& x% K# s' d9 S- K
选项字节擦除
  V" I4 |* ^9 T* @     建议使用如下步骤对选项字节进行擦除: ; ?; k" |6 M; @1 @. s" Z2 a4 A% s  b
1.检查FLASH_SR寄存器的BSY位,以确认没有其他正在进行的闪存操作。  
5 `% q' {2 ^0 p# x2 T) a
2.解锁FLASH_CR寄存器的OPTWRE位。即,打开写使能。 7 X, s6 F: }/ w# E* d
3.设置FLASH_CR寄存器的OPTER位为1。选择选项字节擦除操作。  
2 @& x; u6 x, N& V) ]2 j6 ~
4.设置FLASH_CR寄存器的STRT位为1。
0 O/ n1 a: K9 i7 Z/ j5 P5.等待FLASH_SR寄存器的BSY位变为0,表示操作完成。
0 j; i  t, L* n' D0 s6.查询FLASH_SR寄存器的EOP位,EOP为1时,表示操作成功。

" i- u, s; ^1 i/ R3 h7.读出选项字节并验证数据。
( \. H, ]& i$ I, t  l( M* q% r由于选项字节只有16字节,因此,擦除时是整个选项字节都被擦除了。' G! O+ O* _) f
. Q- t: E5 U& {& p
选项字节编程
5 J) l2 V) B+ |) w     建议使用如下步骤对选项字节进行编程:
7 ^/ H6 c8 G3 @7 Y: B, G6 |# S1.检查FLASH_SR寄存器的BSY位,以确认没有其他正在进行的编程操作。  
1 v4 X$ _( P8 R  `" k5 j2.解锁FLASH_CR寄存器的OPTWRE位。即,打开写使能。  
8 ^* }# Q1 `4 I6 e9 H1 Z0 r6 J8 ]3.设置FLASH_CR寄存器的OPTPG位为1。选择编程操作。  ; A& l/ F; d! ]# [, H6 V6 R1 o8 V
4.写入要编程的半字到指定的地址。启动编程操作。 4 U. v3 O3 Q  }$ Q  _/ D
5.等待FLASH_SR寄存器的BSY位变为0,表示操作完成。 : e* O+ j% V1 \3 ~% J( i
6.查询FLASH_SR寄存器的EOP位,EOP为1时,表示操作成功。
' k$ _/ N# e! N' a. C1 U& X7.读出写入的选项字节并验证数据。 对选项字节编程时,FPEC使用半字中的低字节并自动地计算出高字节(高字节为低字节的反码),并开始编程操作,这将保证选项字节和它的反码始终是正确的。
8 F. p) o3 U6 t* V3 f/ ^/ L! l/ F" N+ k2 v; `
主存储块的保护
9 Y# u2 [# ~2 v' N1 |/ f4 P- }& Q     可以对主存储块中的数据进行读保护、写保护。 读保护用于保护数据不被非法读出。防止程序泄密。 * v* Q  w, C" |3 `% `& b- J+ B
写保护用于保护数据不被非法改写,增强程序的健壮性。
( K2 _  ]7 Q- {, M1 y& f- R: [4 E( {5 u' h+ e# U. G. p- P
读保护
. q9 H6 G; W5 G& |. r( n+ {     主存储块启动读保护后,简单的说具有以下特性: * ~0 W/ Z5 }" k! b( r& V% S, ]+ c
1.从主存储块启动的程序,可以对整个主存储块执行读操作,不允许对主存储块的前4KB进行擦除编程操作,可以对4KB之后的区域进行擦除编程操作。
  O1 d: c9 F7 `7 ^  ^( n) U2.从SRAM启动的程序,不能对主存储块进行读、页擦除、编程操作,但可以进行主存储块整片擦除操作。 0 \! j0 }1 i$ u- y4 X# z
3.使用调试接口不能访问主存储块。这些特性足以阻止主存储器数据的非法读出,又能保证程序的正常运行。 % X* W& l" i$ |$ x+ O
只有当RDP选项字节的值为RDPRT键值时,读保护才被关闭,否则,读保护就是启动的。因此,擦除选项字节的操作,将启动主存储块的读保护。如果要关闭读保护,必须将RDP选项字节编程为RDPRT键值。并且,如果编程选项字节,使RDP由非键值变为键值(即由保护变为非保护)时,STM32将会先擦除整个主存储块,再编程RDP。芯片出厂时,RDP会事先写入RDPRT键值,关闭写保护功能。 5 Z6 X2 z7 E# Y/ v- d8 H) }

: r: L! v7 O7 J1 n8 A( I' R" R写保护
0 q. q6 h2 Q7 ?      STM32主存储块可以分域进行写保护。如果试图对写保护的域进行擦除或编程操作,在闪存状态寄存器(FLASH_SR)中会返回一个写保护错误标志。STM32主存储块每个域4KB,WRP0-WRP3选项字节中的每一位对应一个域,位为0时,写保护有效。对于超过128KB的产品,WRP3.15保护了域31及之后的所有域。显然,擦除选项字节将导致解除主存储块的写保护。& B) J3 P; x2 c( U  R9 R1 G( Q
8 ~3 q3 _& J6 Z  r$ V
选项字节与它的寄存器映象 " ?; J' D1 B; d' y
我们知道,FPEC有两个寄存器存储了选项字节的映象。那么,选项字节本体(在FLASH中)与映象(在寄存器中)究竟有什么区别呢?
7 L: i, B* o; e) H选项字节的本体只是个FLASH,它的作用只是掉电存储选项字节内容而以,真正起作用的是寄存器中的映象。即,一个配置是否有效,不是看本体,而是看映象。而映象是在复位后,用本体的值加载的,此后,除非复位,映象将不再改变。所以,更改本体的数据后,不会立即生效,只有复位加载到映象中后,才会生效。 有一点要注意的是,当更改本体的值,使主存储块读保护变为不保护时,会先擦除整片主存储块,然后再改变本体。这是唯一一个改变本体会引发的动作。但即使这样,读保护依然要等到复位后,加载到映象后,才会解除。 % L& A- }/ z0 _% L, z! U- o
  6 v5 @; Z8 q% `' m4 b
关于FLASH编程手册中文版的几处错误(不一定是,但是与我的理解不符)
* x. l+ v, U( A1 `, p3 e
1.选项字节编程一节中:
+ ~: R8 ~$ Q7 P+ |# p; g( T$ h对FPEC解锁后,必须分别写入KEY1和KEY2(见2.3.1节)到FLASH_OPTKEYR寄存器,再设置FLASH_CR寄存器的OPTWRE位为’1’,此时可以对选项字节进行编程 " X. O7 N0 I: N# `* h. Z$ W
实际上,对FLASH_OPTKEYR写入KEY1和KEY2后,OPTWRE位会被硬件置1,而不是用软件写1。这一点在后面的寄存器描述中也可以得到验证。 2.对读保护的描述中: ' c' W! k: X1 R7 c/ f4 Y; p
对读保护的数值对无法理解。正确的应该是,RDP为RDPRT键值时,解除读保护,为其它值时,读保护生效。
  ~% V- ?& c- _& K8 I* S$ O% A
& t) f, g$ Z2 Y2 I7 \
+ x9 a) t6 p% E% u3 p
看了半天,原来只要几句就可以解决,当然是不考虑其他功能,只是简单的读写操作。
% c1 C6 g6 n& h5 Y8 ?其中写操作如下:& U1 |  e& o- ?" g
     FLASH_Unlock();  //解锁FLASH编程擦除控制器
1 Z8 ?  s" L/ A7 P     FLASH_ClearFlag(FLASH_FLAG_BSY|FLASH_FLAG_EOP|FLASH_FLAG_PGERR|FLASH_FLAG_WRPRTERR);//清除标志位
' J) E  B2 B$ c6 @2 E% `     /*********************************************************************************
) W# q9 G7 |( p4 B- J- ]4 f. a6 k          //               FLASH_FLAG_BSY            FLASH忙标志位
8 ^& O3 m& v" K: w' Q- P          //               FLASH_FLAG_EOP            FLASH操作结束标志位5 O. ~2 Q/ u% k
          //               FLASH_FLAG_PGERR            FLASH编写错误标志位5 a/ H3 I, R, e
          //               FLASH_FLAG_WRPRTERR       FLASH页面写保护错误标净         
( v1 y% ?- }3 Z% Z2 X3 D5 c     **********************************************************************************/
, `$ ?& R- e; w6 S" z4 }8 g# G     FLASH_ErasePage(FLASH_START_ADDR);     //擦除指定地址页
. }9 }; h! _7 C3 c7 o# t5 \- V     FLASH_ProgramHalfWord(FLASH_START_ADDR+(addr+i)*2,dat); //从指定页的addr地址开始写4 G+ [$ M$ h# o0 F
     FLASH_ClearFlag(FLASH_FLAG_BSY|FLASH_FLAG_EOP|FLASH_FLAG_PGERR|FLASH_FLAG_WRPRTERR);//清除标志位
6 n, F: ]: l/ G# N: B) _     FLASH_Lock();    //锁定FLASH编程擦除控制器
$ Q1 f5 Z" J0 _* y, n$ I7 K
& E" ?- D* X7 s4 u从上面可以看出基本顺序是:解锁-》清除标志位(可以不要)-》擦除-》写半字-》清楚标志位(也可以不要)-》上锁。其中FLASH_START_ADDR是宏定义的0x8000000+2048*255,0x8000000是Flash的起始地址,2048是因为我用的是大容量芯片,根据上一笔记Flash地址可以看出芯片每页容量2K,即2048字节,255表示芯片的最后一页,这个根据不同芯片而定。之所以从后面页写起可以防止储存数据破坏用户程序。addr*2是因为每个数据占用2字节(半字),虽然写入的是1字节数据,但是编程是2字节为单位,也就是说一个字节的数据也会占用两个字节地址。
( f. C1 R0 W! N8 F2 C/ k  A
6 e! N5 K2 P0 ?9 k
读操作如下:" E; X+ H# i; |* T
    u16 value;0 }: W' N" s6 c: y& L! d0 _' O: z% s8 d
    value = *(u16*)(FLASH_START_ADDR+(addr*2));//从指定页的addr地址开始读
6 {( ^8 U) f8 H8 e
赞 收藏 4 评论4 发布时间:2015-11-23 17:33

举报

4个回答
Paderboy 回答时间:2015-11-23 18:38:07
呵呵。沙发哦。。。。
1 L* y; H0 @# m4 w5 S
埃斯提爱慕 回答时间:2015-11-23 21:02:05
提示: 作者被禁止或删除 内容自动屏蔽
枫之叶 回答时间:2016-5-13 09:16:20
很好欸!还给了例子~这下可以对着看了~~
无薪税绵 回答时间:2017-1-26 22:20:06
这资料很好,谢谢楼主了。
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版