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

STM32的三种启动模式解析

[复制链接]
flyingstar 发布时间:2025-3-21 09:12
7 [8 W7 \) ]' M7 }+ q6 ~. q  {

% k' R6 n  ^* X! E9 p5 R
9 G$ ^3 }. H1 ?5 f1 _
STM32三种启动模式" Z" j6 J! t1 r& h: \0 y
下好程序后,重启芯片时,SYSCLK的第4个上升沿,BOOT引脚的值将被锁存,这就是所谓的启动过程。STM32上电或者复位后,代码区始终从0x00000000开始,其实就是将存储空间的地址映射到0x00000000中。
! ^" {: ~- i, C, A" {
9 R: _: v7 z! l; n5 b. a

( P) ~4 ?% N, V  Q2 e" I三种启动模式如下:/ ?  m8 C4 j; N/ E( I5 w* Y  S

" z, x" J2 c  q3 Z. n, a
( C/ N8 C; m+ v3 J; ]5 D
主闪存存储器启动,将主Flash地址0x08000000映射到0x00000000,这样代码启动之后就相当于从0x08000000开始。主闪存存储器是STM32内置的Flash,作为芯片内置的Flash,是正常的工作模式。一般我们使用JTAG或者SWD模式下载程序时,就是下载到这个里面,重启后也直接从这启动程序。
, X0 p# ?  N# g( s. `  j) `- r" v& v3 {; Y
9 N; e. I9 S0 u. D$ M4 ]
系统存储器 启动。首先控制BOOT0、BOOT1管脚,复位后,STM32与上述两种方式类似,从系统存储器地址0x1FFF F000开始执行代码。系统存储器是芯片内部一块特定的区域,芯片出厂时在这个区域预置了一段Bootloader,就是通常说的ISP程序。这个区域的内容在芯片出厂后没有人能够修改或擦除,即它是一个ROM区。启动的程序功能由厂家设置。系统存储器存储的其实就是STM32自带的bootloader代码。
4 L* c3 V& L6 f8 f5 t
1 X, u: A6 S# i: g0 ?
# `. g0 {% M4 O9 G
内置SRAM启动,将SRAM地址0x20000000映射到0x00000000,这样代码启动之后就相当于从0x20000000开始。内置SRAM,也就是STM32的内存,既然是SRAM,自然也就没有程序存储的能力了,这个模式一般用于程序调试。假如我只修改了代码中一个小小的地方,然后就需要重新擦除整个Flash,比较的费时,可以考虑从这个模式启动代码,用于快速的程序调试,等程序调试完成后,在将程序下载到SRAM中。. M5 y! Z. R" _8 L6 Z
1 Q$ Q6 i* C5 Z8 r, d$ B; h2 @4 a
- n4 ^2 o+ S- O- [$ W/ b
用户可以通过设置BOOT1和BOOT0引脚的状态,来选择在复位后的启动模式。STM32三种启动模式对应的存储介质均是芯片内置的,如下图:0 Q# L; I4 A7 {2 t: ]+ M
v2-e28b00157f20aab42e821c50e425e5c2_1440w.jpg 6 ]( }$ x7 L0 W7 p5 ~1 h
: ^# k- r6 F( ?3 ?0 g& U, H2 L
% @, Q9 d- {( q. G! I) }
! N+ ]6 B- P7 m& z* a  ]# r6 i
串口下载程序原理
7 V; G# R( P7 M2 X* @' I3 d# a0 M6 g( ^& H) a: _

. @4 f+ _4 t9 A$ }+ s( G9 ]3 d从系统存储器启动,这种模式启动的程序功能是由厂家设置的。一般来说,这种启动方式用的比较少。系统存储器是芯片内部一块特定的区域,STM32在出厂时,由ST在这个区域内部预置了一段BootLoader,也就是我们常说的ISP程序,这是一块ROM,出厂后无法修改。; v0 m' y5 n1 ~; z, s$ w6 _

. o& S6 y# y1 _* b5 E8 n9 y) k2 o
! i0 X( L- C7 a
一般来说,我们选用这种启动模式时,是为了从串口下载程序,因为在厂家提供的BootLoader中,提供了串口下载程序的固件,可以通过这个BootLoader将程序下载到系统的Flash中。 # N8 B+ |, j1 u8 w$ w* t$ {/ W

9 k% G' n/ _7 F5 s! e+ h( U5 u
  }! X9 O. F( _1 s
这个下载方式需要以下步骤:
) E3 A  F. A1 C! R/ v
# I6 K0 o$ Z5 T5 L# E
  • 将BOOT0设置为1,BOOT1设置为0,然后按下复位键,这样才能从系统存储器启动BootLoader;
  • 在BootLoader的帮助下,通过串口下载程序到Flash中;
  • 程序下载完成后,又有需要将BOOT0设置为GND,手动复位,这样,STM32才可以从Flash中启动。3 b' W* Y8 O5 c3 `

* }3 ]2 V$ I/ N4 K" @8 n  W' H, K. W; [( G6 {  J* g

% S$ M) M# v# P: y( R从汇编代码分析STM32启动过程1 x+ I+ l# H* ~: M5 t( e
1 l3 Y7 J1 w. n8 U: y

" o! J9 _1 a* S: w' ^( kSTM32的启动文件与编译器有关,不同编译器,它的启动文件不同。虽然启动文件(汇编)代码各有不同,但它们原理类似,都属于汇编程序。拿基于MDK-ARM的启动文件来举例,说一下要点内容。在基于MDK的启动文件开始,有一段汇编代码是分配堆栈大小的。) j; L& c* U% M3 h
v2-04e4994c833f9d8e3bfb942285a31c8b_1440w.jpg ! V5 ~$ l; b' T8 }8 Q( I
这里重点知道堆栈数值大小就行。还有一段AREA(区域),表示分配一段堆栈数据段。可以使用[STM32](https://www.21ic.com/tags/STM32)CubeMX对上面的数值大小进行配置:
) c3 E* {: a8 D8 N) y
v2-7e4cb145dabc534d974470a4cadf676c_1440w.jpg
9 f( ?, q: k4 _, B在IAR中,是通过工程配置堆栈大小:
2 c! m6 Z% g2 H( l2 ]9 R
v2-9aa12d589dcf6e3d45729bba2321e08b_1440w.jpg # x5 s- ]1 b9 G' U  K6 L" k
看下面的汇编代码,程序上电之后,是跳到Reset_Handler这个位置。
1 A$ m& z) w- D+ F) K
v2-684df8bf2cff23dafcc1b706697cecf8_1440w.jpg & W6 M$ s, @" c, M+ K6 u) C6 m5 ?" K$ i  m
知道代码是从Reset_Handler开始执行,再来看如下Reset_Handler汇编代码。在启动的时候,执行了SystemInit这个函数。
' I. a- Y6 s  j6 A: d
v2-df04132669bab96bdde168a6fa31aa79_1440w.jpg , s0 z7 T9 {; J$ M
执行完SystemInit函数,初始化了系统时钟,之后跳转到main函数执行。

% r4 y: ^3 d: m: M+ ]& l( \, L3 j7 E$ Z+ G7 q
收藏 评论0 发布时间:2025-3-21 09:12

举报

0个回答

所属标签

相似分享

官网相关资源

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