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

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

[复制链接]
STMCU小助手 发布时间:2021-11-28 22:45
一、存储器映射
% p4 ^8 _" l' u: ^  ^
; B) c$ g1 J8 I       1、统一编址,程序存储器、数据存储器、外设寄存器组织在一个4GB的地址空间。
* x( a# h9 Y  Q: A; K) O7 V/ g9 N5 T, O# S( P  N3 ?3 l3 V* e% U
       2、小端格式
% u6 @. P$ u5 Y$ K9 c4 V' t
  `9 |: v' F# I# P       3、映像(stm32f107,256KB产品)9 f7 c) M5 x) ^* @) n' v

) V+ p; |. u0 ]  D
* |2 J) }8 w( u; y' |8 |" ~9 j 可以看到,所谓的256KB闪存,是指主存储,片上FLASH如下图所示:
: A5 O4 \9 x$ B; C$ ?! r) w+ ]" a) I, u9 r# U# w* H
1342337656_6536.jpg
- Q3 c' W+ d& H& I
6 A, Q  z' l9 k2 a5 x
介绍了片上的资源后,来看他们的地址映像。芯片将4GB的空间,划分为8个512MB的块(block),这些块有些是整块不用的,芯片对地址的安排可以参考数据手册,memory mapping章节中的那个图。只有block1、2、3、7是使用的。* U" ]' @0 C$ m: W. N! m

; r& X$ A3 W. L7 H. y/ V  W. ^地址中block7是核内的外设对应的地址,block2是其他外设对应的地址。block1的低地址64KB是片上SRAM,block0则如下图
. r) I$ }1 b1 h
1 w  V! E1 K: M3 E
1342337868_7188.jpg
6 E  x. q5 x( p, n/ ^
7 v/ u) B1 t7 ~: v+ s$ Z
option bytes即是选项字节;system memory就是系统存储,也即片上ROM;这两部分就是所谓信息块。Flash就是指主存储,有256KB。
0 l! c- t8 y/ W0 C' ^% }再往下看alias to flash or system memory.....这个区域256KB就是启动开始的区域。这个区域并没有一个自己的存储器,只是根据BOOT0、BOOT1的接法来选择哪个存储器映射到这个地址上。如下图3 e! f( [% y3 l7 T6 ?4 @/ ~
1 Q, G3 @& q; \% [" G
1342338432_4880.jpg
" v  m) N9 H, n0 u
  Q" T* u- i$ _# w$ Q$ }
选择用户闪存启动,是典型的做法;选择系统存储器,则在ST烧写进去的自举程序引导下,通过USART1下载程序;选择从SRAM执行代码则方便调试,比较快。9 \; P& W/ n2 E. x* R; g6 U: t

; E1 b5 ^% Z' M& z二、复位
) I# Z) W5 U7 h3 _# G* Z' n
" y. d& s. P* N/ J- [6 G, c/ [1 KCM3将复位视作异常,优先级最高的异常。
+ K9 F; l. W- q1 F* K3 h+ U; |  @/ {, ^+ C" `! U  A
stm32f1有三种复位:系统复位、电源复位、备份区复位。/ I+ M; C- r% @
; P. I* [8 X0 V2 a& {" `
前两种是真正的复位,对他的响应由硬件完成,这个响应对软件流的影响是这样的:程序指针指向0x0000 0004,这个单元存储的是复位服务子程序(或者汇编叫子过程),同时从0x0000 0000获取堆栈顶的地址。不同的复位类型还有对其他寄存的不同复位方式,这就完成了复位。而备份区复位则不然,The backup domain has two specific resets that affect only the backup domain(参考手册6.1 reset章节)
1 a( S. v/ ~, ]( ]/ W& Q' k
2 u# P; I7 G( G3 t6 C* K          零地址存放的是堆栈顶的地址,之后就是以Reset_Handler打头的向量表。
6 R& H" m7 s$ R; ^5 k$ d2 ^, g5 T
. k% {% w& s- P* Y5 c          上面所说的向量表的存储从零地址开始,这是缺省的情况,可以通过NVIC的一个寄存器来重定向向量表。(权威指南7.3向量表)- R* M7 O) e. ~# l: H2 W: p# J/ m; X

+ i- n$ N" p, y7 r2 H三、flash读写
" [: E: Y) J9 D* Y4 V! A+ ?4 N! v4 s5 y& I: P# v
  1. void flashwrite(u16 data)
    3 V/ y6 U8 i4 N5 V5 j+ ^$ V
  2. {
    % S$ `; I5 W3 q0 s# d$ |& @" u
  3. FLASH_Unlock();) x8 A6 }- J* T" l6 k# W
  4. while(FLASH_GetFlagStatus(FLASH_FLAG_BSY)==1);. G1 C( ~6 Z" n/ f& U
  5. FLASH->CR|=0x00000001;    //set PG
    * J$ c! M1 N8 A; w  |
  6. *((u16 *)0x0803F800)=data;
    % [2 y8 J7 d5 m& m# Q
  7. while(FLASH_GetFlagStatus(FLASH_FLAG_BSY)==1);
    7 _; O, f2 D( ~7 u4 Q0 |1 w
  8. lxj= *((u16 *)0x0803F800);- ~9 H/ Q+ {# g7 f( j

  9. ( l  }) n% b, w+ b7 e
  10. / O5 \2 K  j) a: f
  11. FLASH_Lock();2 S! ?; [/ z- m1 |7 ~
  12. }
    ( S# I& @6 w8 w' {6 p

  13. 9 {" w8 |1 r0 h/ [& D: g
  14. void flashread()& ?7 ]: Z" p5 R9 B
  15. {. k: x. m$ A0 {  o% X1 q3 g
  16. FLASH_Unlock();
    " u% z. n/ W- J8 Y8 Z# g
  17. while(FLASH_GetFlagStatus(FLASH_FLAG_BSY)==1);
    * |: J7 B6 r4 L' l* q1 {
  18. // FLASH->CR|=0x00000001;    //set PG
    " B0 D( @. a6 ^2 V" t
  19. // *((u16 *)0x0803F800)=data;
    ! _9 w6 ~( Y" `) h, [
  20. // while(FLASH_GetFlagStatus(FLASH_FLAG_BSY)==1);
    4 u- r, l1 Z  |
  21. lxj= *((u16 *)0x0803F800);
    & G" U+ @( q$ w) H, I
  22. # ^( v( f$ ]6 k+ ?! T7 a$ e7 a9 B
  23. , f  X. o' w* n1 m; X! s: N
  24. FLASH_Lock();
    / C% m9 E8 F; S2 f
  25. }
复制代码
. F; W0 g* {. w0 P5 \6 F( Z# u

1 q7 ?: V. s5 z, A6 m5 L" p没仔细看,但能实现读写,不过用这两个函数的话,有一个bug,记下来回头研究。
8 T% x5 @0 C9 ]
2 K; X; Z0 K2 G1 Pflash必须先擦再写,flash_write以后,再写确实不行了,但再次上电,就能在同一个地址写了。而且flash确实烧写好了,掉电后数据不会消失
* j4 _. O/ p* S6 W' H# E% i- _  g" v$ P9 P
' R3 h1 ?5 D- n( X6 @
7 l, y( Q% c# f+ _" c

  i) r. Q, y4 B, p0 j) N- x
1342338958_5565.jpg
收藏 评论0 发布时间:2021-11-28 22:45

举报

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