一、前言
最近想把MCU相关的知识梳理一遍,希望加深自己对相关知识的理解,同时也作为备忘录提醒自己。首先是STM32的启动过程,理解这个过程是学习IAP和OTA功能以及深入stm32内核的基础。
二、总体流程介绍
1. 由boot引脚(boot0,boot1)选择启动模式;
2. 给SP、PC指针赋值;
3. 进入复位中断程序;
4. 进入main函数。
三、各个过程深入分析
1. 由boot引脚选择启动模式
stm32复位(上电复位、硬件复位、软件复位),会将复位后的起始地址和中断向量表重映射到其他地址,具体映射到哪个地址由boot0和boot1决定。具体映射关系如下图所示。

其中最常用的启动模式就是映射到内部FLASH启动,这也是接下来重点介绍的模式。
映射到内部SRAM启动的使用场景比较少,代码在SRAM的执行速度较快,可运用在一些调试需频繁更新代码的场合。
映射到系统存储器一般是用于bootloader引导程序升级时使用,在程序本地升级和OTA升级时都会用。
2. 给SP、PC指针赋值
选择内部FLASH启动后,程序会将栈指针SP指向0x08000000,这个地址保存的是__initial_sp的地址,也就是程序栈顶地址,还会将程序计数