目录
一、概要
本文主要讲解 基于cortex-m3的 STM32单片机从上电到程序运行的流程以及原理。
以下说明均以STM32F103(M3)系列为例。
二、STM32启动流程
1、STM32固件下载位置
STM32固件(编译生成的可执行bin文件)默认下载到0X08000000位置处,即STM32内部flash起始地址处。
2、上电程序入口。
单片机上电后,由硬件触发复位中断,复位中断为最高优先级,不可更改优先级,且不可屏蔽。
设备上电后,硬件会从存放程序的起始地址处读取一个字,作为为栈起始地址,第二个字为复位中断程序的入口地址(上电后pc寄存器被赋予的第一个有效值)。
如下图,通过编译后生成的map文件,我们可以确定复位向量的入口地址(Reset_Handler)为:0x080001DD。
如下图,我们以16进制的方式查看编译后生成的固件(.bin),发现固件第第二个字(绿框)确实为0X080001DD(以小端方式存放,所以是反序列)。固件中第一个字(红框)为0X2000EB40,在STM32的RAM段,作为栈的起始地址。
3、复位中断
复位中断的入口定义在汇编源文件startup_stm32f103xe.s中。
主要执行了系统初始化,系统初始化后进入用户main接口。实现如下图:
LDR R0, =SystemInit ;将SystemInit函数的入口,读到R0寄存器中。
BLX R0 ;跳转到R0寄存器中所指的地址中去执行。
LDR R0, =__main:将__main函数入口地址写入到寄存器R0中。
BX R0; 跳转到__main函数。
注意:_main是keil自带的mcu初始化程序,在_main中会调用到c文件中的main函数。
三、技术名词解释
一个字:长度是四字节
大小端:数据存放方式
四、小结
欢迎批评指正!