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

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

[复制链接]
STMCU小助手 发布时间:2021-11-28 22:45
一、存储器映射7 q) n3 N+ ]/ R! u

. d5 K* F2 X" z1 {( V- a$ a4 c       1、统一编址,程序存储器、数据存储器、外设寄存器组织在一个4GB的地址空间。
3 }4 b- L7 P9 z1 [& h7 J
2 e9 J' h2 r1 b. U$ R& \+ p       2、小端格式( U* q" J2 s+ y. X  w) }
) W. t9 t7 D9 R, U+ g7 g
       3、映像(stm32f107,256KB产品)
. @' Z  e5 |4 \! F$ K6 f
  O) S. F& F2 {. V6 Z" S. {! Z3 c7 A7 j, f/ C# g
可以看到,所谓的256KB闪存,是指主存储,片上FLASH如下图所示:% h& w0 Q* w: S. |

, B) u* E6 @  w' B2 j# S
1342337656_6536.jpg

9 }" @' N+ v" ?' J* R
5 m9 V9 U& s6 @+ Z介绍了片上的资源后,来看他们的地址映像。芯片将4GB的空间,划分为8个512MB的块(block),这些块有些是整块不用的,芯片对地址的安排可以参考数据手册,memory mapping章节中的那个图。只有block1、2、3、7是使用的。
9 F& R3 S& I$ x# q) N- l4 E: F6 B  H5 ~3 Z4 @  a. f/ F
地址中block7是核内的外设对应的地址,block2是其他外设对应的地址。block1的低地址64KB是片上SRAM,block0则如下图
& Q) f3 ^9 ?" a8 }! q& T6 l
2 K4 Z; c* ~  c: f
1342337868_7188.jpg
5 x7 f% l- v* A5 ?8 p2 T

, x3 G' h4 A* s. u/ qoption bytes即是选项字节;system memory就是系统存储,也即片上ROM;这两部分就是所谓信息块。Flash就是指主存储,有256KB。
* [0 s4 }) Q$ {  u8 _+ K再往下看alias to flash or system memory.....这个区域256KB就是启动开始的区域。这个区域并没有一个自己的存储器,只是根据BOOT0、BOOT1的接法来选择哪个存储器映射到这个地址上。如下图) ?* |& E4 Y% @: \

* j7 L6 Y6 u1 u4 q# _
1342338432_4880.jpg

' ^: O" Y. L) |  t  u' k
$ _% P: _4 i4 X3 t选择用户闪存启动,是典型的做法;选择系统存储器,则在ST烧写进去的自举程序引导下,通过USART1下载程序;选择从SRAM执行代码则方便调试,比较快。
0 q' A7 ~) K" R5 \" v+ ~5 ~& W) l+ g8 `7 h
二、复位5 a$ u& C7 I; `7 B0 ^) y

& W- W1 t5 ~# w3 XCM3将复位视作异常,优先级最高的异常。
& I8 \* {3 N6 S: n5 L$ j0 l# @) j0 d" g. B5 c2 ^7 @- u
stm32f1有三种复位:系统复位、电源复位、备份区复位。( _9 b+ Q9 \( ^1 H4 D
- c' _  z! @/ _: W  J: l6 D
前两种是真正的复位,对他的响应由硬件完成,这个响应对软件流的影响是这样的:程序指针指向0x0000 0004,这个单元存储的是复位服务子程序(或者汇编叫子过程),同时从0x0000 0000获取堆栈顶的地址。不同的复位类型还有对其他寄存的不同复位方式,这就完成了复位。而备份区复位则不然,The backup domain has two specific resets that affect only the backup domain(参考手册6.1 reset章节)( [0 f$ F& _# @5 U

$ ?( s. @: Z: E! g8 O' Q8 s6 L          零地址存放的是堆栈顶的地址,之后就是以Reset_Handler打头的向量表。
) l9 s5 b' S6 C2 V2 _$ @0 p! J
: a6 W1 `: i6 P% @7 t& r6 |) e          上面所说的向量表的存储从零地址开始,这是缺省的情况,可以通过NVIC的一个寄存器来重定向向量表。(权威指南7.3向量表)2 i5 m5 S, }$ ?, @  Y& `2 |$ v

3 {1 a& \# W8 L. U7 T/ [# D# d三、flash读写3 ^; w( s+ m+ S' ~/ e: j8 Z/ z

1 E* Z  w* x& p, R! y& ]5 d
  1. void flashwrite(u16 data)& P7 B' H; B6 e
  2. {2 l7 [5 c' D$ `# e) e
  3. FLASH_Unlock();
    ! Z( A! T  z. L& T! S
  4. while(FLASH_GetFlagStatus(FLASH_FLAG_BSY)==1);
    7 G0 l0 S* e6 J% X  ?! M
  5. FLASH->CR|=0x00000001;    //set PG# b* F9 D' y; a& D  \9 J& T5 |
  6. *((u16 *)0x0803F800)=data;
    & N% o# |$ s/ j2 r- y$ x2 e
  7. while(FLASH_GetFlagStatus(FLASH_FLAG_BSY)==1);8 ?# J+ {: _( ]0 F! _$ ?
  8. lxj= *((u16 *)0x0803F800);$ v) R$ j/ H* S- I/ S$ L& D# K

  9. + w( Y, w, [1 p6 M8 W6 A0 h

  10. + d" _. K7 V. [
  11. FLASH_Lock();! ^- ?8 b) f; d0 d6 b
  12. }8 h+ P2 S: h  h* U% h0 t% T
  13. - W: D. Q7 @/ b) b# Z3 K
  14. void flashread()
    ! ^  l# O6 q8 r9 z8 Z3 }# W' R
  15. {1 u1 |1 I5 b+ f1 W9 g4 @+ `  T
  16. FLASH_Unlock();
    # Y- Z$ a! @( o  P3 y6 ~; a
  17. while(FLASH_GetFlagStatus(FLASH_FLAG_BSY)==1);; B3 r( P, S, k( J' q# e5 l
  18. // FLASH->CR|=0x00000001;    //set PG2 y6 ?3 C/ Q& S
  19. // *((u16 *)0x0803F800)=data;
    ) `6 v8 I% M) k) }& }
  20. // while(FLASH_GetFlagStatus(FLASH_FLAG_BSY)==1);
    / u" ]% ]7 q5 h5 |
  21. lxj= *((u16 *)0x0803F800);; @/ F( _5 p* G- V% j$ K. H* m
  22. " Y0 I+ F# ~! F; t& o' A) w
  23. ) p% ^7 |9 X7 C
  24. FLASH_Lock();
    3 I2 k) l! r+ `; w6 C
  25. }
复制代码
3 ]4 _1 P6 }) q: r; A

) W4 J2 h3 n& [! {+ E没仔细看,但能实现读写,不过用这两个函数的话,有一个bug,记下来回头研究。
' j+ u: b6 F& J, V' l3 A& e/ ?6 i5 @/ \/ E9 @! l1 q# D8 _
flash必须先擦再写,flash_write以后,再写确实不行了,但再次上电,就能在同一个地址写了。而且flash确实烧写好了,掉电后数据不会消失
7 N+ |. T* Z) X$ U! ]( x  w' ^0 I, E4 a7 r: V: i; @

( N+ T' b7 Y: J4 m/ U  I1 m- m/ a+ o+ m, N# j" J8 Z
' c% _7 ^$ [- p1 T4 g
1342338958_5565.jpg
赞 收藏 评论0 发布时间:2021-11-28 22:45

举报

0个回答

所属标签

相似技术帖

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