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

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

[复制链接]
STMCU小助手 发布时间:2021-11-28 22:45
一、存储器映射0 ?9 r9 E3 w- F5 p6 A0 o' P2 g# p
# O& O8 \& X4 `( \/ X/ ~
       1、统一编址,程序存储器、数据存储器、外设寄存器组织在一个4GB的地址空间。$ ~; |% v0 X* l1 C' t3 n
# Z8 _3 P5 ~5 W& y
       2、小端格式
6 E& `- i0 r+ ~! J# k/ |7 z  p  ]) k6 b8 R5 [! x# X
       3、映像(stm32f107,256KB产品)
* Q; l" V+ q  t0 d- x8 g  f7 R9 u, m/ F/ w7 E7 ?& m5 ~7 o% d, P
1 O" a7 T% j+ O/ \
可以看到,所谓的256KB闪存,是指主存储,片上FLASH如下图所示:' P$ p. I$ [. j

0 P) J5 j8 f: l0 g, I
1342337656_6536.jpg
' H  F; T0 n7 d1 s7 A2 v) k# }
; w, p! j- Q+ ]) d
介绍了片上的资源后,来看他们的地址映像。芯片将4GB的空间,划分为8个512MB的块(block),这些块有些是整块不用的,芯片对地址的安排可以参考数据手册,memory mapping章节中的那个图。只有block1、2、3、7是使用的。
$ r& S7 W: C$ {' x7 ?# r# {$ i; t! ?; l5 Z3 F4 G5 u
地址中block7是核内的外设对应的地址,block2是其他外设对应的地址。block1的低地址64KB是片上SRAM,block0则如下图2 ^2 U! K% ^& A- W  Y
) H  M0 J3 s5 P* a1 G' N
1342337868_7188.jpg

, B2 p) i: ?2 q
( X; g/ K5 d7 ~. eoption bytes即是选项字节;system memory就是系统存储,也即片上ROM;这两部分就是所谓信息块。Flash就是指主存储,有256KB。6 z/ U& k. x0 ~  T2 q8 G. A' N
再往下看alias to flash or system memory.....这个区域256KB就是启动开始的区域。这个区域并没有一个自己的存储器,只是根据BOOT0、BOOT1的接法来选择哪个存储器映射到这个地址上。如下图
( ^0 Z: T; W9 }0 Q4 j
+ C( @. `1 d, v. @
1342338432_4880.jpg
$ V+ k2 H  g1 D
* ^; C  y5 L$ s0 ^1 F8 m
选择用户闪存启动,是典型的做法;选择系统存储器,则在ST烧写进去的自举程序引导下,通过USART1下载程序;选择从SRAM执行代码则方便调试,比较快。" Z4 W* }5 g7 S' |; u$ B6 p
8 ]+ R6 w/ G, F% R2 \7 P
二、复位  C5 y8 E$ Z6 ~

& P+ r! u* |# a; {  bCM3将复位视作异常,优先级最高的异常。" }4 E6 C( m$ U# A" Z! N
: H; b1 |3 S! `3 Q* O0 I+ v
stm32f1有三种复位:系统复位、电源复位、备份区复位。
7 t$ I' i/ r) F+ C! r# y
2 X* S+ P- v* M2 E! ~前两种是真正的复位,对他的响应由硬件完成,这个响应对软件流的影响是这样的:程序指针指向0x0000 0004,这个单元存储的是复位服务子程序(或者汇编叫子过程),同时从0x0000 0000获取堆栈顶的地址。不同的复位类型还有对其他寄存的不同复位方式,这就完成了复位。而备份区复位则不然,The backup domain has two specific resets that affect only the backup domain(参考手册6.1 reset章节)
3 V+ G# c( ^9 N- h  Z6 C. Z& F& e/ |1 \. X5 h) }5 a& {5 o
          零地址存放的是堆栈顶的地址,之后就是以Reset_Handler打头的向量表。
! w* y0 o3 Q* ^9 h/ D/ [( D6 L* m+ B9 T, \* \
          上面所说的向量表的存储从零地址开始,这是缺省的情况,可以通过NVIC的一个寄存器来重定向向量表。(权威指南7.3向量表)
; o, _: ]: K0 h4 S. m" o0 w9 C, ]3 X& O1 B: m
三、flash读写! r7 K( @8 a! `( N# p
) j" q) `% {! l2 e9 a" }
  1. void flashwrite(u16 data)# K# P. [- |7 w% N5 d4 b
  2. {/ _5 v0 o% J/ p
  3. FLASH_Unlock();
    # D& B" b4 d4 I  K7 o
  4. while(FLASH_GetFlagStatus(FLASH_FLAG_BSY)==1);
    # t1 y7 B% q0 k& B; b
  5. FLASH->CR|=0x00000001;    //set PG
    ( \" X, k! b  y" C" S
  6. *((u16 *)0x0803F800)=data;0 c' Q% k5 f1 S) r- g: ^
  7. while(FLASH_GetFlagStatus(FLASH_FLAG_BSY)==1);
    . S; H; ~4 s& j' n0 s* C) t
  8. lxj= *((u16 *)0x0803F800);& U" C5 d0 P2 B" {7 F  F0 N
  9. 1 J- h1 L* Z) l% a  I
  10. . M6 x! A6 e( |
  11. FLASH_Lock();4 H( d/ [0 r1 _! m9 E1 ]
  12. }
    , b+ y/ ~1 S4 @$ z1 N
  13. 1 `- b! a& u* [1 @2 F' D
  14. void flashread(), j) W6 i' W3 l6 v, u5 Z8 Y
  15. {7 n4 ]( \; r3 b7 x$ C  i, f4 V$ v0 U/ H
  16. FLASH_Unlock();
    $ ?6 A) @% e9 ]+ O2 d
  17. while(FLASH_GetFlagStatus(FLASH_FLAG_BSY)==1);
      K/ P& @5 c% I3 l4 l
  18. // FLASH->CR|=0x00000001;    //set PG; d/ x# L) v4 L5 M, N9 @, v! x
  19. // *((u16 *)0x0803F800)=data;2 t8 d9 y5 R. B5 e5 M
  20. // while(FLASH_GetFlagStatus(FLASH_FLAG_BSY)==1);4 x' ^9 a% k' X) R7 N( A/ @
  21. lxj= *((u16 *)0x0803F800);
      \2 J! g, I! R/ S1 E/ ]5 l

  22. ; Z6 F/ I8 o1 }- _5 G5 r

  23. % S; t* |$ P7 v; z; [0 W
  24. FLASH_Lock();* W) N7 @" F2 X0 Z9 ]$ Q
  25. }
复制代码

. X5 @+ C" h* S. B- k. R. T+ t% y$ V8 V2 ?' w) M
没仔细看,但能实现读写,不过用这两个函数的话,有一个bug,记下来回头研究。" Q# @" Y) l% m5 r5 U& q

; R. G( ?' D2 r9 q$ y0 n/ Tflash必须先擦再写,flash_write以后,再写确实不行了,但再次上电,就能在同一个地址写了。而且flash确实烧写好了,掉电后数据不会消失
  M; `# x  T0 i0 D9 A9 E
/ a( X+ S& K$ `9 q; `2 ^/ j/ z4 f  b* Y' R0 s1 }* \
6 Y, ~/ }7 a" j$ b5 f/ m
. ?6 ?6 g! Z  s9 o
1342338958_5565.jpg
收藏 评论0 发布时间:2021-11-28 22:45

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版