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_Handler
或 SystemInit
之后,通常会调用 C 语言运行时初始化函数,如 _init()
,以便为 C 语言程序做好准备。这些初始化过程可能包括:
- 初始化
stdio
,为输入输出提供支持。 - 设置一些 C 语言相关的运行时参数。
7. 主函数(_main)
最后,Reset_Handler
会跳转到 C 语言的主函数 _main
,这是程序的入口点。此时,硬件和系统时钟已经准备就绪,C 库已初始化,栈指针也已经指向正确的位置,程序就可以开始执行了。
主函数 _main
通常是应用程序的入口,程序的实际逻辑、任务调度等都从这里开始。
总结
STM32 启动过程中的每一步都有其独特的作用,从硬件引脚设置、栈指针初始化,到异常中断设置、时钟初始化、C 库函数调用,最终跳转到 main
函数。这个过程确保了 MCU 在开始执行应用程序之前,所有硬件和系统资源都被正确初始化,保证了稳定的运行环境。
原文地址:https://blog.csdn.net/m0_63903713/article/details/143702232
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!