STM32的启动流程

本文主要介绍,STM32从 CPU 上电复位执行第 1 条指令开始(汇编文件)到进入 C 程序 main()函数入口之间的那个部分。

基本流程如下

3e03ddf99772445aafb9be7472030980.png

1、确定启动方式

       每个STM32的芯片上都有两个管脚BOOT0和BOOT1,这两个管脚在芯片复位时的电平状态决定了芯片复位后从哪个区域开始执行程序,也就是进入那种模式。

boot 0boot 1启动模式说明
0X从flash启动正常工作模式
10从系统存储器启动用于串口下载程序
11从内置SRAM启动用于程序调试

0d7e67e942f34c908a51b04eafd18488.png

2、初始化sp、pc指针

当系统复位后,处理器从向量表中读取前八个字节,也就是两条指令,前四个字节存入 MSP,后四个字节为复位向量,也就是程序执行的起始地址。

将 0x08000000 位置存放的堆栈栈顶地址存放到 SP 中(MSP)。

将 0x08000004 位置存放的向量地址装入 PC 程序计数器。

即sp=_initial_sp、pc=Reset_Handler,PC指针会从其指向的物理地址取出第 1 条指令开始执行程序,也就是开始执行复位中断服务程序 Reset_Handler,然后从Reset_Handler处开始执行代码

3、初始化系统时钟

复位中断服务程序Reset_Handler会调用SystemInit函数,进行对系统时钟的初始化

4、初始化用户堆栈

程序会执行到指令LDR R0, =__main,然后就跳转到__main程序段运行,__mian是标准库中的函数,其会调用c文件中的main函数

5、进入main函数

启动过程的最后也就是进入到C文件中的main函数。

 

 

 

### STM32微控制器启动过程详解 STM32 是基于 ARM Cortex-M 架构的微控制器系列,其启动过程涉及硬件初始化和软件执行两个主要阶段。以下是关于 STM32 启动过程的具体描述: #### 1. 上电复位与 Boot 模式选择 当 STM32 微控制器上电或发生复位事件时,内部硬件电路会自动进入复位状态。此时,微控制器的核心寄存器被设置为其默认值,同时系统会选择从哪个存储区域加载初始指令。 Boot 模式的选择由引脚 `BOOT0` 和 `BOOT1` 的组合决定[^1]。具体来说: - 如果 `BOOT0=0` 并且 `BOOT1=x`,则设备将从 Flash 存储器启动。 - 如果 `BOOT0=1` 并且 `BOOT1=0`,则设备将从 System Memory 启动。 - 如果 `BOOT0=1` 并且 `BOOT1=1`,则设备将从 SRAM 启动。 这种模式的选择允许开发者灵活地指定不同的启动源,例如运行预置的 bootloader 或者调试代码。 #### 2. 系统时钟配置 在完成 Boot 模式选择之后,STM32 进一步初始化系统时钟。默认情况下,微控制器会在复位后使用内部 RC 振荡器 (HSI) 作为系统时钟源。随后,可以通过修改 RCC(Reset and Clock Control)寄存器来切换至外部晶振 (HSE),并启用 PLL 来提高主频以达到最佳性能[^1]。 #### 3. 堆栈指针初始化 一旦选择了正确的时钟源,堆栈指针 (`SP`) 就会被初始化为链接器文件中定义的位置。该地址位于向量表的第一个条目处,而向量表本身通常驻留在闪存起始位置或者重新映射后的 RAM 地址范围内[^1]。 #### 4. 跳转到主函数入口点 紧接着,在向量表中的第二个条目保存着 Reset Handler 函数的地址。CPU 控制权转移至此函数,标志着正式进入了用户编写的程序逻辑部分。一般而言,Reset Handler 定义了一系列必要的低级初始化操作,比如 GPIO 设置、外设使能以及中断优先级分配等[^3]。 ```c void Reset_Handler(void) { // 初始化堆栈和其他环境变量 __initialize_hardware(); // 调用 C 库初始化例程 _SystemInit(); // 开始执行 main() 函数 main(); } ``` 以上即构成了整个 STM32 微控制器完整的启动流程概述。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

翔在天上飞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值