你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32H7移植SEGGER的硬件异常分析

[复制链接]
STMCU小助手 发布时间:2022-1-1 20:00
11.1 初学者重要提示
  MDK本身也是支持硬件异常分析的,就是不够直观

  IAR8带的硬件异常分析比较好用,在本章11.6小节有说明。
11.2 移植方法
直接移植SEGGER的硬件异常代码会有错误警告,这里针对IAR和MDK版本做了些简单修改,方便大家移植到自己的工程里面。

  MDK版本移植
源文件位于本章配套例子的\User\segger\HardFaultHandlerMDK文件夹,添加如下两个文件到工程里面即可。

aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDQvMTM3OTEwNy0yMDE5.png


  IAR版本移植
源文件位于本章配套例子的\User\segger\HardFaultHandlerIAR文件夹,添加如下两个文件到工程里面即可。

aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDQvMTM3OTEwNy0yMDE5.png


在文件SEGGER_HardFaultHandler.c里面都添加了串口打印功能,方便不用编译器的调试功能时,通过串口打印提示是否进入硬件异常。

  1. #define ERR_INFO "\r\nEnter HardFault_Handler, System Halt.\r\n"

  2. #if 1
  3. {
  4.         const char *pError = ERR_INFO;
  5.         uint8_t i;

  6.         for (i = 0; i < strlen(ERR_INFO); i++)
  7.         {
  8.                 USART1->TDR = pError<i>;
  9.                 /* 等待发送结束 */
  10.               </i>  while((USART1->ISR & USART_ISR_TC) == 0);
  11.         }        
  12. }
  13. #endif
复制代码

11.3 MDK锁定硬件异常位置方法
以本章配套的例子为大家做个说明。

1、测试方法比较简单,进入调试状态,全速运行,然后按下K1按键,就会进入硬件异常中断,此时停止调试,程序就会自动定位到如下位置:

aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDQvMTM3OTEwNy0yMDE5.png


2、在Watch1窗口添加变量_Continue

aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDQvMTM3OTEwNy0yMDE5.png


3、修改为任何非0数值,就可以继续单步调试。这个代码后面还有一个第1步中的while循环,也可以继续采用第2步的方法修改。退出硬件异常后就是大家进入硬件异常前下一条要执行的指令(可能还是这个函数本身,因为一个函数由多个指令完成)。定位到出问题的位置:

aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDQvMTM3OTEwNy0yMDE5.png


11.4 IAR锁定硬件异常位置方法

以本章配套的例子为大家做个说明。

1、测试方法比较简单,进入调试状态,全速运行,然后按下K1按键,就会进入硬件异常中断,此时停止调试,程序就会自动定位到如下位置:

aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDQvMTM3OTEwNy0yMDE5.png


2、在Watch1窗口添加变量_Continue

aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDQvMTM3OTEwNy0yMDE5.png


3、修改为任何非0数值,就可以继续单步调试。这个代码后面还有一个第1步中的while循环,也可以继续采用第2步的方法修改。退出硬件异常后就是大家进入硬件异常前下一条要执行的指令(可能还是这个函数本身,因为一个函数由多个指令完成)。定位到出问题的位置:

aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDQvMTM3OTEwNy0yMDE5.png


11.5 硬件异常原因分析
SEGGER提供的这个机制查找出问题的位置比较方便,具体原因需要继续在调试界面里面添加HardFaultRegs结构变量,这个结构体变量添加了所有大家想看的东西。下面是MDK调试状态查看部分结构体数值:

aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDQvMTM3OTEwNy0yMDE5.png


具体上面的变量代表什么含义呢,代码里面有注释,查阅起来没有IAR自带的硬件异常提示方便(注意,下面的代码用到了位域)。

  1. #if DEBUG
  2. static volatile unsigned int _Continue;  // Set this variable to 1 to run further

  3. static struct {
  4.   struct {
  5.     volatile unsigned int r0;            // Register R0
  6.     volatile unsigned int r1;            // Register R1
  7.     volatile unsigned int r2;            // Register R2
  8.     volatile unsigned int r3;            // Register R3
  9.     volatile unsigned int r12;           // Register R12
  10.     volatile unsigned int lr;            // Link register
  11.     volatile unsigned int pc;            // Program counter
  12.     union {
  13.       volatile unsigned int byte;
  14.       struct {
  15.         unsigned int IPSR : 8;           // Interrupt Program Status register (IPSR)
  16.         unsigned int EPSR : 19;          // Execution Program Status register (EPSR)
  17.         unsigned int APSR : 5;           // Application Program Status register (APSR)
  18.       } bits;
  19.     } psr;                               // Program status register.
  20.   } SavedRegs;

  21.   union {
  22.     volatile unsigned int byte;
  23.     struct {
  24.       unsigned int MEMFAULTACT    : 1;   // Read as 1 if memory management fault is active
  25.       unsigned int BUSFAULTACT    : 1;   // Read as 1 if bus fault exception is active
  26.       unsigned int UnusedBits1    : 1;
  27.       unsigned int USGFAULTACT    : 1;   // Read as 1 if usage fault exception is active
  28.       unsigned int UnusedBits2    : 3;
  29.       unsigned int SVCALLACT      : 1;   // Read as 1 if SVC exception is active
  30.       unsigned int MONITORACT     : 1;   // Read as 1 if debug monitor exception is active
  31.       unsigned int UnusedBits3    : 1;
  32.       unsigned int PENDSVACT      : 1;   // Read as 1 if PendSV exception is active
  33.       unsigned int SYSTICKACT     : 1;   // Read as 1 if SYSTICK exception is active
  34.       unsigned int USGFAULTPENDED : 1;   // Usage fault pended; usage fault started but was replaced by a
  35. higher-priority exception
  36.       unsigned int MEMFAULTPENDED : 1;   //  Memory management fault pended; memory management fault started
  37. but was replaced by a higher-priority exception
  38.       unsigned int BUSFAULTPENDED : 1;   // Bus fault pended; bus fault handler was started but was replaced
  39. by a higher-priority exception
  40.       unsigned int SVCALLPENDED   : 1;   // SVC pended; SVC was started but was replaced by a higher-priority
  41. exception
  42.       unsigned int MEMFAULTENA    : 1;   // Memory management fault handler enable
  43.       unsigned int BUSFAULTENA    : 1;   // Bus fault handler enable
  44.       unsigned int USGFAULTENA    : 1;   // Usage fault handler enable
  45.     } bits;
  46.   } syshndctrl;                          // System Handler Control and State Register (0xE000ED24)

  47.   /* 省略未写 */

  48.   volatile unsigned int afsr;            // Auxiliary Fault Status Register (0xE000ED3C), Vendor controlled (optional)
  49. } HardFaultRegs;
  50. #endif
复制代码

11.6 IAR自带的硬件异常分析
还以本章配套的例子为例,进入调试状态,全速运行,然后按下K1按键,就会进入硬件异常中断,此时停止调试,IAR还会弹出一个硬件异常错误分析,刚进来的时候也许是个空白

aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDQvMTM3OTEwNy0yMDE5.png


单步调试刷新下就出来了:

aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTM3OTEwNy8yMDE5MDQvMTM3OTEwNy0yMDE5.png


指出了问题的原因是操作的数据地址有问题。

11.7 实验例程
专门为本章节配套了一个例子:V7-009_移植SEGGER的硬件异常分析机制。大家可以按照本章教程提供的方法进行测试。

11.8 总结
除了SEGGER的硬件异常分析方案,建议也测试下MDK和IAR的,以后遇到硬件异常问题,解决起来可以得心应手。


收藏 评论0 发布时间:2022-1-1 20:00

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版