【STM32H7教程】第11章 STM32H7移植SEGGER的硬件异常分析

摘要:
Tid=86980第11章STM32H7移植SEGGER的硬件异常分析本章介绍SEGGER硬件异常分析代码在MDK和IAR中的使用。

完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980

第11章       STM32H7移植SEGGER的硬件异常分析

本章节为大家介绍SEGGER的硬件异常分析代码在MDK和IAR中的使用方法,在实际项目中比较有实用价值,因为我们经常会遇到进入硬件异常的情况。

11.1 初学者重要提示

11.2 移植方法

11.3 MDK锁定硬件异常位置方法

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

11.5 硬件异常原因分析

11.6 IAR注释自带的硬件异常

11.7 实验例程

11.8 总结

11.1 初学者重要提示

  •   MDK本身也是支持硬件异常分析的,就是不够直观,此贴是MDK的硬件异常分析文档:

http://www.armbbs.cn/forum.php?mod=viewthread&tid=21940

  •   IAR8带的硬件异常分析比较好用,在本章11.6小节有说明。

11.2 移植方法

直接移植SEGGER的硬件异常代码会有错误警告,这里针对IAR和MDK版本做了些简单修改,方便大家移植到自己的工程里面。

  •   MDK版本移植

源文件位于本章配套例子的UserseggerHardFaultHandlerMDK文件夹,添加如下两个文件到工程里面即可。

【STM32H7教程】第11章 STM32H7移植SEGGER的硬件异常分析第1张 

  •   IAR版本移植

源文件位于本章配套例子的UserseggerHardFaultHandlerIAR文件夹,添加如下两个文件到工程里面即可。

【STM32H7教程】第11章 STM32H7移植SEGGER的硬件异常分析第2张 

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

#define ERR_INFO "
Enter HardFault_Handler, System Halt.
"

#if 1
{
    const char *pError = ERR_INFO;
    uint8_t i;

    for (i = 0; i < strlen(ERR_INFO); i++)
    {
        USART1->TDR = pError[i];
        /* 等待发送结束 */
        while((USART1->ISR & USART_ISR_TC) == 0);
    }    
}
#endif 

11.3 MDK锁定硬件异常位置方法

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

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

 【STM32H7教程】第11章 STM32H7移植SEGGER的硬件异常分析第3张

2、在Watch1窗口添加变量_Continue

【STM32H7教程】第11章 STM32H7移植SEGGER的硬件异常分析第4张 

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

 【STM32H7教程】第11章 STM32H7移植SEGGER的硬件异常分析第5张

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

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

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

【STM32H7教程】第11章 STM32H7移植SEGGER的硬件异常分析第6张 

2、在Watch1窗口添加变量_Continue

【STM32H7教程】第11章 STM32H7移植SEGGER的硬件异常分析第7张 

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

【STM32H7教程】第11章 STM32H7移植SEGGER的硬件异常分析第8张 

11.5 硬件异常原因分析

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

 【STM32H7教程】第11章 STM32H7移植SEGGER的硬件异常分析第9张

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

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

static struct {
  struct {
    volatile unsigned int r0;            // Register R0
    volatile unsigned int r1;            // Register R1
    volatile unsigned int r2;            // Register R2
    volatile unsigned int r3;            // Register R3
    volatile unsigned int r12;           // Register R12
    volatile unsigned int lr;            // Link register
    volatile unsigned int pc;            // Program counter
    union {
      volatile unsigned int byte;
      struct {
        unsigned int IPSR : 8;           // Interrupt Program Status register (IPSR)
        unsigned int EPSR : 19;          // Execution Program Status register (EPSR)
        unsigned int APSR : 5;           // Application Program Status register (APSR)
      } bits;
    } psr;                               // Program status register.
  } SavedRegs;

