二. STM32 启动过程
一.启动模式
1.系统复位
复位方式有三种:上电复位,硬件复位和软件复位。
上电复位,
触发条件:电源电压VDD从 0V 上升至正常工作电压。
复位源标志:复位会在复位状态寄存器(如 STM32 的 RCC_CSR)中置位 PORRSTF 标志。
硬件复位,
触发条件:1.手动按键复位:按下连接到 NRST 的按键,对地短接,产生低电平脉冲。
2.外部电路控制:例如电压监控芯片(如复位监控器)在电压异常时拉低 NRST。
3.调试器复位:调试器(如 ST-Link)通过控制 NRST 引脚触发复位。
4.看门狗本质是硬件复位
复位源标志:复位会在 RCC_CSR 中置位 PINRSTF。
软件复位,
触发条件: 利用 ARM 内核提供的系统控制块(SCB)中的应用中断和复位控制寄存器(AIRCR):
void SystemReset(void) {
__DSB(); // 数据同步屏障,确保所有内存访问完成
// 写入 AIRCR 寄存器,要求系统复位
SCB->AIRCR = (0x5FA << 16) | (1 << 2); // VECTKEY = 0x5FA, SYSRESETREQ = 1
__DSB();
while(1); // 等待复位发生
}
特点:RAM 内容通常保留,这是软件复位与上电复位的一个重要区别。
复位源标志:软件复位通常不会在 RCC_CSR 中设置专门的标志(但看门狗复位会有标志)
2.复位后

1.从地址 0x0000 0000 处取出堆栈指针 MSP 的初始值,该值就是栈顶地址。
2.从地址 0x0000 0004 处取出程序计数器指针 PC 的初始值,该值指向复位后执行的第一条指令
3.启动模式选择
将 0x0000 0000 和 0x0000 0004 两个的地址重映射到其他地址空间,就是启动模式选择。

二.启动文件分析
主要作用:
1、初始化堆栈指针 SP = _initial_sp
2、初始化程序计数器指针 PC = Reset_Handler
3、设置堆和栈的大小
4、初始化中断向量表
5、配置外部 SRAM 作为数据存储器(可选)
6、配置系统时钟,通过调用 SystemInit 函数(可选)
7、调用 C 库中的 _main 函数初始化用户堆栈,最终调用 main 函数
注意:堆和栈的生长方向相反的,堆是由低向高生长,而栈是从高往低生长。
内存分布示例,从地址 0x0800 0000 开始被执行:

三.Map文件
组成:
1, 程序段交叉引用关系(Section Cross References)
作用:描述了各个文件(.c/.s 等)之间函数(程序段)的调用关系。
示例:main.o(i.main) refers to sys.o(i.sys_stm32_clock_init) for sys_stm32_clock_init
表示:main.c 文件中的 main 函数,调用了 sys.c 中的 sys_stm32_clock_init 函数。其中:
i.main 表示 main 函数的入口地址,同理 i. sys_stm32_clock_init 表示 sys_stm32_clock_init 函数的入口地址。
2, 删除映像未使用的程序段(Removing Unused input sections from the image)
作用:描述了工程中由于未被调用而被删除的冗余程序段
示例:Removing usart.o(.text.usart_init), (204 bytes).
usart.c 里面的 usart_init 函数被移除了
3, 映像符号表(Image Symbol Table)
4, 映像内存分布图(Memory Map of the image)

5, 映像组件大小(Image component sizes)
浙公网安备 33010602011771号