
11.1 初学者重要提示 MDK本身也是支持硬件异常分析的,就是不够直观 IAR8带的硬件异常分析比较好用,在本章11.6小节有说明。 11.2 移植方法 直接移植SEGGER的硬件异常代码会有错误警告,这里针对IAR和MDK版本做了些简单修改,方便大家移植到自己的工程里面。 MDK版本移植 源文件位于本章配套例子的\User\segger\HardFaultHandlerMDK文件夹,添加如下两个文件到工程里面即可。 ![]() IAR版本移植 源文件位于本章配套例子的\User\segger\HardFaultHandlerIAR文件夹,添加如下两个文件到工程里面即可。 ![]() 在文件SEGGER_HardFaultHandler.c里面都添加了串口打印功能,方便不用编译器的调试功能时,通过串口打印提示是否进入硬件异常。
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自带的硬件异常提示方便(注意,下面的代码用到了位域)。
11.6 IAR自带的硬件异常分析 还以本章配套的例子为例,进入调试状态,全速运行,然后按下K1按键,就会进入硬件异常中断,此时停止调试,IAR还会弹出一个硬件异常错误分析,刚进来的时候也许是个空白 ![]() 单步调试刷新下就出来了: ![]() 指出了问题的原因是操作的数据地址有问题。 11.7 实验例程 专门为本章节配套了一个例子:V7-009_移植SEGGER的硬件异常分析机制。大家可以按照本章教程提供的方法进行测试。 11.8 总结 除了SEGGER的硬件异常分析方案,建议也测试下MDK和IAR的,以后遇到硬件异常问题,解决起来可以得心应手。 |
【STM32】总线架构
没学过51单片机,能否零基础学STM32?
STM32电机控制用什么型号?高级定时器功能详解与芯片选型指南
STM32H7R/S+TouchGFX:解锁智能家电沉浸式体验新维度
什么是STM32? STM32与ARM有什么关系? STM32能做什么?
STM32 不同时钟频率有什么不同的影响
《STM32H7R/S信息安全线上课程》学习笔记+安全存储
《STM32H7R/S信息安全线上课程》学习笔记+时域隔离,片内与片外存储器保护
《STM32H7R/S信息安全线上课程》学习笔记+跟着视频学一学
《STM32H7R/S信息安全线上课程》学习笔记+2.0 生命周期管理