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

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

[复制链接]
STMCU小助手 发布时间:2021-11-28 22:45
一、存储器映射4 c  R( \( g# R0 R* g' E
0 ^- ^2 Q* _" {& G
       1、统一编址,程序存储器、数据存储器、外设寄存器组织在一个4GB的地址空间。. {9 ~- j2 |( [- `

! E+ [' }3 \! B% j8 i2 `& H/ w+ F9 x: f       2、小端格式9 k! @# A% ?! G. _1 p7 w+ W: ~! e& P9 e
8 \0 F. [  b* Z7 g, z) @, g6 _
       3、映像(stm32f107,256KB产品)4 }4 g( h9 c4 a/ @! }
5 l% p2 j( @/ V+ b1 a3 r

; B5 ]7 G9 y% a6 \ 可以看到,所谓的256KB闪存,是指主存储,片上FLASH如下图所示:
. m2 n; L; y7 y! k& z& W; j. W( N0 g; e6 x2 i/ T  f2 U
1342337656_6536.jpg

' S- X# r# r5 ?' z# S; ~  A$ n) c) M" z8 r" ~& N9 G) o
介绍了片上的资源后,来看他们的地址映像。芯片将4GB的空间,划分为8个512MB的块(block),这些块有些是整块不用的,芯片对地址的安排可以参考数据手册,memory mapping章节中的那个图。只有block1、2、3、7是使用的。$ ^9 W# D" P0 N( R
3 f4 E8 _: }2 m$ B5 w) Z. r
地址中block7是核内的外设对应的地址,block2是其他外设对应的地址。block1的低地址64KB是片上SRAM,block0则如下图# s% h5 b$ b( B0 K. W

/ A* ]# P0 F. h1 p5 j) ~6 m
1342337868_7188.jpg
1 o  e; ]! Y" Y+ O3 W/ a! y6 C
( Z3 p; S2 r0 P4 @4 T  V
option bytes即是选项字节;system memory就是系统存储,也即片上ROM;这两部分就是所谓信息块。Flash就是指主存储,有256KB。: W8 ]* W+ t( v! H$ F) Q
再往下看alias to flash or system memory.....这个区域256KB就是启动开始的区域。这个区域并没有一个自己的存储器,只是根据BOOT0、BOOT1的接法来选择哪个存储器映射到这个地址上。如下图3 n" |% |8 l/ m; S
, e: n+ Z+ M3 x; m
1342338432_4880.jpg

1 Y3 u1 ~  r# o
1 W9 D3 Q5 ]9 Q+ i& D8 x选择用户闪存启动,是典型的做法;选择系统存储器,则在ST烧写进去的自举程序引导下,通过USART1下载程序;选择从SRAM执行代码则方便调试,比较快。
" S# _2 A% a8 a6 m6 W: l' ]. ^6 ~. _
二、复位: S& b+ w8 X7 w" S0 c, B+ G  z! N& c
( e  s* O7 N( q/ x
CM3将复位视作异常,优先级最高的异常。
4 w$ k) A' j2 Q5 |5 _; P# E; n& `* `6 |( m& _' p: d
stm32f1有三种复位:系统复位、电源复位、备份区复位。7 b2 ?4 @! o8 q% I; u' {
3 w7 k" I! {* i9 ~
前两种是真正的复位,对他的响应由硬件完成,这个响应对软件流的影响是这样的:程序指针指向0x0000 0004,这个单元存储的是复位服务子程序(或者汇编叫子过程),同时从0x0000 0000获取堆栈顶的地址。不同的复位类型还有对其他寄存的不同复位方式,这就完成了复位。而备份区复位则不然,The backup domain has two specific resets that affect only the backup domain(参考手册6.1 reset章节)4 J% E5 W- o) i9 O6 z; j( P$ z
% Q/ d: J; g9 Z# |# f
          零地址存放的是堆栈顶的地址,之后就是以Reset_Handler打头的向量表。
1 Q# G% `' d- n/ O, ]/ e& r3 i" ?$ {! V: [7 X( [
          上面所说的向量表的存储从零地址开始,这是缺省的情况,可以通过NVIC的一个寄存器来重定向向量表。(权威指南7.3向量表)# ?7 A9 e) d4 e" @( S, g* V

4 Q! N) x7 S5 a$ x+ J+ j三、flash读写
2 ]6 l+ c1 x6 W; T( j9 _6 T+ Y
( \, ]9 C: K% ?: m0 ]/ ~
  1. void flashwrite(u16 data)
    % ?" t( ^5 v! n; j- D" o
  2. {
    ' x/ u$ g4 O) g' I8 q# e
  3. FLASH_Unlock();  P1 r2 v7 P6 |" W2 A( A8 M
  4. while(FLASH_GetFlagStatus(FLASH_FLAG_BSY)==1);
    ! Z; y) X  }- z  W8 c8 q) ?- c
  5. FLASH->CR|=0x00000001;    //set PG
    2 {* l( E0 _; L9 f3 Q* V
  6. *((u16 *)0x0803F800)=data;2 F2 w, J' U( r4 W( Y' q3 U
  7. while(FLASH_GetFlagStatus(FLASH_FLAG_BSY)==1);( [5 c1 I" o6 Q) H
  8. lxj= *((u16 *)0x0803F800);
    . J8 Q) o! X) L
  9. - t$ V, s) d1 p! H, @! f5 _

  10. $ o9 m3 g6 F1 ]. d
  11. FLASH_Lock();
    " Y) l2 Q/ H' n1 }" E) l
  12. }
    5 S% b( g9 A4 m/ T# F, R+ h4 B

  13. ! T: [7 z8 [1 ~7 c; r3 _
  14. void flashread()) P4 @( G  A9 O, H' ]8 Q! g) G( I
  15. {
    - t& b- O: f8 a+ _" K
  16. FLASH_Unlock();1 E& N, l% k9 _4 h& G% a
  17. while(FLASH_GetFlagStatus(FLASH_FLAG_BSY)==1);9 c/ z7 f4 h, Q' t/ \/ W
  18. // FLASH->CR|=0x00000001;    //set PG7 v: @% d/ t, ?" z# E/ R! \
  19. // *((u16 *)0x0803F800)=data;
    ' q! h* z0 ]1 i
  20. // while(FLASH_GetFlagStatus(FLASH_FLAG_BSY)==1);
    7 S  O$ V4 {) D- R) J, t  N5 l
  21. lxj= *((u16 *)0x0803F800);7 X6 K/ E0 U# E- C) u$ _8 M, v
  22. * z/ M. }$ \5 r7 k/ O9 h( n
  23. 3 U; b5 E2 F* Q/ w) L" K; m
  24. FLASH_Lock();; A- K$ u8 M; @" M$ X" z- g
  25. }
复制代码
# U; o4 u& j. a8 \$ L2 @

) n8 i4 B7 ]$ P* e7 @7 ?没仔细看,但能实现读写,不过用这两个函数的话,有一个bug,记下来回头研究。( x  h. B2 ]" ~, z

/ ?4 r# b, ?. W+ |flash必须先擦再写,flash_write以后,再写确实不行了,但再次上电,就能在同一个地址写了。而且flash确实烧写好了,掉电后数据不会消失
' [8 M. R6 `' F. l% D/ {5 D- l' X8 W5 F- L+ D7 s7 b
* U; f2 M9 Q4 a( r- H
0 a4 U7 Y& e5 q( L! p8 r# t* z

( w$ n3 E/ ]. z9 H$ Q
1342338958_5565.jpg
收藏 评论0 发布时间:2021-11-28 22:45

举报

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