This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TM4C1290NCPDT:访问硬错误寄存器

Guru**** 1825110 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1334687/tm4c1290ncpdt-accessing-hard-error-registers

器件型号:TM4C1290NCPDT

多年前、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

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    多年前 TI 的一些人向我发送了允许我查询使我能够确定硬故障来源的寄存器的例程,该例程的代码为:

    尊敬的 Doug:

     我不知道你是从谁得到这个. 如果该函数是为 Arm M4处理器创建的、那么我不认为重用该函数有问题。 您的函数具有与 M4匹配的寄存器。 有关详细信息、请参阅数据表。 如果出现故障、您可以在寄存器窗口的 NVIC 模块中看到相同的寄存器。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢。