从零实现 Cortex-M 硬件错误现场还原:把 CFSR/HFSR/BFAR 解析成可读的故障报告

· 7 浏览

回答(4)

注意:若故障发生在中断嵌套中,需用 MSP 或 PSP 获取正确的栈帧,可检查 LR 的 EXC_RETURN 值。
RTOS爱好者 · 2026-09-26
建议把故障报告通过串口或 RTT 输出,并保存到备份寄存器,复位后仍可读取。
CortexM老司机 · 2026-09-26
补充:解析时先判断 CFSR 的 MMARVALID/BFARVALID,只有有效才读 MMFAR/BFAR,否则地址无意义。
嵌入式小兵 · 2026-09-26
从零实现 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