【STM32H7教程】第11章 STM32H7移植SEGGER的硬件异常分析
完整教程下载地址: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版本移植
源文件位于本章配套例子的\User\segger\HardFaultHandlerMDK文件夹,添加如下两个文件到工程里面即可。

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

在文件SEGGER_HardFaultHandler.c里面都添加了串口打印功能,方便不用编译器的调试功能时,通过串口打印提示是否进入硬件异常。
#define ERR_INFO "\r\nEnter HardFault_Handler, System Halt.\r\n" #if 1
{
const char *pError = ERR_INFO;
uint8_t i; for (i = ; i < strlen(ERR_INFO); i++)
{
USART1->TDR = pError[i];
/* 等待发送结束 */
while((USART1->ISR & USART_ISR_TC) == );
}
}
#endif
11.3 MDK锁定硬件异常位置方法
以本章配套的例子为大家做个说明。
1、测试方法比较简单,进入调试状态,全速运行,然后按下K1按键,就会进入硬件异常中断,此时停止调试,程序就会自动定位到如下位置:

2、在Watch1窗口添加变量_Continue

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

11.4 IAR锁定硬件异常位置方法
以本章配套的例子为大家做个说明。
1、测试方法比较简单,进入调试状态,全速运行,然后按下K1按键,就会进入硬件异常中断,此时停止调试,程序就会自动定位到如下位置:

2、在Watch1窗口添加变量_Continue

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

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

