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

给大家转载一篇文章可以说是FLASH的导论

[复制链接]
kimoye 发布时间:2017-12-25 20:29
STM32的FLASH操作介绍与总结
/ H" p: z" }$ k( T" \! [
3 }" c$ ~1 Q2 G4 C: r
说到STM32的FLSAH,我们的第一反应是用来装程序的,实际上,STM32的片内FLASH不仅用来装程序,还用来装芯片配置、芯片ID、自举程序等等。当然, FLASH还可以用来装数据。
5 p# m5 o9 z. A% u4 v% n5 J, w3 X( [/ v
FLASH分类3 D2 h+ m$ W3 `. T  I' h- q

* D; }! s! G7 Y' a4 H! n根据用途,STM32片内的FLASH分成两部分:主存储块、信息块。2 }( G0 `- a: V9 b

  D" m2 y& s3 }" J/ z3 r主存储块用于存储程序,我们写的程序一般存储在这里。
  j. z  V4 K8 f
' D$ r* @7 Z# J( w$ x信息块又分成两部分:系统存储器、选项字节。7 A$ f9 N, {+ O

1 Q7 B$ n& m: u1 Q* K系统存储器存储用于存放在系统存储器自举模式下的启动程序(BootLoader),当使用ISP方式加载程序时,就是由这个程序执行。这个区域由芯片厂写入BootLoader,然后锁死,用户是无法改变这个区域的。. n/ f/ }3 X, ^: ]' N9 `

