1、Boot0、Boot1选择启动方式(boot0/1==0/1)
boot引脚可以决定芯片是怎么启动的,第一种是从flash(主闪存存储器)启动,第二种是SRAM启动,第三种是从系统存储器。
注意:STM32上电复位以后,代码区都是从0x00000000开始的,三种启动模式都是将各自存储空间的地址映射到0x00000000,相当于是从三种各自对应区域的首地址开始启动。
2、初始化sp、pc指针
当系统复位后,处理器从向量表中读取前八个字节,也就是两条指令,前四个字节存入 MSP,后四个字节为复位向量,也就是程序执行的起始地址。将 0x08000000 位置存放的堆栈栈顶地址存放到 SP 中(MSP)。将 0x08000004 位置存放的向量地址装入 PC 程序计数器。
即sp=_initial_sp、pc=Reset_Handler,PC指针会从其指向的物理地址取出第 1 条指令开始执行程序,也就是开始执行复位中断服务程序 Reset_Handler,然后从Reset_Handler处开始执行代码。
3、进入复位中断程序(初始化时钟、执行__main函数)
真正意义上执行的第一行代码就是执行复位中断,板子上的reset按键也是个复位中断,按下之后就进入复位了,所以进入复位中断就是一开始做的事情。
复位中断中做了什么呢?除了将中断向量表进行初始化之后,还有初始化时钟,执行__main函数,这个是C库里面提供的函数,这个函数最终会调用main函数,进入到自己写的程序中。
4、进入main函数
启动过程的最后也就是进入到C文件中的main函数。
5、STM32启动流程图:
那么对于芯片上电以后的情况,大致可以分为以下几步:
1、芯片上电时,执行复位中断。
2、执行复位中断服务函数,初始化系统时钟,再执行__main函数。
3、__main函数调用main函数。
4、进入main函数中的while死循环。
5、接受中断,从中断向量表找到中断服务函数。
6、执行中断服务函数。