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

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

[复制链接]
STMCU小助手 发布时间:2021-11-28 22:45
一、存储器映射
+ P3 I$ ?$ |- N/ k) l4 W! G+ y) B9 J# p
       1、统一编址,程序存储器、数据存储器、外设寄存器组织在一个4GB的地址空间。
7 K7 c6 s8 H9 H' y! i2 {; P8 H  {6 G3 V+ t6 A( H; R
       2、小端格式
: D- H1 C  a6 x+ R! r$ J* ]* S7 r' o6 Q, x* O* r# V
       3、映像(stm32f107,256KB产品)
/ i4 J: G* I1 B1 |7 E! U4 e# j2 V& n1 x$ T  D
9 `# e+ V6 m; j, v/ s" S. e
可以看到,所谓的256KB闪存,是指主存储,片上FLASH如下图所示:
) a" \5 l7 F, n; Z1 |: w" W7 t3 i1 u. O% }
1342337656_6536.jpg

  S: I: j7 j+ w- M+ m3 x" T3 d# t& d8 q% l) G7 F8 r
介绍了片上的资源后,来看他们的地址映像。芯片将4GB的空间,划分为8个512MB的块(block),这些块有些是整块不用的,芯片对地址的安排可以参考数据手册,memory mapping章节中的那个图。只有block1、2、3、7是使用的。, D, H$ ~9 {5 X* R" p7 O0 X
5 g: Q) [3 h4 j6 k; e- O+ L
地址中block7是核内的外设对应的地址,block2是其他外设对应的地址。block1的低地址64KB是片上SRAM,block0则如下图
" X  a7 L" e+ R1 z
# U3 W/ v* j/ c; P# s- y1 G
1342337868_7188.jpg

) m! V8 K4 P! G/ r  {7 g# h( F: `% ]$ ], _6 W
option bytes即是选项字节;system memory就是系统存储,也即片上ROM;这两部分就是所谓信息块。Flash就是指主存储,有256KB。
2 e2 h2 Z3 x, U4 G$ r/ a再往下看alias to flash or system memory.....这个区域256KB就是启动开始的区域。这个区域并没有一个自己的存储器,只是根据BOOT0、BOOT1的接法来选择哪个存储器映射到这个地址上。如下图1 V" H' F9 A0 n& D/ a1 B

/ e* l9 i+ N( }4 s+ t; a5 P1 K
1342338432_4880.jpg
! v8 A" u7 L; \

% P% l) o  R$ r: W3 t! C+ R选择用户闪存启动,是典型的做法;选择系统存储器,则在ST烧写进去的自举程序引导下,通过USART1下载程序;选择从SRAM执行代码则方便调试,比较快。
9 l/ j; Q/ ^+ |3 J2 k) t, j& ~3 ?' n6 @: O
二、复位; `$ o( w" a7 \, O; G+ A8 [7 e3 [

4 S  F! E/ \( w1 F/ QCM3将复位视作异常,优先级最高的异常。
' p1 h6 z% w) v% m1 R! W! q' Q6 G* i9 k+ l
stm32f1有三种复位:系统复位、电源复位、备份区复位。8 X2 e. z( `% |' C7 f
- P7 g1 \; s' ]4 Z- H- i9 U/ z6 s
前两种是真正的复位,对他的响应由硬件完成,这个响应对软件流的影响是这样的:程序指针指向0x0000 0004,这个单元存储的是复位服务子程序(或者汇编叫子过程),同时从0x0000 0000获取堆栈顶的地址。不同的复位类型还有对其他寄存的不同复位方式,这就完成了复位。而备份区复位则不然,The backup domain has two specific resets that affect only the backup domain(参考手册6.1 reset章节)  n) {6 q  i! T  e

* E5 @1 c/ B" O- l* V. k          零地址存放的是堆栈顶的地址,之后就是以Reset_Handler打头的向量表。7 k0 _4 [* q, L1 ~' Q
, c! d  H/ F  b3 R
          上面所说的向量表的存储从零地址开始,这是缺省的情况,可以通过NVIC的一个寄存器来重定向向量表。(权威指南7.3向量表)
2 g% T/ y. O; n3 S# I: f: e4 v: D& z7 _. u! {5 [- W
三、flash读写
  Q& y& S7 g7 L/ |' Q& ^& [) ^3 }& \8 g% M+ }
  1. void flashwrite(u16 data)$ X+ F) k6 K- R8 N4 T( L( N( B
  2. {4 N* @  Q! ?* G4 P& j
  3. FLASH_Unlock();1 {4 d( b0 [" Y0 d. t) L
  4. while(FLASH_GetFlagStatus(FLASH_FLAG_BSY)==1);, T6 w% N4 A% F& S5 l7 {
  5. FLASH->CR|=0x00000001;    //set PG* I' C% Q4 W5 y  u* [7 V3 P
  6. *((u16 *)0x0803F800)=data;
    ; ]7 Q4 m3 j0 L$ \7 b5 z
  7. while(FLASH_GetFlagStatus(FLASH_FLAG_BSY)==1);
    ' x9 ~5 J' J3 u; O
  8. lxj= *((u16 *)0x0803F800);8 s2 J* \4 h( |) D

  9. 2 N# i9 g: a( n
  10. - U6 w3 c0 P+ c8 M# K2 V
  11. FLASH_Lock();
    0 N5 c( a5 A$ D3 L" y+ ]" c
  12. }3 M( S2 X/ R: H+ ]$ t

  13. ) E/ ^9 [# ~+ A2 C# j. Z7 Y
  14. void flashread()8 ]- Z% u, e! z4 F
  15. {+ \9 Y" X  ?; y; P
  16. FLASH_Unlock();
    : r6 `# K1 r8 C( J. l2 j
  17. while(FLASH_GetFlagStatus(FLASH_FLAG_BSY)==1);& N2 o3 q: Y6 ~3 o
  18. // FLASH->CR|=0x00000001;    //set PG
    2 A; ?# ^/ D. Q7 j% p
  19. // *((u16 *)0x0803F800)=data;& q  u9 H6 B! I
  20. // while(FLASH_GetFlagStatus(FLASH_FLAG_BSY)==1);
    * ?1 F, ^, w- \) G' z+ K5 ]- d5 D
  21. lxj= *((u16 *)0x0803F800);' h' O, _* y* q: x8 r

  22. 0 A5 @: n: r0 ^6 z  t1 b; }5 t

  23. , q8 }" E0 F' u: N
  24. FLASH_Lock();- P4 Z; p! s) n
  25. }
复制代码
% I1 x7 S) z; h: x- N' ]. j6 z

# K# s( ~) O2 _0 ?, H9 V没仔细看,但能实现读写,不过用这两个函数的话,有一个bug,记下来回头研究。9 ^% E2 c* c9 L+ T7 E
$ f1 a1 N7 M$ l5 R! V
flash必须先擦再写,flash_write以后,再写确实不行了,但再次上电,就能在同一个地址写了。而且flash确实烧写好了,掉电后数据不会消失
1 K1 K. n, Z) O2 G4 c' H
* I9 {6 B, q& p; J9 i/ t8 r7 I
! p! E2 @! m4 B
5 h3 K6 S0 ~$ I  i5 l, |
) ?2 T8 g" }' c' t; A+ @7 ^
1342338958_5565.jpg
收藏 评论0 发布时间:2021-11-28 22:45

举报

0个回答

所属标签

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版