多年前、TI 的某个人向我发送了允许我查询使我能够确定硬故障来源的寄存器的例程、其代码为:
// HardFaultHandler_C:
//
//这是从 Fault_Handler 中调用的,带有指针的故障堆栈
//作为参数。 然后、我们可以从堆栈中读取值、
//整合到局部变量中以便于读取。
//我们随后读取各种故障状态和地址寄存器以帮助进行解码
//故障原因。
//该函数以 BKPT 指令结束,以强制控制返回到调试器中
void 5.52 Fault_Handler (unsigned long * hardfault_args){
Volatile unsigned long stacked_r0 ;
Volatile unsigned long stacked_r1 ;
Volatile unsigned long stacked_r2 ;
volatile unsigned long stacked_r3 ;
Volatile unsigned long stacked_r12 ;
Volatile unsigned long stacked_lr ;
Volatile unsigned long stacked_pc ;
Volatile unsigned long stacked_psr ;
Volatile unsigned long _CFSR;
Volatile unsigned long _hfr ;
// volatile unsigned long _DFSR; //不在我们的 CPU 上
// volatile unsigned long _AFSR; //不在我们的 CPU 上
volatile unsigned long _BFAR ;
volatile unsigned long _MMAR ;
stacked_r0 =(( unsigned long)hardfault_args[0]);
stacked_r1 =(( unsigned long)hardfault_args[1]);
stacked_r2 =(( unsigned long)hardfault_args[2]);
stacked_r3 =((unsigned long)hardfault_args[3]);
stacked_r12 =(( unsigned long)hardfault_args[4]);
stacked_lr =(( unsigned long)hardfault_args[5]);
stacked_pc =(( unsigned long)hardfault_args[6]);
stacked_psr =(( unsigned long)hardfault_args[7]);
//可配置故障状态寄存器
//由 MMSR、BFSR 和 UFSR 组成
_CFSR =(*(volatile unsigned long *)(0xE000ED28));
//硬故障状态寄存器
HFSR =(*(volatile unsigned long *)(0xE000ED2C));
//调试故障状态寄存器
// _DFSR =(*(volatile unsigned long *)(0xE000ED30)); 我们的 CPU 上不存在。
//辅助故障状态寄存器
// _AFSR =(*((volatile unsigned long *)(0xE000ED3C )))); 我们的 CPU 上不存在。
//读取故障地址寄存器。 这些寄存器可能不包含有效值。
//检查 BFARVALID/MMARVALID 是否为有效值
// MemManage 故障地址寄存器
_MMAR =(*(volatile unsigned long *)(0xE000ED34));
//总线故障地址寄存器
_BFAR =(*(volatile unsigned long *)(0xE000ED38));
_asm ("BKPT #0\n"); //进入调试器
}
我当前的 MPU 是否有类似这样的配置?
谢谢、Doug