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

【经验分享】stm32f1的存储器与复位

[复制链接]
STMCU小助手 发布时间:2021-11-28 22:45
一、存储器映射
8 Q/ ?0 n6 I) [+ e- e2 D6 H" m5 x# B3 k2 a4 \
       1、统一编址,程序存储器、数据存储器、外设寄存器组织在一个4GB的地址空间。; L' c+ }+ P% N% R7 U

, _! _: P1 _. U5 J% N- l       2、小端格式! z3 P- s) K% L, a2 X0 J
( J$ O( g  B% u: G* @6 b8 W' B
       3、映像(stm32f107,256KB产品): P# U2 P3 ~$ m/ ?8 \/ A

; T  D9 f  K- ^4 y6 u' {: u" f% I) Q! U9 r6 P- C5 ^
可以看到,所谓的256KB闪存,是指主存储,片上FLASH如下图所示:+ ?7 |$ T: Y% M$ q# d$ |
0 F9 M9 b9 w% n( J$ V# Z! W% k
1342337656_6536.jpg

9 c# e, i1 \3 J/ H0 |# c% L
7 ^9 T6 V6 N3 S6 _8 p3 n介绍了片上的资源后,来看他们的地址映像。芯片将4GB的空间,划分为8个512MB的块(block),这些块有些是整块不用的,芯片对地址的安排可以参考数据手册,memory mapping章节中的那个图。只有block1、2、3、7是使用的。
) q3 {+ S. u1 C* x, a3 L
, G+ w+ x$ d" K6 |4 t# a5 r) z地址中block7是核内的外设对应的地址,block2是其他外设对应的地址。block1的低地址64KB是片上SRAM,block0则如下图7 m; c9 q: L0 c+ e$ R
" x% ]2 Y1 O, L# @3 J
1342337868_7188.jpg
1 l: I+ b# N7 e3 T' C' }
8 C. i6 P+ I/ i% a* q3 ?* v+ a
option bytes即是选项字节;system memory就是系统存储,也即片上ROM;这两部分就是所谓信息块。Flash就是指主存储,有256KB。
0 j5 P: m$ L- D' j再往下看alias to flash or system memory.....这个区域256KB就是启动开始的区域。这个区域并没有一个自己的存储器,只是根据BOOT0、BOOT1的接法来选择哪个存储器映射到这个地址上。如下图; Z+ U% X; U: j
3 `! A  Y0 I: G# w4 F
1342338432_4880.jpg

& C( A) B$ f5 p/ W' C  I/ ~2 i- T
选择用户闪存启动,是典型的做法;选择系统存储器,则在ST烧写进去的自举程序引导下,通过USART1下载程序;选择从SRAM执行代码则方便调试,比较快。" o" X1 h- [$ J

& [8 ~  `" S! Z/ z二、复位6 T, y$ j5 I: @( R+ F% B. d9 s

, P& b4 _6 X5 z( h0 NCM3将复位视作异常,优先级最高的异常。8 J) }9 t: K" O0 g7 ?
5 t1 K& v/ F1 e' o" Q7 f
stm32f1有三种复位:系统复位、电源复位、备份区复位。3 n2 E0 h6 D1 A) F8 \
9 W; V- S/ |) m, l: C
前两种是真正的复位,对他的响应由硬件完成,这个响应对软件流的影响是这样的:程序指针指向0x0000 0004,这个单元存储的是复位服务子程序(或者汇编叫子过程),同时从0x0000 0000获取堆栈顶的地址。不同的复位类型还有对其他寄存的不同复位方式,这就完成了复位。而备份区复位则不然,The backup domain has two specific resets that affect only the backup domain(参考手册6.1 reset章节)! @* \9 P  {% L3 s: H" E; Q

7 C- c, ~3 L+ t4 R) C5 w5 ?# H          零地址存放的是堆栈顶的地址,之后就是以Reset_Handler打头的向量表。
4 g7 A3 w  G& K# J- v, h$ b! I* k9 w0 G! D7 y
          上面所说的向量表的存储从零地址开始,这是缺省的情况,可以通过NVIC的一个寄存器来重定向向量表。(权威指南7.3向量表)
7 Z0 \) L. }! J0 [
( `  x# r3 z( A9 ~$ o5 |三、flash读写
& |# |1 u* z( ^2 k9 E5 l. d7 y0 L! r: A8 \3 ^
  1. void flashwrite(u16 data)' o8 z% g# w4 n) D' \* {* a3 }
  2. {
    - w7 T* y. m7 G# s5 g  Q
  3. FLASH_Unlock();0 i! A. L6 @" |- P; g( I1 e
  4. while(FLASH_GetFlagStatus(FLASH_FLAG_BSY)==1);
    4 F& C6 I- a  I* F& F4 Z
  5. FLASH->CR|=0x00000001;    //set PG. z$ G- G3 l' r  k. p  D- \" H
  6. *((u16 *)0x0803F800)=data;
    & r$ E" m8 m1 m# r. O
  7. while(FLASH_GetFlagStatus(FLASH_FLAG_BSY)==1);/ {& i+ Y3 z2 p2 q) \) C
  8. lxj= *((u16 *)0x0803F800);( v8 _7 O' U- D
  9. 8 i+ Y9 e. D: M6 C5 d5 v

  10. 5 R2 e$ Y: u/ m( S5 q& `. ?# w
  11. FLASH_Lock();8 M" T; \. m4 u8 p5 P$ `& P
  12. }2 y1 u1 W: Z% [- u) Q
  13. # y) m6 R: _8 R1 G! v% G- Q
  14. void flashread()
    7 l: ^# O" q5 t
  15. {
    + ]7 f+ m* w/ w' S
  16. FLASH_Unlock();( l( R- f8 \8 q: \8 I
  17. while(FLASH_GetFlagStatus(FLASH_FLAG_BSY)==1);
    / c, o  ~* |; h: y1 l; ~
  18. // FLASH->CR|=0x00000001;    //set PG- S2 ?' ]( l( r$ F; B( H& R
  19. // *((u16 *)0x0803F800)=data;2 O, |# Q9 H- n8 k& K: w
  20. // while(FLASH_GetFlagStatus(FLASH_FLAG_BSY)==1);
    5 e  a" T7 T1 @' e# }% j0 N! I: ?
  21. lxj= *((u16 *)0x0803F800);) C. _6 k1 M0 M

  22. ( O* S+ O# _. g* o( F0 q

  23. $ G/ ^* b) |3 X. R
  24. FLASH_Lock();: B6 M0 q- s$ Q
  25. }
复制代码
% T, q2 h8 U" M& x$ V
& V" a+ Y9 k3 v* {! ~
没仔细看,但能实现读写,不过用这两个函数的话,有一个bug,记下来回头研究。5 @2 h# ?, s% V6 N/ T" n
; v" a1 |1 W1 u) d
flash必须先擦再写,flash_write以后,再写确实不行了,但再次上电,就能在同一个地址写了。而且flash确实烧写好了,掉电后数据不会消失
+ ]* R- G' h8 E! ?! Q+ o: I$ v' `+ A8 Z" M- A7 X4 h6 l  }

( o- G$ V. j/ l: `
7 u0 C  k6 z6 v  v; b4 P1 w: F* F& F1 Q6 b
1342338958_5565.jpg
收藏 评论0 发布时间:2021-11-28 22:45

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版