STM32上电启动流程

STM32上电启动流程
THEDISTM32三种启动方式
STM32有三种启动模式,用户可以通过设置BOOT0和BOOT1的引脚电平状态,来选择复位后的启动模式:
需要注意的是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中启动就可以正常运行了。
STM32启动文件
startup_stm32xx.s就是启动文件,这是一个用汇编语言写的文件,定义了中断向量表和中断服务函数等。启动有个复位中断是程序的入口,当stm32按下复位或者上电的时候,程序就会进入复位中断函数执行,复位中断函数做的就是调用SystemInit函数和调用main函数。
我们可以在启动文件文件的注释中知道流程为:
1.初始化堆栈指针SP
,初始化程序计数器PC
= Reset_Handler
2.设置中断向量表的所有中断服务程序的入口地址
3.转向Reset_Handler执行:
调用
SystemInit()
函数完成系统初始化(主要是系统时钟、外设等底层配置)跳转C库入口为
__main
, 初始化C运行时环境等(从Flash拷贝.data段到SRAM的.data段,清零.bss段、初始化堆栈等)从
__main
跳转到我们的main