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

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

[复制链接]
STMCU小助手 发布时间:2021-11-28 22:45
一、存储器映射+ l+ R: t6 E8 G4 I8 i* ^* G( |

( O% Y7 k: _4 {       1、统一编址,程序存储器、数据存储器、外设寄存器组织在一个4GB的地址空间。0 \( U& m* d( k7 ^$ Z* o

3 z/ i; C% e/ D" v$ }- B       2、小端格式  T3 T- m+ N' B  _3 D* ~3 O0 |8 @
" e: y: [$ ?0 d3 l) G5 ?
       3、映像(stm32f107,256KB产品)
& Z) N  c  B5 `, M) S; j! ~; P3 x2 M# t7 I5 V

3 l# e0 n: F/ J" }" E$ m! K 可以看到,所谓的256KB闪存,是指主存储,片上FLASH如下图所示:
; e. N4 z5 _& }. u% H) j; I' `$ j5 b( c; j7 i% H8 [
1342337656_6536.jpg

" k' s5 i# Y- B  v' J1 E5 d6 u* X: h8 Y# j7 ~" v
介绍了片上的资源后,来看他们的地址映像。芯片将4GB的空间,划分为8个512MB的块(block),这些块有些是整块不用的,芯片对地址的安排可以参考数据手册,memory mapping章节中的那个图。只有block1、2、3、7是使用的。
! e4 U4 D0 I3 O, L
. x) s! z9 x" [* A地址中block7是核内的外设对应的地址,block2是其他外设对应的地址。block1的低地址64KB是片上SRAM,block0则如下图; x) R- m2 [5 l) ~9 l
& y! i& {. p$ c) ^$ E0 j& j4 t
1342337868_7188.jpg
1 @5 X; G- I" ]* e
0 j1 {3 R# O2 z2 B7 m" }
option bytes即是选项字节;system memory就是系统存储,也即片上ROM;这两部分就是所谓信息块。Flash就是指主存储,有256KB。
2 d4 m# S% J  t! x. ^' G再往下看alias to flash or system memory.....这个区域256KB就是启动开始的区域。这个区域并没有一个自己的存储器,只是根据BOOT0、BOOT1的接法来选择哪个存储器映射到这个地址上。如下图
, a' H9 W( s. Z9 H
% m/ c8 j) b+ L, @
1342338432_4880.jpg

5 L$ k1 c' X! ]. |; ?, e5 `9 R! R  [7 d$ s" K2 D, r2 D1 t
选择用户闪存启动,是典型的做法;选择系统存储器,则在ST烧写进去的自举程序引导下,通过USART1下载程序;选择从SRAM执行代码则方便调试,比较快。
5 e, z: F" o; x4 ~
, r  V5 M. e$ j# G6 Z& q二、复位5 e. @: e. x& n5 T& {9 D8 R

  V9 ~% T1 B8 e/ aCM3将复位视作异常,优先级最高的异常。4 |# h" E! P. ~3 v; ]7 l& A
7 d6 L% C& `5 }% v+ F9 x
stm32f1有三种复位:系统复位、电源复位、备份区复位。
+ l- N4 g6 H" g3 D& _+ p8 i3 z* M1 t, v5 v1 U9 }$ |7 H
前两种是真正的复位,对他的响应由硬件完成,这个响应对软件流的影响是这样的:程序指针指向0x0000 0004,这个单元存储的是复位服务子程序(或者汇编叫子过程),同时从0x0000 0000获取堆栈顶的地址。不同的复位类型还有对其他寄存的不同复位方式,这就完成了复位。而备份区复位则不然,The backup domain has two specific resets that affect only the backup domain(参考手册6.1 reset章节)
6 g' C  L$ I! i9 U" E4 q0 L  [  R. Q
          零地址存放的是堆栈顶的地址,之后就是以Reset_Handler打头的向量表。
. A' @: U" I5 ]. I0 F: I& A$ V0 b# c- M/ O8 A
          上面所说的向量表的存储从零地址开始,这是缺省的情况,可以通过NVIC的一个寄存器来重定向向量表。(权威指南7.3向量表)
$ j6 Z: h4 Z2 S$ c7 G/ Z0 C0 z+ B% a8 b) M
三、flash读写& Z4 c+ j: Y$ c
) L3 w1 \4 k; _
  1. void flashwrite(u16 data)
    4 u. ^9 R! D8 x! l+ T  l% [6 A
  2. {
    " P. u% `+ q. P; _5 t0 q* M
  3. FLASH_Unlock();' E# d' f6 j1 L6 c- N; v. d
  4. while(FLASH_GetFlagStatus(FLASH_FLAG_BSY)==1);. T* l0 ?  w7 `6 x
  5. FLASH->CR|=0x00000001;    //set PG
    ' H6 n& r! J" c4 L
  6. *((u16 *)0x0803F800)=data;
    % H2 e+ I4 |* f; x  H& P
  7. while(FLASH_GetFlagStatus(FLASH_FLAG_BSY)==1);2 c$ i, a7 R; ?/ p( G% ~- l
  8. lxj= *((u16 *)0x0803F800);1 O- t. D- U! y( Q4 q3 c
  9. " D8 }7 }2 s+ E1 q
  10. ( ]4 Q( E- z6 t5 k# O: t
  11. FLASH_Lock();/ M) _5 }5 t7 R! z/ x+ {( I* w7 Y
  12. }
    & X! W: o# ^" Q

  13. ; ]( q: _; l6 c* ^
  14. void flashread()
    , N2 {' p' A- h- B7 H. f8 H& u& K
  15. {- F7 [4 J- _  m7 D$ i
  16. FLASH_Unlock();- f' V1 d0 T" w+ r' g
  17. while(FLASH_GetFlagStatus(FLASH_FLAG_BSY)==1);, [: Y8 ?" k# s! k
  18. // FLASH->CR|=0x00000001;    //set PG" \7 V  P0 w+ P4 D1 h8 U; ~
  19. // *((u16 *)0x0803F800)=data;! G( r9 |0 k3 B
  20. // while(FLASH_GetFlagStatus(FLASH_FLAG_BSY)==1);" R5 m) E/ ^- Y6 U. `
  21. lxj= *((u16 *)0x0803F800);
    ( E8 \9 u' \1 n& J! I. H. ~* r

  22. : o% Q9 X- _- |# c

  23. * y( c1 ^& o+ D3 ^' B# @
  24. FLASH_Lock();/ x! B! c+ H& F$ s; s: @8 i
  25. }
复制代码
: P3 v4 m3 r# ?6 b5 B
$ t9 m, C9 }5 H& U$ o5 \
没仔细看,但能实现读写,不过用这两个函数的话,有一个bug,记下来回头研究。7 h1 n) z% y6 |" g, l
* m7 T7 B9 y7 P+ s$ u# x
flash必须先擦再写,flash_write以后,再写确实不行了,但再次上电,就能在同一个地址写了。而且flash确实烧写好了,掉电后数据不会消失$ X7 d1 a7 e- m! j
) _0 K3 \5 _2 z' a( D! j, K

) l' w* g. y/ c7 T5 O2 c- {% s! g1 b, v6 M, f$ {
1 z/ N" Q+ V, \
1342338958_5565.jpg
收藏 评论0 发布时间:2021-11-28 22:45

举报

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