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

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

[复制链接]
STMCU小助手 发布时间:2021-11-28 22:45
一、存储器映射
) `  D8 h1 W) c) z5 u+ {1 z
5 X: |5 A" B& n8 j) G( Z1 k, h       1、统一编址,程序存储器、数据存储器、外设寄存器组织在一个4GB的地址空间。+ u1 A9 ^( b+ k8 N4 K+ w
# A, f" b7 l0 D, N: z! l6 Z0 M4 e
       2、小端格式  w3 Q& E4 t; j
8 G' B; i# l" P6 {% J5 q
       3、映像(stm32f107,256KB产品)
2 \6 O5 o( Z1 j
; T, o" i' O/ I
4 T. s/ f+ r7 c' D" O 可以看到,所谓的256KB闪存,是指主存储,片上FLASH如下图所示:
4 ^( j8 |0 K  N& }. m$ P9 p; {& H1 a' u1 R8 g3 |; q: K
1342337656_6536.jpg
5 I3 K% `. f! ?- @9 z

6 e3 {, V; a0 g+ _介绍了片上的资源后,来看他们的地址映像。芯片将4GB的空间,划分为8个512MB的块(block),这些块有些是整块不用的,芯片对地址的安排可以参考数据手册,memory mapping章节中的那个图。只有block1、2、3、7是使用的。
( O2 Q7 o( q, b
, a2 h/ h9 W9 k$ k, Y地址中block7是核内的外设对应的地址,block2是其他外设对应的地址。block1的低地址64KB是片上SRAM,block0则如下图
9 w; u% s8 @) Y7 m+ N- Q0 W. }# s
1342337868_7188.jpg
: ?( n; q- w; X
1 k; l- s+ E/ ~" }6 R: i
option bytes即是选项字节;system memory就是系统存储,也即片上ROM;这两部分就是所谓信息块。Flash就是指主存储,有256KB。  x( e% [" h5 q5 w1 D0 @: C
再往下看alias to flash or system memory.....这个区域256KB就是启动开始的区域。这个区域并没有一个自己的存储器,只是根据BOOT0、BOOT1的接法来选择哪个存储器映射到这个地址上。如下图9 b+ r( _, }% F& C4 W# b6 r! B
" S7 U$ {; O& R) _1 Z
1342338432_4880.jpg
& G- n6 `% ~1 I* F2 ?
" G0 M7 r/ U$ e+ s) Z
选择用户闪存启动,是典型的做法;选择系统存储器,则在ST烧写进去的自举程序引导下,通过USART1下载程序;选择从SRAM执行代码则方便调试,比较快。$ x' S# y+ r4 M" f! s$ B; X
+ F6 `/ ?% n5 e% u
二、复位
9 r2 d) I, S) I) T
4 t6 u/ c& h0 s$ k' Z2 v0 O; z; CCM3将复位视作异常,优先级最高的异常。
% K/ w( e  l8 X  A' C+ _, r, g& A/ k0 F
stm32f1有三种复位:系统复位、电源复位、备份区复位。
6 h8 D; A0 O  A7 i) \0 p% X
4 }4 I6 F  ]) o5 u( q前两种是真正的复位,对他的响应由硬件完成,这个响应对软件流的影响是这样的:程序指针指向0x0000 0004,这个单元存储的是复位服务子程序(或者汇编叫子过程),同时从0x0000 0000获取堆栈顶的地址。不同的复位类型还有对其他寄存的不同复位方式,这就完成了复位。而备份区复位则不然,The backup domain has two specific resets that affect only the backup domain(参考手册6.1 reset章节)+ q( }( n9 Z8 _& A6 B! [( a

) E2 `3 l) z4 {6 B  G          零地址存放的是堆栈顶的地址,之后就是以Reset_Handler打头的向量表。. O/ j2 m+ S' k% Y
/ v+ y% ?$ \2 k/ e' n' R. \% H
          上面所说的向量表的存储从零地址开始,这是缺省的情况,可以通过NVIC的一个寄存器来重定向向量表。(权威指南7.3向量表)
9 n2 E$ m) e9 ?# S+ n: P
# V$ w+ X- N. ~) `$ E4 L三、flash读写0 z! k/ U6 i4 n& {6 a8 L/ s) }1 l; Q

* Q- P% y7 H( T8 a5 g2 o+ _  a; w
  1. void flashwrite(u16 data). Q0 F0 a. W+ O  O5 B
  2. {
    - X. a1 }" }1 G1 {
  3. FLASH_Unlock();$ q; o' O; g3 ^; t
  4. while(FLASH_GetFlagStatus(FLASH_FLAG_BSY)==1);! r5 v# H+ T, q: _; E/ g" B% h. V- o
  5. FLASH->CR|=0x00000001;    //set PG' V7 Y+ f4 [3 V; {
  6. *((u16 *)0x0803F800)=data;
    4 Q& [) ~* T+ ~# u4 F: V
  7. while(FLASH_GetFlagStatus(FLASH_FLAG_BSY)==1);" I& a& d1 ]: R6 X5 {
  8. lxj= *((u16 *)0x0803F800);
    6 {; S6 H3 s# {1 I1 ^' _  b! I" L
  9. 4 [# S7 v8 @( S9 N; J

  10. : H! y( S+ [8 o  x' T, c  ?& |5 S
  11. FLASH_Lock();* \7 S7 A, B0 f) U4 @
  12. }
      E  O0 J) B, a! E/ }

  13. & Y9 J. P8 F" r# F; v& \1 ?# C$ s
  14. void flashread()
    7 R/ ]/ A) y# P0 t2 ]. k
  15. {4 Z: L' G1 L& Z( M9 ^; b* I
  16. FLASH_Unlock();
    6 a& x9 j9 x' H8 s9 L
  17. while(FLASH_GetFlagStatus(FLASH_FLAG_BSY)==1);5 C3 g% O2 x% G# a8 }
  18. // FLASH->CR|=0x00000001;    //set PG3 E* P/ Z1 H) L! J; S  G
  19. // *((u16 *)0x0803F800)=data;7 i7 _* @/ P9 q: J- }6 H: P
  20. // while(FLASH_GetFlagStatus(FLASH_FLAG_BSY)==1);3 K# ?& Y. a+ H4 i
  21. lxj= *((u16 *)0x0803F800);& G2 T2 Z( v- W/ f6 [# g
  22. # _+ X- r. @0 ?8 c+ G1 T5 k2 I
  23. & p) N  l0 G" {; t( M$ }
  24. FLASH_Lock();; [9 X: `. F2 ~9 a5 {
  25. }
复制代码

9 ^9 f! x1 @7 e* z8 Y6 Y9 ?" b& @+ N5 C8 ~1 j2 \! Z, k( w
没仔细看,但能实现读写,不过用这两个函数的话,有一个bug,记下来回头研究。
6 K" m$ j& j9 w+ S
  b3 O" j2 X: t/ oflash必须先擦再写,flash_write以后,再写确实不行了,但再次上电,就能在同一个地址写了。而且flash确实烧写好了,掉电后数据不会消失* S, i& k( g7 \0 l( W
; {% b! r% z5 O- i+ d% V6 T
7 H6 T4 P* b% Y* }+ o( E
0 p3 m5 S& u$ A4 L" V! L6 g* ~4 e
8 I. m  O7 v6 M! {
1342338958_5565.jpg
收藏 评论0 发布时间:2021-11-28 22:45

举报

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