先读 CFSR(0xE000ED28)判断异常类型:若 MMARVALID=1,BFAR 就是出错访问地址;若 BFARVALID=0,则看栈帧。HardFault 时 LR 的 EXC_RETURN 值决定用 MSP 还是 PSP,再按 8 字节对齐取栈帧:R0-R3、R12、LR、PC、xPSR。PC 指向出错指令,LR 是返回地址,据此在反汇编中定位。若 CFSR 的 DACCVIOL/MMARVALID 置位且 BFAR 为 0x00000000 或极小值,基本可判定空指针解引用;若 BFAR 落在数组边界外或非法外设区,则是越界。实操建议:在 HardFault_Handler 中用汇编保存现场,把 CFSR、HFSR、BFAR、MMFAR、栈帧 R0-R3/R12/LR/PC/xPSR 打印或存入全局结构,再用 addr2line 或 IDE 反汇编定位源码行。注意先确认栈指针有效,避免二次异常。
mcuku 阿沐 · 2026-10-13