BusFault发生的原因
2026/9/30大约 2 分钟
Cortex-M BusFault:从 CFSR 到 BFAR
1. 什么是 BusFault?
SCB寄存器分配图

BusFault 表示 总线访问发生错误。
常见情况:
- 访问不存在的地址
- 总线访问错误
- 指令取指失败
- 数据读写失败
- 异常入栈/出栈过程中发生总线错误
2. 核心还是这三个寄存器
和 MemManage Fault 一样,主要看:
SHCSR → 是否使能 BusFault
CFSR → 发生了什么错误
BFAR → 出错的地址其中:
SHCSR

使能 BusFault:
SCB->SHCSR |= SCB_SHCSR_BUSFAULTENA_Msk;CFSR
判断具体是哪一种 BusFault。
重点关注 BFSR:


IBUSERR → 指令总线错误
PRECISERR → 精确数据总线错误
IMPRECISERR → 非精确数据总线错误
STKERR → 异常入栈错误
UNSTKERR → 异常出栈错误
BFARVALID → BFAR 中的地址有效BFAR

如果:
BFARVALID = 1那么:
SCB->BFAR保存发生 BusFault 的相关地址。
注意:
CFSR/BFSR → 判断错误类型
BFAR → 提供故障地址3. 最典型的调试流程
发生 BusFault
↓
BusFault_Handler
↓
读取 CFSR
↓
解析 BFSR
↓
判断具体错误类型
↓
BFARVALID = 1?
↓
读取 BFAR
↓
结合异常栈中的 PC / LR
↓
定位问题例如:
PRECISERR = 1
BFARVALID = 1
BFAR = 0x60000000
PC = 0x08001234可以理解为:
PC:哪条代码附近发生了异常
BFAR:访问了哪个地址
PRECISERR:发生了精确的数据总线错误4. 和 MemManage Fault 的区别
两者排查框架很像:
| Fault | 错误类型 | 地址寄存器 |
|---|---|---|
| MemManage | MPU/权限违规 | MMFAR |
| BusFault | 总线访问错误 | BFAR |
因此可以直接记成:
MemManage → CFSR + MMFAR
BusFault → CFSR + BFAR再结合:
异常栈 → PC / LR完成定位。
5. 一句话
CFSR 告诉你“什么错”,BFAR 告诉你“访问了哪个地址”,异常栈里的 PC 告诉你“代码走到了哪里”。

