在Cortex-M处理器中,"复位中断"严格来说应称为复位异常(Reset Exception) ,它是优先级最高(固定为 -3 )的系统异常。它不仅仅是一个"中断",更是整个处理器运行的起点。
结合书中内容,复位中断(复位处理程序 Reset_Handler)的核心作用可以总结为以下五点:
1. 初始化核心硬件环境(建立运行基础)
这是复位后硬件自动完成的第一步,不需要软件干预:
- 加载初始栈指针(MSP) :处理器从向量表的第一个字 (地址
0x00000000)读取数值,自动写入主栈指针(R13/MSP)。这确保了在运行任何C代码之前,堆栈已经准备就绪。 - 获取起始执行地址 :处理器从向量表的第二个字 (地址
0x00000004)读取复位处理程序的入口地址,并加载到程序计数器(PC)中,强制CPU跳转至Reset_Handler开始执行。
2. 初始化"C运行时环境"(从汇编走向C语言)
复位处理程序的核心软件任务是将CPU从原始状态带入可运行高级C语言的状态,主要包括(见书中第4.11、4.12节):
- 调用
SystemInit()函数 :配置微控制器的时钟树 (如锁相环PLL)、总线矩阵 和外部存储器。这一步确保CPU能以正确的最高频率运行,且存储映射就绪。 - 执行
__main(数据搬运与清零) :编译器提供的__main函数负责:- 将RW-data(已初始化的全局/静态变量)从Flash复制到SRAM中。
- 将ZI-data (未初始化的全局/静态变量)所在的SRAM区域全部清零。
- 初始化堆(Heap)和栈(Stack)空间。
- 跳转至
main():完成上述"C语言土壤"的准备后,程序最终跳转至用户编写的main()函数,开始执行应用程序逻辑。
3. 作为"引导加载程序(Bootloader)"的桥梁
书中第3.29节专门强调了复位处理程序在复杂固件更新中的作用。通过设置向量表偏移寄存器(VTOR):
- 复位处理程序可以先执行引导加载程序,检查Flash中是否有有效的应用程序镜像。
- 若无有效应用或需要固件更新,则停留在Bootloader中等待升级;若应用有效,则跳转至应用代码的起始地址,并将向量表重映射至应用区,实现无缝切换。
4. 实现"软件复位"与系统恢复
复位异常不仅可以通过硬件引脚(如NRST)触发,也可通过软件主动触发(书中第4.15节):
- 通过调用
NVIC_SystemReset()函数,向应用中断与复位控制寄存器(AIRC)的复位位写入值,产生系统复位信号。 - 这一特性常用于系统死机(看门狗超时)恢复 、配置变更后重启 ,或者从深度睡眠彻底唤醒。
5. 复位后多级异常的处理映射
复位完成后,处理器默认处于线程模式(Thread Mode) 且拥有特权级别(Privileged) 。在进入用户 main() 之前,复位处理程序还会确保故障异常(如硬故障 HardFault)的默认处理程序(弱定义 WEAK)已就绪,防止程序跑飞后无处可去。
总结一句话 :
复位中断是处理器从"通电状态"过渡到"稳定的C语言运行状态"的唯一通路 。它负责"搭架子"(设置堆栈)、"通血脉"(配置时钟)和"搬砖块"(初始化内存),最终将CPU控制权安全地交给你的应用程序(main 函数)。如果缺少复位处理程序的正确配置,芯片将无法启动或发生内存访问错误。