启动流程
以内部flash启动为例,上电重启后,cpu从0x08000000地址开始的4个字节获取MSP的初始值,从0x08000004地址开始的4个字节获取PC的值。0x08000004地址存储的是Reset_Handler函数的地址值加1(因为CM通过LSB位,即最低位判断cpu是Thumb态还是ARM态,复位异常Reset_Handler只能在Thumb态下执行,所以赋给PC的地址值必须是奇数,但Reset_Handler的实际地址值为偶数)
stm32启动文件
stm32启动文件由st官方提供,在官方的固件包里。启动文件由汇编编写,是系统上电复位后第一个执行的程序。
启动文件主要做了以下工作:
1 初始化堆栈指针SP=__initial_sp
2 初始化程序计数器指针 PC=Reset_Handler
3 设置堆和堆的大小
4 初始化中断向量表
5 配置外部SRAM作为数据存储器(可选)
6 配置系统时钟,通过调用SystemInit函数(可选)
7 调用C库中的_main函数初始化用户堆栈,最终调用main函数
内存布局
boot0=0,boot1=x(0或1都可以) 从flash启动,将0x08000000映射到0x00000000
1 内核会从地址0x08000000处取出堆栈指针MSP的初始值,该值是栈顶地址。
2 从地址0x08000004处取出PC的初始值,该值指向中断服务程序Reset_Handler
CPU会从PC指向的地址取出第一条指令开始执行,就是执行复位中断服务程序Reset_Handler
系统启动后,初始化堆栈,MSP和PC后的内存情况
通过反汇编和仿真可以查看MSP和PC的值。
生成反汇编文件
在项目目录下编写和 生成反汇编文件.bat ,内容如下,双击即可生成反汇编文件
C:\software\Keil_v5\ARM\ARMCC\bin\fromelf --text -a -c --output=Project.axf.txt Objects\Project.axf
IROM规定了内部存储器ROM的地址空间,其中0x08000000是内部flash的起始地址;IRAM规定了内部存储器RAM的地址空间,其中0x20000000是内部sram的地址空间。根据启动模式的选择和栈空间的划分,修改IROM1和IRAM1。
反汇编代码
** Section #1 'ER_IROM1' (SHT_PROGBITS) [SHF_ALLOC + SHF_EXECINSTR]
Size : 4612 bytes (alignment 4)
Address: 0x08000000
$d.realdata
RESET
__Vectors
0x08000000: 20000670 p.. DCD 536872560;->MSP
0x08000004: 08000189 .... DCD 134218121;->PC
0x08000008: 08000489 .... DCD 134218889
0x0800000c: 08000369 i... DCD 134218601
...
MSP栈空间:0x20000000~0x2000066f
reset向量地址:0x08000188 (MSP的LSB位置1)
仿真
使用keilv5成功编译后,选择Debug->Start/Stop Debug Session
View->Memory Windows->Memory 1,然后在Memory 1窗口中 Address地址栏
输入0x08000000后按回车,就可以查看内存信息
生成bin文件
C:\software\Keil_v5\ARM\ARMCC\bin\fromelf --bin -a -c --output=Objects\Project.bin Objects\Project.axf
打开bin文件,可以看到前8字节为70 06 00 20 89 01 00 08分别对应MSP的初始值0x20000670和PC的初始值0x08000189
参考文献
STM32F103的启动过程及BootLoader作用:https://blog.csdn.net/qq_52907930/article/details/134892983
《Cortex-M3权威指南》
【STM32入门教程-2023版 细致讲解 中文字幕】 https://www.bilibili.com/video/BV1th411z7sn/?share_source=copy_web&vd_source=d0f633652d9c65dbc8655dcbf681e5b0 本文按采用该教程的项目进行反汇编分析。
1th411z7sn/?share_source=copy_web&vd_source=d0f633652d9c65dbc8655dcbf681e5b0 本文按采用该教程的项目进行反汇编分析。