STM32——启动过程浅析
本文介绍了STM32开发中的Map文件解析和启动过程分析。主要内容包括:1)Map文件组成与作用,详细解析了函数调用关系、内存分布等关键信息;2)STM32不同系列(F1/F4/F7/H7)的启动模式设置,重点说明MSP和PC指针的定位原理;3)启动文件分析,涵盖Reset_Handler函数、中断向量表和堆栈分配等内容。通过Map文件可查看实际启动地址,帮助开发者优化代码和内存使用。文章为STM
总:STM32——学习总纲
参考文件:
Cortex-M3权威指南(中文)、ARM Cotrex-M3权威指南(英文).zip
一、Map文件解析
1.1 MDK编译过程文件
在编译中,会生成11种编译过程文件,可以设置输出到一个文件夹,如output文件夹。

1.2 Map文件概念与作用

作用:


1.3 Map文件组成*

1.4 Map分析 Flash/RAM 大小
1.4.1 MDK output文件夹输出配置


1.4.2 输出map文件查看方式:
a.
b.
1.4.3 分析map文件结构
1.4.3.1 函数的调用关系(Section Cross References)
![]()

i.main, i表示符号的入口
1.4.3.2 删除的冗余程序段(Removing Unused input sections from the image.)
![]()

1.4.3.3 映像符号表(Image Symbol Table)
![]()

包含局部符号,全局符号。
i.delay_us,表是函数入口地址
函数一般不带static都是全局符号
1.4.3.4 映像内存分布(Memory Map of the image)
![]()

1.4.3.5 映像组件大小(Image component sizes)
![]()

1.4.3.5.1 SRAM/FLASH 大小计算:
FLASH = Code + RO+RW
SRAM = RW + ZI
库的文件不开源(Library),无法优化;一般优化用户代码(Object)
1.4.3.6 map文件 SRAM/FLASH 总结

1.4.3.7 启动文件堆、栈分配(startup_stm32f103xe.s)

二、STM32启动过程
2.1 STM32 启动模式(F1/F4/F7/H7)/自举模式
2.1.1 前置


堆栈指针MSP指向栈顶地址(0x0000 0000 的值)
程序计数器指针PC指向复位向量(0x0000 0004 的值) → Reset_Hdlr(中断向量表复位向量)
![]()
启动模式的设置,也就是指定MSP和PC的定位。
---->
MSP = Main Stack Pointer(主堆栈指针),是 ARM Cortex‑M 架构里对 “系统 / 内核 / 中断用的那个栈指针” 的命名。
一、为什么叫 “Main”(主)
Cortex‑M 有两个物理栈指针(都叫 SP/R13):
- MSP:Main Stack Pointer → 主栈(系统默认、特权 / 中断 / 内核用)
- PSP:Process Stack Pointer → 进程 / 任务栈(用户任务、RTOS 用)
“Main” 强调它是系统默认、最基础、最高权限的栈:
- 复位后自动用 MSP
- 所有中断 / 异常强制切到 MSP
- 内核 / 特权代码必须用 MSP
二、一句话记
MSP = 系统 / 内核 / 中断的 “主栈”;PSP = 用户任务的 “任务栈”。
------>
PC 程序计数器一句话总结
PC 就是 CPU 的执行地址指针,CPU 永远执行 PC 指向的那条指令。
-
顺序执行时:PC 自动 +4,指向下一条
-
跳转 / 函数 / 中断时:PC 被强行修改,实现跳转
-
它只负责:下一步该跑哪行代码
----->
和 MSP 对比一下
-
PC:管 “下一步干啥”
-
MSP:管 “数据存在哪”
2.1.2 启动模式(F1)


也就是更改启动模式,复位下载重启
2.1.3 启动模式(F4)

2.1.4 启动模式(F7)

![]()
2.1.5 启动模式(H7)

2.2 STM32 启动过程

2.2.1 启动文件 startup_stm32xxx.s

2.2.2 Reset_Handler函数

2.2.3 堆栈简介
---》(1.4.3.7 启动文件堆、栈分配(startup_stm32f103xe.s))


2.2.4 __Vectors 中断向量表

存放的是函数首地址,函数指针。
2.2.4 启动过程图解


2.2.4.1 map文件查询地址
具体启动的实际地址可查询map文件



更多推荐



所有评论(0)