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

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

[复制链接]
STMCU小助手 发布时间:2021-11-28 22:45
一、存储器映射
3 m* x) q3 C1 m7 l/ n1 @; G' S) w  Y! T: a
       1、统一编址,程序存储器、数据存储器、外设寄存器组织在一个4GB的地址空间。- K. R+ D2 ?- j$ _( E% B
: b5 \) c! F) U" u
       2、小端格式0 i$ H* M, Q  ~

% ~- ^# L. D7 O) T9 i; }       3、映像(stm32f107,256KB产品)
3 T* a8 S* |3 Q6 U3 l; W0 K( V, [  F. ~- v

$ K, @" H& S8 @2 l3 t: h2 F 可以看到,所谓的256KB闪存,是指主存储,片上FLASH如下图所示:
. H  b& O2 u# ]! `
- I% C1 F: o5 v' V
1342337656_6536.jpg

) p$ C8 p4 k6 r6 t% A; H) o( ~" ?( ]: |
介绍了片上的资源后,来看他们的地址映像。芯片将4GB的空间,划分为8个512MB的块(block),这些块有些是整块不用的,芯片对地址的安排可以参考数据手册,memory mapping章节中的那个图。只有block1、2、3、7是使用的。
, I1 Y- |% x1 ]0 v- Z) C, `7 b8 L& [9 T# @- t* b4 C" R9 ^: h
地址中block7是核内的外设对应的地址,block2是其他外设对应的地址。block1的低地址64KB是片上SRAM,block0则如下图: e3 B) @' L# W8 U! S

0 m; Y9 F; R7 ~' [# I
1342337868_7188.jpg
0 s' }4 w9 Q4 J

) _/ ]# [& L( x9 L/ j9 ]+ U7 Eoption bytes即是选项字节;system memory就是系统存储,也即片上ROM;这两部分就是所谓信息块。Flash就是指主存储,有256KB。8 v9 C. W2 P, X: W
再往下看alias to flash or system memory.....这个区域256KB就是启动开始的区域。这个区域并没有一个自己的存储器,只是根据BOOT0、BOOT1的接法来选择哪个存储器映射到这个地址上。如下图
' E3 l7 B* w& Z3 d" W" ]4 r2 p- E* A
1342338432_4880.jpg
( d* d5 h1 V, S' F: I0 J

5 g7 _2 A( K9 ]* b* E5 J) ?% Q选择用户闪存启动,是典型的做法;选择系统存储器,则在ST烧写进去的自举程序引导下,通过USART1下载程序;选择从SRAM执行代码则方便调试,比较快。8 a8 g) f  `+ p' X& k: r

" O! ?4 b- W0 n* R( a& e5 r二、复位
9 m( f3 s! w1 j+ q. E1 ^8 Y8 R' ]0 s& x4 b
CM3将复位视作异常,优先级最高的异常。- H; ^2 H3 y; F8 W6 P
/ k& p) V9 Y1 T# e1 `+ o5 H0 @
stm32f1有三种复位:系统复位、电源复位、备份区复位。
& g7 _# M( M" ?, J& T  N( C  }
, o  f# l+ k: Q( D. O前两种是真正的复位,对他的响应由硬件完成,这个响应对软件流的影响是这样的:程序指针指向0x0000 0004,这个单元存储的是复位服务子程序(或者汇编叫子过程),同时从0x0000 0000获取堆栈顶的地址。不同的复位类型还有对其他寄存的不同复位方式,这就完成了复位。而备份区复位则不然,The backup domain has two specific resets that affect only the backup domain(参考手册6.1 reset章节)
/ Z, L& }/ B: q  d6 d/ F8 N4 ?% s0 p! b! P  l" \; k& ]
          零地址存放的是堆栈顶的地址,之后就是以Reset_Handler打头的向量表。/ y3 p# Z. u8 P- H

% Q, z9 D& K) h( N3 q; @3 L          上面所说的向量表的存储从零地址开始,这是缺省的情况,可以通过NVIC的一个寄存器来重定向向量表。(权威指南7.3向量表)
* _; C. x  x6 K/ E$ A" C" \) @" h- ^# ~: g# p! o9 \
三、flash读写
6 b2 y4 u" {7 t$ W( [5 B
& h* Y& t) W# J9 k
  1. void flashwrite(u16 data)1 w" f' m+ Y2 Y" Y
  2. {: P2 J1 x! m) `) U1 x; M
  3. FLASH_Unlock();- |4 N9 n1 Y2 E3 S. |
  4. while(FLASH_GetFlagStatus(FLASH_FLAG_BSY)==1);' ^: W+ S; d7 A/ g( s( @
  5. FLASH->CR|=0x00000001;    //set PG; V9 ^1 K( l6 m$ S) ?, \- K) n
  6. *((u16 *)0x0803F800)=data;7 K: @- A  y: M4 q& J
  7. while(FLASH_GetFlagStatus(FLASH_FLAG_BSY)==1);8 c  s% z5 O# {9 O0 n7 h/ J) n/ ]4 B
  8. lxj= *((u16 *)0x0803F800);
    / A/ z( N) c3 D: U8 l- r% K+ W$ K
  9. ( V! v! P0 X8 Z6 g
  10. : B' q9 L8 l/ _2 U( d  y
  11. FLASH_Lock();2 ^$ s' n0 t7 Y" [* t
  12. }* Z& h6 d6 ~% {3 B4 w) z
  13. % |5 F2 g3 F& V! N0 n( G
  14. void flashread()" M+ a$ E5 a  E% V
  15. {
    4 \1 [8 [5 ^( B  @( h
  16. FLASH_Unlock();# R! ]1 d( \9 P1 ^1 j( L5 l, d
  17. while(FLASH_GetFlagStatus(FLASH_FLAG_BSY)==1);
    - p8 c3 [5 f9 ~% p
  18. // FLASH->CR|=0x00000001;    //set PG
    6 O6 J& W- ^( f- s: J
  19. // *((u16 *)0x0803F800)=data;$ W( ]( b" j' k. P- U# R# b  z
  20. // while(FLASH_GetFlagStatus(FLASH_FLAG_BSY)==1);
    ' j6 O# R6 D$ z7 l: L
  21. lxj= *((u16 *)0x0803F800);
    2 n- b8 H9 T  G
  22. : a" u! I4 I9 }8 ?8 N

  23. $ ?/ Q% V6 N' G6 `3 ?
  24. FLASH_Lock();
    + V. x- y0 l9 J$ B* y1 n
  25. }
复制代码
# [0 w8 W5 M% `; i) A/ O9 G
2 A% s, q9 [; d
没仔细看,但能实现读写,不过用这两个函数的话,有一个bug,记下来回头研究。6 T+ Y( H. A6 r5 t: f1 S

& q. |* h7 p; X3 m& lflash必须先擦再写,flash_write以后,再写确实不行了,但再次上电,就能在同一个地址写了。而且flash确实烧写好了,掉电后数据不会消失; J7 G: [, P- P( Y  v4 o

' N' R6 k' G* H" c4 j- Q& y% c5 y) ^- t0 |! ~
, K  f6 m8 @( M

- Y% O; {  ~$ ?6 n
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 手机版