  union {
    volatile unsigned int byte;
    struct {
      unsigned int MEMFAULTACT    : 1;   // Read as 1 if memory management fault is active
      unsigned int BUSFAULTACT    : 1;   // Read as 1 if bus fault exception is active
      unsigned int UnusedBits1    : 1;
      unsigned int USGFAULTACT    : 1;   // Read as 1 if usage fault exception is active
      unsigned int UnusedBits2    : 3;
      unsigned int SVCALLACT      : 1;   // Read as 1 if SVC exception is active
      unsigned int MONITORACT     : 1;   // Read as 1 if debug monitor exception is active
      unsigned int UnusedBits3    : 1;
      unsigned int PENDSVACT      : 1;   // Read as 1 if PendSV exception is active
      unsigned int SYSTICKACT     : 1;   // Read as 1 if SYSTICK exception is active
      unsigned int USGFAULTPENDED : 1;   // Usage fault pended; usage fault started but was replaced by a
 higher-priority exception
      unsigned int MEMFAULTPENDED : 1;   //  Memory management fault pended; memory management fault started
 but was replaced by a higher-priority exception
      unsigned int BUSFAULTPENDED : 1;   // Bus fault pended; bus fault handler was started but was replaced
 by a higher-priority exception
      unsigned int SVCALLPENDED   : 1;   // SVC pended; SVC was started but was replaced by a higher-priority
 exception
      unsigned int MEMFAULTENA    : 1;   // Memory management fault handler enable
      unsigned int BUSFAULTENA    : 1;   // Bus fault handler enable
      unsigned int USGFAULTENA    : 1;   // Usage fault handler enable
    } bits;
  } syshndctrl;                          // System Handler Control and State Register (0xE000ED24)

  /* 省略未写 */

  volatile unsigned int afsr;            // Auxiliary Fault Status Register (0xE000ED3C), Vendor controlled (optional)
} HardFaultRegs;
#endif

11.6 IAR自带的硬件异常分析

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

【STM32H7教程】第11章 STM32H7移植SEGGER的硬件异常分析第10张 

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

【STM32H7教程】第11章 STM32H7移植SEGGER的硬件异常分析第11张 

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

11.7 实验例程

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

11.8 总结

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

免责声明:文章转载自《【STM32H7教程】第11章 STM32H7移植SEGGER的硬件异常分析》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇ulimit 不生效第三方库-正则re下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

STM32程序中使用printf打印中文字符乱码

STM32程序printf打印中文字符到串口出现乱码解决方法 作者 : 李剀 出处 : https://blog.csdn.net/Kevin_8_Lee/ 或者 https://www.cnblogs.com/kevin-nancy/ 欢迎转载,但也请保留上面这段声明。 谢谢! (以上两个链接均是我个人的博客,只是在不同的平台上面) 前言: 相信...

chromium截图实现

声明:本blog是我自己写的,假设要转载,请注明:come from blog of niba! chromium终于显示是在ContentView上。但通过硬件加速。渲染合成的网页之前是在surfaceview上的。 所以。实现chromium的截图能够通过SufraceView的截图去实现。   自己创建一个SurfaceView的子类,例如以下:...

IOS开发—事件处理,触摸事件,UITouch,UIEvent,响应者链条,手势识别

触摸事件 在用户使用app过程中,会产生各种各样的事件 一、iOS中的事件可以分为3大类型 触摸事件加速计事件远程控制事件 响应者对象在iOS中不是任何对象都能处理事件,只有继承了UIResponder的对象才能接收并处理事件。我们称之为“响应者对象” UIApplication、UIViewController、UIView都继承自UIRespond...

[转]SIFT,SURF,ORB,FAST 特征提取算法比较

转载地址:https://blog.csdn.net/vonzhoufz/article/details/46461849 主要的特征检测方法有以下几种,在一般的图像处理库中(如opencv, VLFeat, Boofcv等)都会实现。 FAST ,Machine Learning for High-speed Corner Detection, 200...

TableView的使用

            项目现在基本出了一个版本,虽然做的是边缘工作,但是用到的东西还是整理一下吧,毕竟也算学了一点点东西。首先是TableView的使用。RWT是SWT的子集,因此,RWT中可能没有完全实现SWT的全部接口,也没有SWT那么完善。两者的架构不同,表现在显示形式,界面也不尽相同,但是基本的控件的时候还是相同的。这里首先通过SWT来学习一些常...

iOS—静态方法(类方法)和实例方法

1.实例方法/动态方法     a).标识符:-     b).调用方式:(实例对象    函数)     c).实例方法在堆栈上。 2.静态方法/类方法     a).标识符:+     b).调用方式:(类    函数)     c).静态方法在堆上分配内存。 3.静态方法和实例方法的区分      a).静态方法常驻内存,实例方法不是,所以静态方法效...