% K4 u9 F* _0 b$ `4 U/ z; t8 d选项字节存储芯片的配置信息及对主存储块的保护信息。- J+ {! Q3 w; M; W  j: L

: W5 w  g' \2 E; ^9 wFLASH的页面
! D% U% ]4 j- B; L
# a" L( F8 ?% P( r, z: ASTM32的FLASH主存储块按页组织,有的产品每页1KB,有的产品每页2KB。页面典型的用途就是用于按页擦除FLASH。从这点来看,页面有点像通用FLASH的扇区。8 K, d7 w' p/ W& l* o
3 ^; z0 ^3 {4 F' @0 w3 V# G
STM32产品的分类1 _+ N5 c' o( x' Q' m8 G# ^
' N, i& q; U2 s% p
STM32根据FLASH主存储块容量、页面的不同,系统存储器的不同,分为小容量、中容量、大容量、互联型,共四类产品。
" G$ z' c& v# t: F- u# J# `. Z! m9 a( q! C
小容量产品主存储块1-32KB,每页1KB。系统存储器2KB。
, t/ e) n+ A2 T/ a+ [
$ x% v1 @8 x6 y( x中容量产品主存储块64-128KB,每页1KB。系统存储器2KB。0 c! M, {2 A) A* ^2 L2 ^

8 i$ R  c: X& |2 ]2 O+ e7 Y大容量产品主存储块256KB以上,每页2KB。系统存储器2KB。
, O3 @; n1 z6 ~2 i, V2 q  B
* W/ v9 ^! b( I7 J/ K互联型产品主存储块256KB以上,每页2KB。系统存储器18KB。
/ ^0 }* i1 r" B+ m8 j  n4 D
7 Z% A6 ~* e& r7 r" [/ R对于具体一个产品属于哪类,可以查数据手册,或根据以下简单的规则进行区分:
) A, b( m! K, \
& ?+ m; G& K% R3 nSTM32F101xx、STM32F102xx 、STM32F103xx产品,根据其主存储块容量,一定是小容量、中容量、大容量产品中的一种,STM32F105xx、STM32F107xx是互联型产品。
) g& [2 v) \- A3 X+ Z6 ^
& N8 p; F/ o9 q, O互联型产品与其它三类的不同之处就是BootLoader的不同,小中大容量产品的BootLoader只有2KB,只能通过USART1进行ISP,而互联型产品的BootLoader有18KB,能通过USAT1、4、CAN等多种方式进行ISP。小空量产品、中容量产品的BootLoader与大容量产品相同。
" e0 c6 b$ B4 u' y& F$ U7 b+ i0 ]+ o7 f! O( a" ~
关于ISP与IAP
7 h0 x/ W/ M, D! A+ T) C3 v- h
+ w& l( P8 s3 {: p4 |0 d, @ISP(In System Programming)在系统编程,是指直接在目标电路板上对芯片进行编程,一般需要一个自举程序(BootLoader)来执行。ISP也有叫ICP(In Circuit Programming)、在电路编程、在线编程。7 Z# ^( f5 c3 W. H5 k* ~
+ V9 r" _) l7 G3 R6 S$ M* U% A, O
IAP(In Application Programming)在应用中编程,是指最终产品出厂后,由最终用户在使用中对用户程序部分进行编程,实现在线升级。IAP要求将程序分成两部分:引导程序、用户程序。引导程序总是不变的。IAP也有叫在程序中编程。
$ A2 s  N7 H" C
7 ~6 u! u9 q; U, D0 y/ HISP与IAP的区别在于,ISP一般是对芯片整片重新编程,用的是芯片厂的自举程序。而IAP只是更新程序的一部分,用的是电器厂开发的IAP引导程序。综合来看,ISP受到的限制更多,而IAP由于是自己开发的程序,更换程序的时候更容易操作。( u, i* D  ~; r% h( v
* C0 H8 P/ H0 J
FPEC
: D' j# y6 b' Z, a$ R% |
& F' ^) {$ u( J  ZFPEC(FLASH Program/Erase controller 闪存编程/擦除控制器),STM32通过FPEC来擦除和编程FLASH。FPEC使用7个寄存器来操作闪存:5 P. f/ L5 r9 T5 _! f- _* ?
$ \( |& v, O" z5 i
FPEC键寄存器(FLASH_KEYR) 写入键值解锁。  h( }' J, `, R; H) w" Y& {2 s+ @

* O$ m; F( M5 j- j; `# h3 a3 c; t选项字节键寄存器(FLASH_OPTKEYR) 写入键值解锁选项字节操作。$ ]; E8 G5 |% k7 @% {7 @3 M
; y7 B  ~- M% o) f) Y0 d! V+ C
闪存控制寄存器(FLASH_CR) 选择并启动闪存操作。
1 d% o- h: n; q9 {9 ]2 k) q" ~3 }( v% t' E% Q
闪存状态寄存器(FLASH_SR) 查询闪存操作状态。
9 v( A: `! i$ ]1 g$ F! {: [% k- m" m3 A9 G
闪存地址寄存器(FLASH_AR) 存储闪存操作地址。
; O, t5 j0 h# G* ^" J# I6 L/ @2 q  D: {* m* ]5 S: m  L8 R
选项字节寄存器(FLASH_OBR) 选项字节中主要数据的映象。% K4 p( i8 j" N+ c  v/ F" j

, g( Y' h0 U) n2 |" N& M写保护寄存器(FLASH_WRPR) 选项字节中写保护字节的映象。) L' v3 ~% z6 F* B. q# y
' F' T( B; Q' d9 O+ @
键值1 W) D% y& _! d% f) q/ K
7 F! \" A- L" E
为了增强安全性,进行某项操作时,须要向某个位置写入特定的数值,来验证是否为安全的操作,这些数值称为键值。STM32的FLASH共有三个键值:% |# k  \5 m: `4 g: r5 x! ]- _& o% h. ~
0 E5 r% _- z0 `. E
RDPRT键 = 0x000000A5 用于解除读保护6 z6 T- J' _+ s# f2 G" r. t
7 Q7 n% E: t' X
KEY1 = 0x45670123 用于解除闪存锁
; `0 R( H: U. O
* g8 k- A# _( y2 qKEY2 = 0xCDEF89AB 用于解除闪存锁
. A4 R. k3 j2 z% r4 c, q  h; c0 d: d/ b4 c* }! s+ n! _
闪存锁* t( d0 Z* f, [% T) N
! F8 p) \/ j) }) [' Q" ~
在FLASH_CR中,有一个LOCK位,该位为1时,不能写FLASH_CR寄存器,从而也就不能擦除和编程FLASH,这称为闪存锁。
  ^, K- n0 F# \, o4 E$ ^; ^  z& L% D1 O) u
当LOCK位为1时,闪存锁有效,只有向FLASH_KEYR依次写入KEY1、KEY2后,LOCK位才会被硬件清零,从而解除闪存锁。当LOCK位为1时,对FLASH_KEYR的任何错误写操作(第一次不是KEY1,或第二次不是KEY2),都将会导致闪存锁的彻底锁死,一旦闪存锁彻底锁死,在下一次复位前,都无法解锁,只有复位后,闪存锁才恢复为一般锁住状态。- o# S6 x2 T+ a6 x. h& \- o5 A

, X1 W+ j% e# r0 y* b" \2 Q复位后,LOCK位默认为1,闪存锁有效,此时,可以进行解锁。解锁后,可进行FLASH的擦除编程工作。任何时候,都可以通过对LOCK位置1来软件加锁,软件加锁与复位加锁是一样的,都可以解锁。
  n$ I" [0 @8 b& B1 Q6 F  k5 m* e3 e- p1 {# m0 o7 ?
主存储块的擦除" b% F; o  x9 |4 @! V  N- B$ ?5 P
: s& u9 h4 W- E$ ?5 x
主存储块可以按页擦除,也可以整片擦除。5 h' u) `2 s9 ]! N, @# U
/ ?; F9 E, G# r2 p* z! i
页擦除
* d* E# b9 j6 T5 P( {6 F' I8 R
主存储块的任何一页都可以通过FPEC的页擦除功能擦除。
/ r+ M- \4 ?% U/ G& }. m9 E2 a0 x7 ^. S3 p8 T3 n2 D
建议使用以下步骤进行页擦除:
9 o+ I: ?. T# I8 e) z
8 t/ r  W* T% ]% s. C4 I7 Q; Z1.检查FLASH_SR寄存器的BSY位。以确认没有其他正在进行的闪存操作。必须等待BSY位为0,才能继续操作。& D$ j  l" [& N5 _, P

7 E# ~3 O1 b2 t" A1 a& Y2.设置FLASH_CR寄存器的PER位为1。选择页擦除操作。5 Y5 C. r5 R/ n( F; b

* T8 i( U' F( H3.设置FLASH_AR寄存器为要擦除页所在地址,选择要擦除的页。FLASH_AR的值在哪一页范围内,就表示要擦除哪一页。( e) z9 w3 L7 N1 d0 x- O

: }" Z2 T' E7 ~% C) V# {4.设置FLASH_CR寄存器的STRT位为1,启动擦除操作。" P8 b  `, t5 d* o& w
0 m% G" [6 f& x& A! o  B- R
5.等待FLASH_SR寄存器的BSY位变为0,表示操作完成。
3 _) o5 m( U, \7 v5 V$ P$ v! B  u, X" a& ^2 {3 E* T
6.查询FLASH_SR寄存器的EOP位,EOP为1时,表示操作成功。
. M. }& m& ]  L/ Z2 V& k  b4 |1 K4 F1 K; Q. u! {; b& E
7.读出被擦除的页并做验证。擦完后所有数据位都为1。
# R8 c+ u0 @! ^5 b
* Z0 g: r5 o( g+ ~& U整片擦除
5 T% X5 z1 d6 m& ^( _; M  ~* O( x9 A
4 w" O( b/ n; _" x* J整片擦除功能擦除整个主存储块,信息块不受此操作影响。
9 ^: \1 d- b% _0 T. u' O: u+ Q
% z2 `8 X* D! l: ?, \建议使用以下步骤进行整片擦除:- v. K+ v* S- R0 u5 S0 `
# p1 R) \7 Z9 v) c
1.检查FLASH_SR寄存器的BSY位,以确认没有其他正在进行的闪存操作。9 k) q9 d7 j6 O0 Q4 t4 i& B
  s. o2 |' N% ?' f" ?4 G
2.设置FLASH_CR寄存器的MER位为1。选择整片擦除操作。
; u2 c! {# z  Q) L' C+ y3 g) d* J% x$ ]) o
3.设置FLASH_CR寄存器的STRT位为1。启动整片擦除操作。
5 d" @9 N* Q6 ~% V* W5 u' K4 c; g! p' u5 S
4.等待FLASH_SR寄存器的BSY位变为0,表示操作完成。4 w' g3 S) Y& [! N  |, c) r
5 @' n* f  Z: w- E$ }
5.查询FLASH_SR寄存器的EOP位,EOP为1时,表示操作成功。4 s) ~" n; A8 p) C* q

" u0 d- y: x1 s( |* _6.读出所有页并做验证。擦完后所有数据位都为1。- X9 J4 C* P) N9 a
. x+ {" E. \2 U! l
主存储块的编程
: Q0 U' o" d7 @4 `+ \& L
+ v0 h1 O5 l% c& Y5 q对主存储块编程每次可以写入16位。当FLASH_CR寄存器的PG位为1时,在一个闪存地址写入一个半字(16位)将启动一次编程;写入任何非半字的数据,FPEC都会产生总线错误。在编程过程中(BSY位为1时),任何读写闪存的操作都会使CPU暂停,直到此次闪存编程结束。5 `5 l& l* W# t6 n& b
0 v  ^7 D$ c& M, s2 Y, J
建议使用如下步骤对主存储块进行编:
' |6 U: h7 Q) l) C% n" `+ L
! k% {7 Y: t+ z1.检查FLASH_SR寄存器的BSY位,以确认没有其他正在进行的编程操作。
0 w* ]: U* ?& u/ u" u! [
# N  A+ P- u* J6 T- o; Y  L/ Q2.设置FLASH_CR寄存器的PG位为1。选择编程操作。
; e4 h& Q2 E. s1 n0 K/ C8 m- ], E; m  D6 a
3.在指定的地址写入要编程的半字。直接用指针写。6 P( P  m) r- i+ A  G! ~9 E
% \9 i9 t: c- C; R& v3 K5 ?
4.等待FLASH_SR寄存器的BSY位变为0,表示操作完成。2 o( j8 `1 E7 Z! ~" l

& r/ _- l- n9 c( D  o3 w5.查询FLASH_SR寄存器的EOP位,EOP为1时,表示操作成功。
, f1 W- U. B- M: @% a5 \
9 \/ O4 e  O9 J5 U+ J. q/ m6.读出写入的地址并验证数据。( _) W& A3 _& h0 l: O: H$ {
1 U7 Z; Z7 M! I3 @" |- s
关于主存储块擦除编程操作的一些疑问
1 d; J% m5 y9 F) G
" w8 D0 E% n% J  C; P1. 为什么每次都要检查BSY位是否为0?
9 Q9 l4 j, v* _4 e; P  Z# ^& }; x% {4 H) s7 q: ~
因为BSY位为1时,不能对任何FPEC寄存器执行写操作,所以必须要等BSY位为0时,才能执行闪存操作。% o, L# B) c0 m4 e

7 c' x8 k5 K! U1 ^$ D( u  p5 c2. 如果没有擦除就进行编程,会出现什么结果?
" C. v# z- y4 B! P# o, E6 _+ Y6 c% ?5 ]# b$ b3 Q
STM32在执行编程操作前,会先检查要编程的地址是否被擦除,如果没有,则不进行编程,并置FLASH_SR寄存器的PGERR位为1。唯一例外的是,当要编程的数据为0X0000时,即使未擦除,也会进行编程,因为0X0000即使擦除也可以正确编程。2 K* i6 h" w# R) k  G+ P7 U3 y
, o$ d0 H( m: l  D
3. 为什么操作后要读出数据并验证?
5 T# `( k+ {( y! F/ G/ i
$ r# x2 j7 S+ A- `5 p# b0 a. r7 F, T8 [+ vSTM32在某些特殊情况下(例如FPEC被锁住),可能根本就没有执行所要的操作,仅通过寄存器无法判断操作是否成功。所以,保险起见,操作后都要读出所有数据检查。
9 P. W  }. U. J( s- `' l3 \6 P6 P8 ^* P3 `9 h7 O$ F1 H; n" b
4. 等待BSY位为1的时间以多少为合适?
7 b& y* u  |5 z  Q2 n' V+ e+ [" d+ w9 S- o8 u
请参考STM32固件库中的数据。
' m' u% t: x2 Y6 X7 m7 X
  _' _# o+ V! S  p4 d/ q9 t& n5. FLASH编程手册上说进行闪存操作(擦除或编程)时,必须打开内部的RC振荡器(HSI),是不是一定要用HIS进行闪存的擦除及编程操作?. e7 g. w( W# e/ P* j  k$ [

2 ^' N/ @) C2 m% [2 U+ p对于这点,我的理解是,进行闪存操作时,必须要保证HIS没有被关闭,但是操作时的系统仍然可以是HSE时钟。STM32复位后,HIS默认是开的,只要你不为了低功耗去主动关闭它,则用什么时钟都可以进行闪存操作的。我所编的程序也验证了这一点。
* m: _* E* i  C) R( d4 g% }
  Z4 i. `: b% E) a! s3 C' g选项字节
9 r9 p: Y; b, g6 l  Q$ f8 f- \5 i+ g5 ]6 ~9 q! F/ y1 I
选项字节用于存储芯片使用者对芯片的配置信息。" |0 \" Z" z0 Q) R; n5 b4 o
/ Q, E) A7 N/ p+ M" P
目前,所有的STM32101xx、STM32102xx、STM32103xx、STM32105xx、STM32107xx产品,选项字节都是16字节。但是这16字节,每两个字节组成一个正反对,即,字节1是字节0的反码,字节3是字节2的反码,...,字节15是字节14的反码,所以,芯片使用者只要设置8个字节就行了,另外8个字节系统自动填充为反码。因此,有时候,也说STM32的选项字节是8个字节,但是占了16字节的空间。( e, A% a. f- U, K- Y

7 u. K7 z' G1 _4 u$ M选项字节的8字节正码概述如下:
0 P; L0 N% H6 j! n6 H
( N% u' ?' b+ Q- ~$ ?RDP 字节0。读保护字节,存储对主存储块的读保护设置。1 A) e9 S9 J' Q: I
4 [1 O3 S, D, ~, G
USER 字节2。用户字节,配置看门狗、停机、待机。
& z0 ~& ^3 r- }) z+ R% ^
% ?" g6 \! K4 \2 q- g$ zData0 字节4。数据字节0,由芯片使用者自由使用。
/ L  p: h. U' S6 [6 \1 k$ {! I
4 F1 f3 b) f, g1 _- C/ F0 eData1 字节6。数据字节1,由芯片使用者自由使用。
. E0 J* X- P. `& I) t" x$ u. x6 B6 a4 }
. b) E8 m6 O5 h5 ]WRP0 字节8。写保护字节0,存储对主存储块的写保护设置。7 w5 b, J% B. c5 T

( }$ Q. F6 d9 W- ?# ~0 z: WWRP1 字节10。写保护字节1,存储对主存储块的写保护设置。1 v$ ?6 x4 ?# Z/ s6 L$ d* n
; r; P9 U8 ?4 O! v; Y
WRP2 字节12。写保护字节2,存储对主存储块的写保护设置。+ j# [0 q; Y7 S4 l6 i5 M
+ U0 K7 ]4 }" _/ E
WRP3 字节14。写保护字节3,存储对主存储块的写保护设置。3  G6 M( Z# \& t+ ?; t% _
. N% j: _5 C' {- f4 o
选项字节写使能
6 W3 M4 J8 D0 c8 x  z, d7 ]9 p( `0 W+ k, t# Q; P6 s' n
在FLASH_CR中,有一个OPTWRE位,该位为0时,不允许进行选项字节操作(擦除、编程)。这称为选项字节写使能。只有该位为1时,才能进行选项字节操作。
6 @5 \1 e. S5 u9 V
6 p+ U5 w$ ~+ P6 p& p该位不能软件置1,但可以软件清零。只有向FLASH_OPTKEYR依次写入KEY1和KEY2后,硬件会自动对该位置1,此时,才允许选项字节操作。这称为解锁(打开)选项字节写使能。
: O, h' b3 ~, c' C( M! ~* r6 N9 r; [2 o& d) T
该位为1后,可以由软件清零,关闭写使能。
& K5 h& U  F+ O8 G% I! _
/ o1 v) g5 k. i5 \- d9 Z. p复位后,该位为0。错误操作不会永远关闭写使能,只要写入正确的键序列,则又可以打开写使能。写使能已打开时,再次打开,不会出错,并且依然是打开的。
6 @2 u9 z. r' C+ f; D
$ ]1 O4 {. Z% P! U很显然,进行选项字节操作前,先要解开闪存锁,然后打开选项字节写使能,之后,才能进行选项字节操作。6 g  z1 n5 d) s" I8 _# O: ~* u

$ S. w/ _* u; Q8 L* O选项字节擦除: c0 ^9 Q! T5 \! e

; Z# h8 r* h/ q建议使用如下步骤对选项字节进行擦除:4 l0 f, b* n; J" c# u

$ o5 v  I  e/ s, {6 w1.检查FLASH_SR寄存器的BSY位,以确认没有其他正在进行的闪存操作。7 r, [' t' k4 B$ g1 G, ]4 a% s

! R+ v& f# D' f, O- F4 {+ m6 A2.解锁FLASH_CR寄存器的OPTWRE位。即,打开写使能。
2 p" S' w! c$ l4 v! ]& e! B. z  _% z8 ~
3.设置FLASH_CR寄存器的OPTER位为1。选择选项字节擦除操作。# q- J1 ^$ n3 b+ q' p

7 a& i) Z1 i2 n: D1 t4.设置FLASH_CR寄存器的STRT位为1。
# n2 _2 N7 _! g- N+ O/ Z7 H, A7 o, y
* @. ]; W9 W9 _% m5 F5.等待FLASH_SR寄存器的BSY位变为0,表示操作完成。( j" Y- s+ G# t; V1 B# v
/ C% T. U! o0 f
6.查询FLASH_SR寄存器的EOP位,EOP为1时,表示操作成功。' P' A: H* Z7 q! `' z1 a

; B& S1 |" O% d7.读出选项字节并验证数据。
, Z$ j, N/ x7 O& c) J2 G4 x" ?- c& k$ W: b* m- ^2 ?% y
由于选项字节只有16字节,因此,擦除时是整个选项字节都被擦除了。. m0 @1 R0 t8 D6 }. r  C
% Y8 g* @6 G, [8 D" o7 t4 I
选项字节编程- `, g8 y3 f6 S% @% A5 {2 }4 b8 ~
& S) y9 a4 \! E4 H. O' ~, s. A
建议使用如下步骤对选项字节进行编程:
1 q' u3 Q7 l, B
8 r8 E) i( w% A4 E$ Z) f1.检查FLASH_SR寄存器的BSY位,以确认没有其他正在进行的编程操作。0 p2 H8 V) f" h$ p! ]2 X) j# U& A* R: e
$ J9 _. k) }8 S5 Y! S6 f! [
2.解锁FLASH_CR寄存器的OPTWRE位。即,打开写使能。
. S5 s, J/ c3 g& _
# l4 V9 F3 L' o. k. x# J3.设置FLASH_CR寄存器的OPTPG位为1。选择编程操作。
, |5 q3 Q5 B! I7 E
4 n  A* N! T7 X6 V4.写入要编程的半字到指定的地址。启动编程操作。* a/ m- `2 c% A

" j  M- u( Y, Y, q$ J5.等待FLASH_SR寄存器的BSY位变为0,表示操作完成。
, N! g- ^9 p# {, L- n8 y
  [" n* f% n6 B6.查询FLASH_SR寄存器的EOP位,EOP为1时,表示操作成功。
! c7 l3 d$ E. B2 O9 l3 S
8 P" w$ Q# I6 S3 e! M/ ^7.读出写入的选项字节并验证数据。
* e/ C6 J5 D8 h  j# h/ E# a* }. x& D9 t9 ]! V; B" Y
对选项字节编程时,FPEC使用半字中的低字节并自动地计算出高字节(高字节为低字节的反码),并开始编程操作,这将保证选项字节和它的反码始终是正确的。
! ^$ _/ R# B0 k2 x; S; F' ~. e3 N4 c4 l3 W
主存储块的保护
( Q2 v/ M' r% N5 J4 b" f7 n& r, w. k
' W4 n# k+ C# D) T可以对主存储块中的数据进行读保护、写保护。4 n9 _4 R& t, S* z$ n( e5 U& N

, \$ F9 Q  F# o/ i/ f9 Z) T/ l2 j/ C读保护用于保护数据不被非法读出。防止程序泄密。' L$ `3 M  Y7 ^! q. I6 k
: `, \- S6 v: x' j: u+ [+ }
写保护用于保护数据不被非法改写,增强程序的健壮性。$ W0 [8 H8 x: C
+ j8 s$ U, Z. j  R$ @6 A7 u
读保护/ f/ l/ v7 c6 _+ {

! {5 @3 n  o* |3 @/ ^主存储块启动读保护后,简单的说具有以下特性:
; h/ T- Q( J$ [! G/ J
8 u3 w' B* }. c. Q& ^0 w1.从主存储块启动的程序,可以对整个主存储块执行读操作,不允许对主存储块的前4KB进行擦除编程操作,可以对4KB之后的区域进行擦除编程操作。
  c$ Z9 f* T+ {- @: o" _
, G5 i3 K3 G, L0 @9 e2.从SRAM启动的程序,不能对主存储块进行读、页擦除、编程操作,但可以进行主存储块整片擦除操作。
) ~$ c1 y& [5 d& K
0 A* A, X; t9 s; {1 v3.使用调试接口不能访问主存储块。
8 s  f8 b5 I' A) `( F! O. H& Z% \/ [+ W+ |0 H4 f( m8 w
这些特性足以阻止主存储器数据的非法读出,又能保证程序的正常运行。* J+ t  x; g4 w; p$ d9 ^
3 K2 Y) m  K9 _# _# V' C) }
只有当RDP选项字节的值为RDPRT键值时,读保护才被关闭,否则,读保护就是启动的。因此,擦除选项字节的操作,将启动主存储块的读保护。如果要关闭读保护,必须将RDP选项字节编程为RDPRT键值。并且,如果编程选项字节,使RDP由非键值变为键值(即由保护变为非保护)时,STM32将会先擦除整个主存储块,再编程RDP。
/ I+ L$ M0 _1 T% z# o1 |% K
9 b9 e% T( r7 j8 [/ ~芯片出厂时,RDP会事先写入RDPRT键值,关闭写保护功能。; i+ j0 \) g  [2 d% w7 {" d

2 [5 k. G1 [$ T4 r写保护8 ?  r) ?$ i5 B9 e. B

4 C, s7 ]$ f8 MSTM32主存储块可以分域进行写保护。- P8 y8 N# B# [# d  p1 F7 g) q
6 z0 N+ P3 d, l( C! I2 x- Z
如果试图对写保护的域进行擦除或编程操作,在闪存状态寄存器(FLASH_SR)中会返回一个写保护错误标志。
; H9 P9 ?3 V, W( y5 I2 t3 P" T: M
STM32主存储块每个域4KB,WRP0-WRP3选项字节中的每一位对应一个域,位为0时,写保护有效。对于超过128KB的产品,WRP3.15保护了域31及之后的所有域。, W7 L5 ^" e  h0 I

: ^5 F. p1 S( {) v& [4 J显然,擦除选项字节将导致解除主存储块的写保护。
6 e' d9 l$ I4 X, f$ Z
! \% }0 c4 c6 p: l9 V4 N: y9 R4 m选项字节与它的寄存器映象1 y7 W- e: `& W' N# ^
: o: W3 W4 |7 s( }) k( }
我们知道,FPEC有两个寄存器存储了选项字节的映象。那么,选项字节本体(在FLASH中)与映象(在寄存器中)究竟有什么区别呢?( G4 L  x3 p- K" m. ~* ?
7 ~4 O& t# Z/ [5 g8 c9 e
选项字节的本体只是个FLASH,它的作用只是掉电存储选项字节内容而以,真正起作用的是寄存器中的映象。即,一个配置是否有效,不是看本体,而是看映象。而映象是在复位后,用本体的值加载的,此后,除非复位,映象将不再改变。所以,更改本体的数据后,不会立即生效,只有复位加载到映象中后,才会生效。2 S/ [1 ~2 N9 P5 j
+ E$ a% a% H1 f
有一点要注意的是,当更改本体的值,使主存储块读保护变为不保护时,会先擦除整片主存储块,然后再改变本体。这是唯一一个改变本体会引发的动作。但即使这样,读保护依然要等到复位后,加载到映象后,才会解除。
- ^5 C7 ]' k/ C' n) r/ E6 {
6 E) A: b; v. D& Z关于FLASH编程手册中文版的几处错误(不一定是,但是与我的理解不符)1 A; E. C" u+ x3 M

7 y& A5 I5 R# t% g  a& [( q, D1. 选项字节编程一节中:0 L, c. H5 f- y" y. M. H

1 d$ H; l8 i- }& P; {对FPEC解锁后,必须分别写入KEY1和KEY2(见2.3.1节)到FLASH_OPTKEYR寄存器,再设置FLASH_CR寄存器的OPTWRE位为’1’,此时可以对选项字节进行编程% a: P/ t" [! G4 U
  B( T/ ?# k" {0 A6 L* F& g
实际上,对FLASH_OPTKEYR写入KEY1和KEY2后,OPTWRE位会被硬件置1,而不是用软件写1。这一点在后面的寄存器描述中也可以得到验证。
$ R4 `' s3 {( e- t0 ?
' T) P; m+ a8 W1 L* T0 W2. 对读保护的描述中:  C1 |" e4 T6 v& V/ t

: q# F7 ?) j; N8 ~' r- F0 L: b% w对读保护的数值对无法理解。正确的应该是,RDP为RDPRT键值时,解除读保护,为其它值时,读保护生效。
% z/ B7 N  `/ x' @7 ?4 o, b原文http://www.elecbench.com/stm32%E ... %E6%80%BB%E7%BB%93/
8 Q3 F# X0 |3 G! Y3 P3 _$ ]  V: D- j) x

5 s# T, e( P* g9 Q
赞 收藏 评论0 发布时间:2017-12-25 20:29

举报

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