STM32 学习笔记-----STM32 的启动过程

STM32 的启动过程是一个精细而系统的流程,它涉及从芯片复位开始,到初始化系统、设置时钟、运行主程序等一系列步骤。下面详细介绍 STM32 启动过程的主要步骤。

1. Boot引脚设定

STM32 系列芯片有多个启动模式,这些模式是通过引脚(如 BOOT0 引脚)来设置的。具体的启动模式取决于 BOOT0 和 BOOT1 的状态。

  • BOOT0 = 0:默认启动模式,通过内部闪存启动,执行闪存中的固件。
  • BOOT0 = 1:从系统存储器启动,通常是指跳转到内置的引导加载程序(Bootloader)。
  • BOOT1 = 0/1:取决于 STM32 的不同型号,BOOT1 配置决定了是否可以通过某些特定的硬件引导程序启动,如通过 USB 或其他接口。

通过引脚配置,MCU 会选择合适的启动模式,这一步骤主要在硬件层面进行,设置后程序开始执行。

2. 查找初始地址并初始化栈指针(SP)

当 STM32 启动时,程序会从一个固定的地址开始执行。这个地址通常是由芯片的向量表(Vector Table)决定的,向量表中存放的是各种中断、异常的入口地址,包括复位向量。

  • 初始栈指针(SP) 是通过向量表的第一个位置获取的。向量表的第一个位置是 32 位的栈指针地址,MCU 会将该地址加载到栈指针寄存器(SP)中。
  • 然后,从向量表的第二个位置加载复位程序的入口地址(Reset_Handler),并将程序执行流跳转到该地址。

3. 复位程序(Reset_Handler)

在 STM32 启动后,CPU 会首先执行 Reset_Handler 函数。此函数的主要作用是完成一系列系统初始化操作,如:

  • 清空 .bss 段(未初始化的全局变量区)。
  • 设置 C 运行时环境,为后续的 C 语言代码执行做准备。
  • 初始化各类硬件外设,如看门狗、时钟等。

Reset_Handler 通常会调用 SystemInit 函数来完成一些基础的硬件配置,诸如系统时钟、外部时钟源初始化等。

4. 异常中断设置

在复位程序中,除了复位处理外,Reset_Handler 还会为中断控制器设置各类中断的初始状态,并使能相应的中断服务函数。

  • STM32 在启动时,会根据芯片的配置加载各类异常向量,包括硬件中断、系统异常等。
  • HardFault_Handler 是一个专门处理硬件故障的中断处理函数,它会在程序执行时出现不可恢复的错误(如除零错误或访问无效内存)时触发。

5. 系统时钟初始化(SystemInit)

Reset_Handler 执行过程中,通常会调用 SystemInit() 函数来进行系统时钟的初始化。该函数的工作内容通常包括:

  • 设置外部晶振或内部振荡器(HSI、HSE)的使能。
  • 配置 PLL(相位锁环)以提升系统时钟频率。
  • 设置系统时钟源,例如选择使用 PLL 输出作为主时钟。

这些步骤确保 MCU 的时钟系统在程序执行前正确配置,从而为后续的代码执行提供稳定的时钟信号。

6. 调用 C 库初始化函数

Reset_HandlerSystemInit 之后,通常会调用 C 语言运行时初始化函数,如 _init(),以便为 C 语言程序做好准备。这些初始化过程可能包括:

  • 初始化 stdio,为输入输出提供支持。
  • 设置一些 C 语言相关的运行时参数。

7. 主函数(_main)

最后,Reset_Handler 会跳转到 C 语言的主函数 _main,这是程序的入口点。此时,硬件和系统时钟已经准备就绪,C 库已初始化,栈指针也已经指向正确的位置,程序就可以开始执行了。

主函数 _main 通常是应用程序的入口,程序的实际逻辑、任务调度等都从这里开始。


总结

STM32 启动过程中的每一步都有其独特的作用,从硬件引脚设置、栈指针初始化,到异常中断设置、时钟初始化、C 库函数调用,最终跳转到 main 函数。这个过程确保了 MCU 在开始执行应用程序之前,所有硬件和系统资源都被正确初始化,保证了稳定的运行环境。

相关推荐
飞的肖1 小时前
日志(elk stack)基础语法学习,零基础学习
学习·elk
dal118网工任子仪3 小时前
66,【6】buuctf web [HarekazeCTF2019]Avatar Uploader 1
笔记·学习
02苏_3 小时前
2025/1/21 学习Vue的第四天
学习
羊小猪~~4 小时前
MYSQL学习笔记(四):多表关系、多表查询(交叉连接、内连接、外连接、自连接)、七种JSONS、集合
数据库·笔记·后端·sql·学习·mysql·考研
约定Da于配置4 小时前
uniapp封装websocket
前端·javascript·vue.js·websocket·网络协议·学习·uni-app
milk_yan5 小时前
Docker集成onlyoffice实现预览功能
前端·笔记·docker
东京老树根5 小时前
Excel 技巧15 - 在Excel中抠图头像,换背景色(★★)
笔记·学习·excel
andylauren5 小时前
(5)STM32 USB设备开发-USB键盘
stm32·嵌入式硬件·计算机外设
Ronin-Lotus6 小时前
嵌入式硬件篇---ADC模拟-数字转换
笔记·stm32·单片机·嵌入式硬件·学习·低代码·模块测试
编程小猹6 小时前
学习golang语言时遇到的难点语法
学习·golang·xcode