具体上面的变量代表什么含义呢,代码里面有注释,查阅起来没有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 : ; // Interrupt Program Status register (IPSR)
unsigned int EPSR : ; // Execution Program Status register (EPSR)
unsigned int APSR : ; // Application Program Status register (APSR)
} bits;
} psr; // Program status register.
} SavedRegs; union {
volatile unsigned int byte;
struct {
unsigned int MEMFAULTACT : ; // Read as 1 if memory management fault is active
unsigned int BUSFAULTACT : ; // Read as 1 if bus fault exception is active
unsigned int UnusedBits1 : ;
unsigned int USGFAULTACT : ; // Read as 1 if usage fault exception is active
unsigned int UnusedBits2 : ;
unsigned int SVCALLACT : ; // Read as 1 if SVC exception is active
unsigned int MONITORACT : ; // Read as 1 if debug monitor exception is active
unsigned int UnusedBits3 : ;
unsigned int PENDSVACT : ; // Read as 1 if PendSV exception is active
unsigned int SYSTICKACT : ; // Read as 1 if SYSTICK exception is active
unsigned int USGFAULTPENDED : ; // Usage fault pended; usage fault started but was replaced by a
higher-priority exception
unsigned int MEMFAULTPENDED : ; // Memory management fault pended; memory management fault started
but was replaced by a higher-priority exception
unsigned int BUSFAULTPENDED : ; // Bus fault pended; bus fault handler was started but was replaced
by a higher-priority exception
unsigned int SVCALLPENDED : ; // SVC pended; SVC was started but was replaced by a higher-priority
exception
unsigned int MEMFAULTENA : ; // Memory management fault handler enable
unsigned int BUSFAULTENA : ; // Bus fault handler enable
unsigned int USGFAULTENA : ; // 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还会弹出一个硬件异常错误分析,刚进来的时候也许是个空白

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

指出了问题的原因是操作的数据地址有问题。
11.7 实验例程
专门为本章节配套了一个例子:V7-009_移植SEGGER的硬件异常分析机制。大家可以按照本章教程提供的方法进行测试。
11.8 总结
除了SEGGER的硬件异常分析方案,建议也测试下MDK和IAR的,以后遇到硬件异常问题,解决起来可以得心应手。
【STM32H7教程】第11章 STM32H7移植SEGGER的硬件异常分析的更多相关文章
- 【STM32H7教程】第6章 STM32H7工程模板建立(IAR8)
完整教程下载地址:http://forum.armfly.com/forum.php?mod=viewthread&tid=86980 第6章 STM32H7工程模板建立(IAR8) 本章 ...
- 【STM32H7教程】第4章 STM32H7工程模板建立(MDK5)
完整教程下载地址:http://forum.armfly.com/forum.php?mod=viewthread&tid=86980 第4章 STM32H7工程模板建立(MDK5) 本章 ...
- MDK快速定位硬件异常位置方法(移植SEGGER_HardFaultHandler库),调用show caller code即可快速锁定(参考硬汉哥)
今天网上看到keil中如果快速定位hardfault的方法参考如下说明:1. MDK的硬件异常分析主要是通过MDK调试状态进行分析的. 文档下载 apnt209.pdf (651 KB, 下载次数: ...
- 【STM32H7教程】第56章 STM32H7的DMA2D应用之刷色块,位图和Alpha混合
完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第56章 STM32H7的DMA2D应用之刷色块, ...
- 【STM32H7教程】第13章 STM32H7启动过程详解
完整教程下载地址:http://forum.armfly.com/forum.php?mod=viewthread&tid=86980 第13章 STM32H7启动过程详解 本章教 ...
- 【STM32H7教程】第8章 STM32H7的终极调试组件Event Recorder
完整教程下载地址:http://forum.armfly.com/forum.php?mod=viewthread&tid=86980 第8章 STM32H7的终极调试组件Event Re ...
- 【STM32H7教程】第2章 STM32H7的开发环境搭建
完整教程下载地址:http://forum.armfly.com/forum.php?mod=viewthread&tid=86980 第2章 STM32H7的开发环境搭建 本章主要为大 ...
- 【安富莱STM32H7教程】第1章 初学STM32H7的准备工作
完整教程下载地址:http://forum.armfly.com/forum.php?mod=viewthread&tid=86980 第1章 初学STM32H7的准备工作 俗话说万事开头 ...
- 【STM32H7教程】第22章 STM32H7的SysTick实现多组软件定时器
完整教程下载地址:http://forum.armfly.com/forum.php?mod=viewthread&tid=86980 第22章 STM32H7的SysTick实现 ...
随机推荐
- .net core使用orm操作mysql数据库
Mysql数据库由于其体积小.速度快.总体拥有成本低,尤其是开放源码这一特点,许多中小型网站为了降低网站总体拥有成本而选择了MySQL作为网站数据库.MySQL是一个多用户.多线程的关系型数据库管理系 ...
- 开源纯C#工控网关+组态软件(十)移植到.NET Core
一. 引子 写这个开源系列已经十来篇了.自从十年前注册博客园以来,关注了张善友.老赵.xiaotie.深蓝色右手等一众大牛,也围观了逗比的吉日嘎啦.精密顽石等形形色色的园友.然而整整十年一篇文章都 ...
- 【热身】github的使用
GitHub 可以托管各种Git版本库,并提供一个web界面,但与其它像 SourceForge或Google Code这样的服务不同,GitHub的独特卖点在于从另外一个项目进行分支的简易性.为一个 ...
- SQL Server性能优化(8)堆表结构介绍
一.表结构综述 下图是SQL Server中表的组织形式(其中分区1.分区2是为了便于管理,把表进行分区,放到不同的硬盘数据文件里.默认情况下,表只有一个分区.).表在硬盘上的存放形式,有堆和B树两种 ...
- 关于ajax原理阐述
ajax是什么呢?说白了就是一个请求,一个读取服务器资源以及提交资源到服务器的中间处理机制,那它具体是怎样工作的,又有怎样的原理呢?var ajax=function(url,fnSucceed,fn ...
- macbook 添加快捷启动服务
来至 Mac OS X: Launch Terminal from keyboard shortcut os x 上很多功能都可以通过Apple自家的Automator.app创建,且使用此方法可以为 ...
- Vue数据双向绑定原理及简单实现
嘿,Goodgirl and GoodBoy,点进来了就看完点个赞再go. Vue这个框架就不简单介绍了,它最大的特性就是数据的双向绑定以及虚拟dom.核心就是用数据来驱动视图层的改变.先看一段代码. ...
- Linux用户登录日志查询
# 1 utmp.wtmp.btmp文件 Linux用户登录信息放在三个文件中: 1 /var/run/utmp:记录当前正在登录系统的用户信息,默认由who和w记录当前登录用户的信息,uptime记 ...
- 在Linux上使用PGP签名验证文件完整性
文件在下载及存储过程中可能由于传输错误.硬件故障.文件系统错误等网络.硬件和软件方面的原因导致文件损坏,也可能在传输过程中受到攻击(如"中间人攻击")导致下载的文件被篡改或者下载到 ...
- Java 精简Jre jar打包成exe
#开始 最近几天都在忙一个事情,那就是尝试精简jre,我想不明白为什么甲骨文官方不出exe打包工具... 网络上精简jre的文章很多,但是原创的似乎没几个,绝大多数都是转发同一个博客, 这里借鉴了不少 ...