首页 > 其他分享 >【STM32H7教程】第11章 STM32H7移植SEGGER的硬件异常分析

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

时间:2022-10-13 10:35:21浏览次数:94  
标签:11 int SEGGER unsigned 硬件 volatile STM32H7 fault 异常

​​

第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文件夹,添加如下两个文件到工程里面即可。

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

 

  •   IAR版本移植

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

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

 

在文件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 = 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的硬件异常分析_异常分析_03

2、在Watch1窗口添加变量_Continue

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

 

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

 

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

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

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

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

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

 

2、在Watch1窗口添加变量_Continue

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

 

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

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

 

11.5 硬件异常原因分析

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

 

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

具体上面的变量代表什么含义呢,代码里面有注释,查阅起来没有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的硬件异常分析_sed_10

 

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

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

 

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

11.7 实验例程

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

11.8 总结

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

 

微信公众号:armfly_com


标签:11,int,SEGGER,unsigned,硬件,volatile,STM32H7,fault,异常
From: https://blog.51cto.com/u_15785540/5752526

相关文章

  • LeetCode算法笔记 118. 杨辉三角
    importjunit.framework.TestCase;importjava.util.ArrayList;importjava.util.List;publicclassLeetCode04_2extendsTestCase{/****11......
  • [CF1151F]Sonya and Informatics
    做题时间:2022.10.12\(【题目描述】\)给定一个长度为\(n(n\leq100)\)的01串,进行\(k(k\leq10^9)\)次操作,每次操作等概率选择两个位置\(i,j(1\leqi<j\leqn)\),交换......
  • 【闲话】2022.10.11
    今天的考试又一次告诉了我相对论的伟大\(\Huge\color{red}{\text{喜报}}\)\(\LARGE\color{red}{\text{HZOI题库将采用最新的随机化算法!}}\)虽然但是,这玩意啥都可......
  • 【PMP学习笔记】第11章 项目风险管理
    一、风险管理的内涵什么是风险管理?项目风险管理旨在识别和管理未被其他项目管理过程所管理的风险。风险管理的目标:项目风险管理的目标在于提高正面风险的概率和(或)影......
  • vue11 组件初识
    序组件(component)是vue.js最强大的功能之一。组件的作用就是封装可重用的代码,通常一个组件就是一个功能体,便于在多个地方都能够调用这个功能体。每个组件都是Vue的实例对......
  • 有三AI发布360页11万字深度学习CV算法工程师成长指导手册,可下载收藏打印,未完待续...
    文/编辑|言有三字少事大,各位同学,今天有三AI平台发布《深度学习视觉算法工程师成长指导手册》,超过11万字,360页word文档,可下载收藏打印,且还有大约1/3内容并未完结,最终可能超......
  • }大括号位置不对引起的TS1128: Declaration or statement expected. 报错
     今天在查TS代码中,发现一个private函数总是报错,TS1128:Declarationorstatementexpected. 查了许久,还以为是vscode中ts插件的问题,折腾了一通,还是报错,静下心......
  • 11.NIO-零拷贝
    1.5.3、零拷贝传统IOjava本身并不具备IO读写能力,因此read方法调用后,要从java程序的用户态切换至内核态,去调用操作系统(Kernel)的读能力,将数据读入内核缓冲......
  • esp32-lvgl-ST7796+GT911
    1、st7789在lvgl配置菜单中使用ILI9481的驱动,如果使用st7789的驱动会出现显示颜色不正确,用ili9481的就可以2、gt911的驱动文件需要修改,修改gt911.c文件中60行,取消错误后的......
  • Win11操作系统,在使用电脑远程桌面的过程中出现“出现身份验证错误,要求的函数不受支持
    https://blog.csdn.net/wwwwestcn/article/details/122681555https://wenku.baidu.com/view/cd3e96872b4ac850ad02de80d4d8d15abf23004e.html按照常见的修改组策略后并没......