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

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

[复制链接]
STMCU小助手 发布时间:2021-11-28 22:45
一、存储器映射* p! R( Q1 w9 o6 W$ G8 W% A

8 u0 b( i/ F; t+ t/ Q       1、统一编址,程序存储器、数据存储器、外设寄存器组织在一个4GB的地址空间。
7 x+ c" K* V5 H+ A
$ e+ k/ o# W" o, q: l& |       2、小端格式1 @" y8 @9 h: I# S! }/ S, r

. Y! J  j) C3 Z- G: S       3、映像(stm32f107,256KB产品)5 Z% b  @& w1 B* e, M( q

: W+ o$ P% D- ]) B6 [; n
; r6 m3 J- j% y" F4 t 可以看到,所谓的256KB闪存,是指主存储,片上FLASH如下图所示:+ k: u1 h8 t7 ~. W
# x) i! u# B3 [6 ~
1342337656_6536.jpg
1 n8 o& b, p' U7 t% T. b
5 \4 G  c, r0 `9 P) N
介绍了片上的资源后,来看他们的地址映像。芯片将4GB的空间,划分为8个512MB的块(block),这些块有些是整块不用的,芯片对地址的安排可以参考数据手册,memory mapping章节中的那个图。只有block1、2、3、7是使用的。
! H* w! T, e( W# l0 c+ _" D9 c+ }3 `# e$ `: X  y' i! z2 `% b
地址中block7是核内的外设对应的地址,block2是其他外设对应的地址。block1的低地址64KB是片上SRAM,block0则如下图
8 M4 ^$ I3 s) @6 p2 x' B3 y4 z) O1 {
1342337868_7188.jpg

' l. T' u$ I0 U
0 y. }& \9 H& q) Roption bytes即是选项字节;system memory就是系统存储,也即片上ROM;这两部分就是所谓信息块。Flash就是指主存储,有256KB。6 D% s+ T/ d) k5 R
再往下看alias to flash or system memory.....这个区域256KB就是启动开始的区域。这个区域并没有一个自己的存储器,只是根据BOOT0、BOOT1的接法来选择哪个存储器映射到这个地址上。如下图& W7 _. o: O! V3 z2 a% A
: O# X+ r! d( Z' x8 b7 o4 P
1342338432_4880.jpg
7 m7 s' c% ]& A! t
; ]; q) q4 y5 L: B
选择用户闪存启动,是典型的做法;选择系统存储器,则在ST烧写进去的自举程序引导下,通过USART1下载程序;选择从SRAM执行代码则方便调试,比较快。
% p2 q( B& x/ M7 |; y4 U' {- X; H# T8 w3 I6 V* R. e  C
二、复位& J# c/ Z& s3 E$ X( o

9 X* q, @- n6 P* gCM3将复位视作异常,优先级最高的异常。$ f( ~5 r# X8 F$ V% e( ~5 y; T9 [! H6 ^( ]
# Q$ s/ b4 w8 E+ q  p
stm32f1有三种复位:系统复位、电源复位、备份区复位。
2 N9 X  K( `" U0 E# L8 o* o) n* U; D) b7 ~1 `! F3 h
前两种是真正的复位,对他的响应由硬件完成,这个响应对软件流的影响是这样的:程序指针指向0x0000 0004,这个单元存储的是复位服务子程序(或者汇编叫子过程),同时从0x0000 0000获取堆栈顶的地址。不同的复位类型还有对其他寄存的不同复位方式,这就完成了复位。而备份区复位则不然,The backup domain has two specific resets that affect only the backup domain(参考手册6.1 reset章节)' B: g- X: J# n4 w4 F. m, C
: s- D) Y: y8 V& p, [- o
          零地址存放的是堆栈顶的地址,之后就是以Reset_Handler打头的向量表。
! ?3 y# l1 @4 F- d" y7 C0 {# c" Q& S/ k3 ?. W/ i9 r
          上面所说的向量表的存储从零地址开始,这是缺省的情况,可以通过NVIC的一个寄存器来重定向向量表。(权威指南7.3向量表)0 w: [7 M9 @5 T* _- T. T
3 C; ]9 Q3 `: `8 i! V. q5 c
三、flash读写2 G6 l& q6 P( k

/ r; Q0 _& I; z! t' F, x
  1. void flashwrite(u16 data)
    8 c+ x  n; a: t- p4 N- Z$ y
  2. {
    7 Q2 ~' q6 U0 Y
  3. FLASH_Unlock();
    / K4 d# l3 e+ n" {
  4. while(FLASH_GetFlagStatus(FLASH_FLAG_BSY)==1);3 G$ e/ O" J( _8 {
  5. FLASH->CR|=0x00000001;    //set PG% f7 m  o4 O  i7 k8 W- G+ M3 x/ M9 G
  6. *((u16 *)0x0803F800)=data;" n. J1 S4 X. g, H- B( _! ?8 P6 ~
  7. while(FLASH_GetFlagStatus(FLASH_FLAG_BSY)==1);: ]" C3 s  L) {$ m" S
  8. lxj= *((u16 *)0x0803F800);
    , H0 V# f  j  C7 X+ F% Q  R$ e: T8 I
  9. 5 ?2 X  P" K2 @( _- h
  10. ) q* X  x* R9 R' @. S+ F) |
  11. FLASH_Lock();) R# j9 _) ~9 j. P6 v) a
  12. }  }: J. R. V  m+ s
  13. 3 L+ Y% X: G3 N. X
  14. void flashread()
    & U6 v$ L- t/ Q& a* |8 m
  15. {
    + U6 T- a$ k9 o* @6 [6 u! _* t/ s
  16. FLASH_Unlock();( b8 ?7 {3 P- r9 B2 E
  17. while(FLASH_GetFlagStatus(FLASH_FLAG_BSY)==1);+ C* a" p- j+ {( I1 W. L
  18. // FLASH->CR|=0x00000001;    //set PG
    % J! J- }) j3 q" v7 V( v
  19. // *((u16 *)0x0803F800)=data;9 Y1 s. A4 D) |2 I
  20. // while(FLASH_GetFlagStatus(FLASH_FLAG_BSY)==1);6 ]! s- `+ S: P1 h1 Z
  21. lxj= *((u16 *)0x0803F800);& u) B6 G3 x2 Z
  22. 8 H) U7 Q9 s' a7 H

  23. 1 f+ s6 j; `8 X- t- ?. w( i
  24. FLASH_Lock();
    7 a5 W2 `" c& C* R, A
  25. }
复制代码
2 L8 k+ L/ ^' u  j- D+ x6 Z

1 u0 S9 |6 {, ]. R! X没仔细看,但能实现读写,不过用这两个函数的话,有一个bug,记下来回头研究。" y' F, R. @3 |  @9 ^6 ?
% `9 t- e" S/ q: T# k
flash必须先擦再写,flash_write以后,再写确实不行了,但再次上电,就能在同一个地址写了。而且flash确实烧写好了,掉电后数据不会消失
5 K9 f$ n  o% S- a5 e  C/ z7 e% I  b8 G' j5 ]3 G" y0 }, F# I9 X

+ W: [1 l4 u/ v2 k$ [; u1 ?3 \, H1 I
- k: x" E: ?+ ^" y# ~
8 z4 P( }; f2 d# E
1342338958_5565.jpg
收藏 评论0 发布时间:2021-11-28 22:45

举报

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