【STM32】基础知识 第九课 STM32启动
- MAP 文件
- MAP 文件浅析
- MAP 文件组成
- atk_f103.map 文件
- 启动模式
- STM32 启动模式 (F1)
- STM32 启动过程
- 启动文件介绍
- Reset_Handler 函数介绍
- 堆栈简介
MAP 文件
MAP 文件是 MDK 编译代码后, 产生的集程序, 数据及 IO 空间的一种映射列表文件. 简单来说就是包括了: 各种 .c 文件, 函数, 符号等的地址, 大小, 引用关系等信息.
MAP 作用:
- 分析各 .c 文件占用的 FLASH 和 RAM 的大小, 方便优化代码
MAP 文件浅析
文件类型 | 简介 |
---|---|
.o | 可重定向对象文件, 每个 .c/.s 文件都对应一下 .o 文件 |
.axf | 可执行对象文件, 由 .o 文件链接生成, 仿真的时候需要用到此文件 |
.hex | INTEL Hex 格式文件, 用于下载到 MCU 运行, 由 .axf 转换而来 |
.map | 连接器生成的列表文件, 对分析程序存储占用情况非常有用 |
其他 | .crf, .d, .dep, .lnp, .lst, .htm, .build_log.html 等一般用不到 |
MAP 文件组成
组成部分 | 简介 |
---|---|
程序段交叉引用关系 | 描述各文件之间函数调用关系 |
删除映像未使用的程序段 | 描述工程中未用到而被删除的冗余程序段 (函数/数据) |
映像符号表 | 描述各符号 (程序段/数据) 在存储器中的地址, 类型, 大小等 |
映像内存分布图 | 描述各个程序段 (函数) 在存储器中的地址及占用大小 |
映像组件大小 | 给出整个映像代码 (.o) 占用空间汇总信息 |
atk_f103.map 文件
截取 (部分):
Image component sizes
Code (inc. data) RO Data RW Data ZI Data Debug Object Name
196 0 0 0 2 2374 delay.o
170 0 0 4 0 1883 main.o
64 26 304 0 1536 920 startup_stm32f103xe.o
158 0 0 5 4 6082 stm32f1xx_hal.o
186 0 0 0 0 8823 stm32f1xx_hal_cortex.o
282 0 0 0 0 8255 stm32f1xx_hal_dma.o
494 20 0 0 0 4600 stm32f1xx_hal_gpio.o
1258 0 18 0 0 7600 stm32f1xx_hal_rcc.o
624 0 0 0 0 19043 stm32f1xx_hal_uart.o
20 0 0 0 0 1151 stm32f1xx_it.o
90 0 0 0 0 3712 sys.o
2 0 16 4 0 1716 system_stm32f1xx.o
160 0 0 0 267 6817 usart.o
----------------------------------------------------------------------
3746 46 370 16 1816 72976 Object Totals
0 0 32 0 0 0 (incl. Generated)
42 0 0 3 7 0 (incl. Padding)
----------------------------------------------------------------------
启动模式
M3/M4/M7 等内核复位后, 做的第一件事:
- 从地址 0x0000 0000 处取出堆栈指针 MSP 的初始值, 该值就是栈顶地址
- 从地址 0x0000 0004 处取出程序计数器指针 PC 的初始值, 改值是复位向量
STM32 启动模式 (F1)
在系统复位后, SYSCLK 的第 4 个上升沿, BOOT 引脚的值将被锁存.
启动模式选择引脚 BOOT1 | 启动模式选择引脚 BOOT2 | 启动模式 | 0x0000 0000 映射地址 | 0x0000 0004 映射地址 |
---|---|---|---|---|
X | 0 | 主闪存存储器 | 0x0800 0000 | 0x0800 0004 |
0 | 1 | 系统存储器 | 0x1FFFF 0000 | 0x1FFF F004 |
1 | 1 | 内置 SRAM | 0x2000 0000 | 0x2000 0004 |
如果要使用 FSMC 重映射到外部的 SRAM: 可以通过配置 SYSCFG_MEMRMP 寄存器.
启动模式选择 BOOT | 启动地址选项字节 | 启动模式 |
---|---|---|
0 | BOOT_ADD0[15:0] | 由用户选项字节 BOOT_ADD0[15:0] 决定启动地址, ST 出厂默认的启动地址为: 位于 0x0020 0000 的 ITCM 上的 FLASH |
1 | BOOT_ADD1[15:0] | 由用户选择字节 BOOT_ADD[15:0] 决定启动地址, ST 出厂默认的启动地址为: 位于 0x0010 0000 的系统存储器地址 |
选项字节允许将自举存储器地址配置为从 0x0000 0000 到 0x3FFF 0000 的任意地址, 其中低 16位只能位 0.
STM32 启动过程
- Reset
- 获取 MSP 值: 0x0800 0000
- 获取 PC 值: 0x0800 0004
- Reset_Handler
- 启动文件: startup_stm32xxx.s
- main 函数
启动文件介绍
- 初始化 MSP: 从 0x0800 0000 获取
- 初始化 PC: 从 0x0800 0004 获取
- 设置堆栈大小: Heap_Size(堆), Stack_Size(栈)
- 初始化中断向量表: __Vectors 定义
- 调用初始化函数: 可选的, 如调用: SystemInit 函数
- 调用__main: 标准 C 库函数, 执行一系列设置, 最终调用 main 函数
Reset_Handler 函数介绍
Reset_Handler PROC
EXPORT Reset_Handler [WEAK]
IMPORT __main
IMPORT SystemInit
LDR R0,=SystemInit
BLX R0
LDR R0,=__main
BX R0
ENDP
- EXPORT: 标明全局属性, 可被外部调用
- IMPORT: 申明来自外部文件, 类 extern
- PROC: 定义子程序
- ENDP: 表示子程序结束
- WEAK: 弱定义
堆栈简介
内存 | 作用 |
---|---|
栈 (Stack) | 编译器自动分配和释放, 存放函数参数, 局部变量等 |
堆 (Heap) | 程序员分配和释放, 如 malloc, calloc, realloc 等 |
函数局部变量较多, 嵌套关系复杂时, 需要加大栈大小 (Stack_Size).
出处: 笔记摘自正点原子