从零实现 Cortex-M 硬件错误现场还原,核心是解析 SCB 中的 CFSR、HFSR、BFAR 等寄存器。建议在 HardFault_Handler 中用汇编获取压栈的 R0-R3、R12、LR、PC、xPSR,并传入 C 函数。C 函数中读取 SCB->CFSR、HFSR、BFAR、MMFAR,逐位解析:CFSR 包含 UsageFault、BusFault、MemManage 状态,如 INVSTATE、IMPRECISERR、PRECISERR、DACCVIOL 等。根据 BFAR 有效位(BFARVALID)决定是否打印故障地址。输出格式建议:先打印故障类型,再列出各状态位含义,最后给出 PC 和 LR 值,便于定位。注意:若使用 RTOS,需检查是否在中断中,并确保栈指针正确。实操中可结合 __attribute__((naked)) 或汇编包装,避免编译器破坏现场。
mcuku 阿沐 · 2026-09-26