STM32上电启动流程

STM32三种启动方式

STM32有三种启动模式,用户可以通过设置BOOT0BOOT1的引脚电平状态,来选择复位后的启动模式:

需要注意的是STM32上电复位以后,代码区都是从0x00000000开始的,三种启动模式只是将各自存储空间的地址映射到0x00000000中。

1.Flash启动:将Flash地址0x08000000映射到0x00000000,这样启动以后就相当于从0x08000000开始的,这是我们最常用的模式;

2.SRAM启动:将SRAM地址0x20000000映射到0x00000000,这样启动以后就相当于从0x20000000开始的,用于调试,笔者基本没用过;

3.系统存储器启动:将系统存储器地址0x1FFFF000映射到0x00000000,这样启动以后就相当于从0x1FFFF000开始执行的,值得注意的是这个系统存储器里面存储的其实是STM32自带的Bootloader代码,这其实是一个官方的IAP,它提供了可以通过UART1接口将用户的代码下载到Flash中的功能,下载完以后再切换到从Flash中启动就可以正常运行了。

image-20250808160931564

STM32启动文件

startup_stm32xx.s就是启动文件,这是一个用汇编语言写的文件,定义了中断向量表和中断服务函数等。启动有个复位中断是程序的入口,当stm32按下复位或者上电的时候,程序就会进入复位中断函数执行,复位中断函数做的就是调用SystemInit函数和调用main函数。

image-20250808161757013

我们可以在启动文件文件的注释中知道流程为:

1.初始化堆栈指针SP,初始化程序计数器PC = Reset_Handler

2.设置中断向量表的所有中断服务程序的入口地址

3.转向Reset_Handler执行:

  • 调用SystemInit()函数完成系统初始化(主要是系统时钟、外设等底层配置)

  • 跳转C库入口为__main, 初始化C运行时环境等(从Flash拷贝.data段到SRAM的.data段,清零.bss段、初始化堆栈等)

  • __main跳转到我们的main