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

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

[复制链接]
STMCU小助手 发布时间:2021-11-28 22:45
一、存储器映射
- w* f- A7 L& ]' Q3 _5 R+ ~# A& K4 r( X; U, r/ c
       1、统一编址,程序存储器、数据存储器、外设寄存器组织在一个4GB的地址空间。) d$ X% W8 T1 S4 H7 |2 n5 e9 k

/ f( n8 O# P* Y4 `' L# |8 v       2、小端格式6 t1 G2 {4 o$ Y; |

! P  e% B: x4 ?$ O$ a       3、映像(stm32f107,256KB产品)
) }# ~' L( K8 D7 E: a
& E- s( h; v, H, Q7 y( f2 }7 o- H. x3 H9 {2 E1 ?# q" F
可以看到,所谓的256KB闪存,是指主存储,片上FLASH如下图所示:) V7 [4 J# k+ C8 J% v% y- Q- o
6 @$ U8 t! P& ?7 Z( Z
1342337656_6536.jpg

- V  ?' V2 Z% C1 L! j7 W/ s& n& m( u  I2 U0 X. k( g2 ]  L, \" m! N( L
介绍了片上的资源后,来看他们的地址映像。芯片将4GB的空间,划分为8个512MB的块(block),这些块有些是整块不用的,芯片对地址的安排可以参考数据手册,memory mapping章节中的那个图。只有block1、2、3、7是使用的。
2 ~, t, X4 ~- R0 [" C; \' y' V  T+ a" F( t6 w9 X9 S4 G+ o
地址中block7是核内的外设对应的地址,block2是其他外设对应的地址。block1的低地址64KB是片上SRAM,block0则如下图
& ~; V* H; N  U. k) g& l$ B' S& d% Y, y! Q+ X" ^2 q
1342337868_7188.jpg

) j) U  d* Z7 @* D
; B$ S0 R4 O5 u& U; y4 _option bytes即是选项字节;system memory就是系统存储,也即片上ROM;这两部分就是所谓信息块。Flash就是指主存储,有256KB。5 `4 F0 Q  M7 Y$ M, P
再往下看alias to flash or system memory.....这个区域256KB就是启动开始的区域。这个区域并没有一个自己的存储器,只是根据BOOT0、BOOT1的接法来选择哪个存储器映射到这个地址上。如下图
5 _% ]7 k/ Z5 [: E! p; G' D" g* ?; q5 A
7 Z  M, S" V5 L( Z1 \* V( c
1342338432_4880.jpg
  K7 ?6 f$ O1 G* ~) v
2 F/ K) W& s" l1 U" D* m/ k- V
选择用户闪存启动,是典型的做法;选择系统存储器,则在ST烧写进去的自举程序引导下,通过USART1下载程序;选择从SRAM执行代码则方便调试,比较快。
) _7 l$ f) n; o/ x& ]
# s9 K! i- M) S, b6 U二、复位1 R6 R5 H8 S0 }( [# p) V! z( w

& d$ O% x  ^3 }/ P1 j+ KCM3将复位视作异常,优先级最高的异常。
. `$ j4 V2 U% t% t+ f
4 K8 R. T, l  ?3 Hstm32f1有三种复位:系统复位、电源复位、备份区复位。  ]3 d1 B/ a& Z

6 a  c  @. `" k) G前两种是真正的复位,对他的响应由硬件完成,这个响应对软件流的影响是这样的:程序指针指向0x0000 0004,这个单元存储的是复位服务子程序(或者汇编叫子过程),同时从0x0000 0000获取堆栈顶的地址。不同的复位类型还有对其他寄存的不同复位方式,这就完成了复位。而备份区复位则不然,The backup domain has two specific resets that affect only the backup domain(参考手册6.1 reset章节)
6 J! g, r# b  V. ^; O( Q3 D! F8 T
0 Z7 m! R4 S8 n; |; O2 ]1 O          零地址存放的是堆栈顶的地址,之后就是以Reset_Handler打头的向量表。
' m0 m) F1 \+ d: {) v/ O% D1 D, D/ x! v5 ^) b8 [; E& R; b
          上面所说的向量表的存储从零地址开始,这是缺省的情况,可以通过NVIC的一个寄存器来重定向向量表。(权威指南7.3向量表)
( m1 ]) r8 [2 M5 V
$ `+ ]; |5 m% @2 e- j) r" U: F- E6 T. i三、flash读写0 q: `. q. @7 |4 [6 {) W/ B

$ L- A/ A  N8 b. |$ _
  1. void flashwrite(u16 data)3 B! ^4 A5 f# I6 S8 N
  2. {6 }5 ~$ d3 o- A. q8 |
  3. FLASH_Unlock();
    & s3 |; m! w( c4 {; |; i- J1 S: K
  4. while(FLASH_GetFlagStatus(FLASH_FLAG_BSY)==1);6 V$ N% ~& b6 [9 S9 q3 T6 f
  5. FLASH->CR|=0x00000001;    //set PG
    5 f. C  s0 t* e  w4 d
  6. *((u16 *)0x0803F800)=data;' L% u/ n  K% q; ]6 y: k) E
  7. while(FLASH_GetFlagStatus(FLASH_FLAG_BSY)==1);
    ) R. b8 h" h. z* x, R. y" _' ~' {& Q
  8. lxj= *((u16 *)0x0803F800);
    & j+ ~' s8 e1 F/ F
  9. 3 X7 ~2 \% ^2 Q, T& m

  10. 4 k& i; C1 F# L4 F
  11. FLASH_Lock();+ S& w1 p+ Z1 n7 z8 V. _
  12. }8 a8 a; A8 g1 Y+ I

  13. , R" T) t: a2 x$ x/ E
  14. void flashread()5 A# y! w& ]  F# Z* p/ ~& V
  15. {+ |! B9 `" |& _4 J
  16. FLASH_Unlock();
    3 h  A$ n' e; ?0 _) T" [
  17. while(FLASH_GetFlagStatus(FLASH_FLAG_BSY)==1);
    - r! T2 q( S: O
  18. // FLASH->CR|=0x00000001;    //set PG
    " ~# [/ j- h3 m; C0 k( @
  19. // *((u16 *)0x0803F800)=data;2 K6 }' B/ i$ Y2 K: `. e
  20. // while(FLASH_GetFlagStatus(FLASH_FLAG_BSY)==1);3 N% d  Y! m; T, f, |
  21. lxj= *((u16 *)0x0803F800);% S0 G$ b. f/ C5 ~6 y! g3 ?

  22. - Y$ f% a# [5 s
  23. 8 s3 D6 ?$ w1 j) s
  24. FLASH_Lock();; E% Y5 v4 {/ P4 E+ T2 E  }) Y8 t
  25. }
复制代码
; P/ ?4 B* ]( k) L6 G4 D, W

/ V/ _3 z* X" E8 w没仔细看,但能实现读写,不过用这两个函数的话,有一个bug,记下来回头研究。4 Z3 H* |8 i& G# p8 L  \- j: W4 B

. b, y9 E2 E% \, K3 S$ }flash必须先擦再写,flash_write以后,再写确实不行了,但再次上电,就能在同一个地址写了。而且flash确实烧写好了,掉电后数据不会消失% s9 Q) A4 Z# o( ]: ?1 s, V

$ q* G0 V; w6 ?, x  N" O2 c  }8 |8 k. n8 N' [. `

3 E0 [) z  l3 y6 r" f3 e* V9 t7 g1 b+ F- G$ H
1342338958_5565.jpg
收藏 评论0 发布时间:2021-11-28 22:45

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版