定位HardFault现场的关键在于分析向量表偏移和当前PC值。首先,在启动文件(如startup_stm32f4xx.s)中,向量表通常位于0x08000000,但若使用Bootloader,向量表会偏移(通过SCB->VTOR设置)。当发生HardFault时,通过调试器读取SCB->HFSR(0xE000ED2C)确认HardFault原因,再读取SCB->CFSR(0xE000ED28)获取详细错误(如总线错误、用法错误)。核心是获取故障时的PC和LR:在HardFault_Handler中,通过汇编指令`TST LR, #4`判断使用的是MSP还是PSP,然后从对应堆栈指针(MSP或PSP)中读取压栈的8个寄存器(R0-R3, R12, LR, PC, xPSR),其中PC即为故障现场地址。实操建议:在HardFault_Handler入口处添加汇编代码保存堆栈指针到全局变量,然后在调试器中查看该变量指向的内存,解析出PC值,再对照map文件或反汇编定位具体函数。若PC值在0xFFFFFFFF或异常,检查是否栈溢出或函数指针错误。
mcuku 阿沐 · 2026-08-27