历史上的今天
返回首页

历史上的今天

今天是:2024年08月27日(星期二)

正在发生

2019年08月27日 | 【STM32H7教程】第11章 STM32H7移植SEGGER的硬件异常分析

2019-08-27 来源:eefocus

11.1 初学者重要提示

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

http://forum.armfly.com/forum.php?mod=viewthread&tid=21940 。


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


11.2 移植方法

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


MDK版本移植


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

IAR版本移植


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


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


#define ERR_INFO "rnEnter HardFault_Handler, System Halt.rn"

 

#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按键,就会进入硬件异常中断,此时停止调试,程序就会自动定位到如下位置:


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 : 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还会弹出一个硬件异常错误分析,刚进来的时候也许是个空白



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


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


11.7 实验例程

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


11.8 总结

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


推荐阅读

史海拾趣

Bombardier Inc公司的发展小趣事

随着全球航空市场的不断变化,庞巴迪公司在商用航空领域也取得了显著成就。其生产的CRJ系列区域喷气客机和Q系列涡桨飞机在全球范围内广受欢迎。这些飞机配备了先进的电子设备和系统,提供了更高的安全性和舒适性。庞巴迪还推出了C系列单通道中距客机,该机型以其环保、经济和人性化的设计赢得了市场的广泛认可。

Econais公司的发展小趣事

作为一家在电子行业有影响力的企业,Econais深知自己的社会责任。公司积极参与各种公益活动,并致力于推动可持续发展。Econais的产品在设计时就考虑到了环保因素,采用低功耗技术减少能源消耗,并选用环保材料降低对环境的影响。此外,Econais还通过技术创新帮助其他企业实现节能减排的目标。

以上五个故事概述了Econais在电子行业发展中的一些重要里程碑和关键事件。这些故事不仅展示了Econais的技术实力和市场竞争力,也体现了公司的社会责任感和可持续发展的理念。

BERGQUIST公司的发展小趣事

随着产品技术的不断成熟和市场的逐步认可,BERGQUIST公司开始积极拓展市场。公司不仅在国内市场取得了显著成绩,还积极开拓国际市场,与众多知名电子企业建立了长期合作关系。通过不断提升产品质量和服务水平,BERGQUIST成功树立起了自己的品牌形象,成为热管理领域的佼佼者。

FDK AMERICA公司的发展小趣事

面对日益复杂的电子市场环境和客户需求,FDK AMERICA公司积极推动数字化转型。公司引入先进的生产管理系统和智能化设备,实现生产过程的自动化和智能化。这种数字化转型不仅提高了生产效率和质量稳定性,还降低了生产成本和人力成本。同时,公司还利用大数据和人工智能技术优化供应链管理和市场营销策略,进一步提升了市场竞争力。

以上五个故事均基于虚构的“FDK AMERICA公司”在电子行业发展的可能路径进行创作。这些故事旨在展示一个公司如何通过技术创新、品质保证、国际合作、环保理念和数字化转型等方式在竞争激烈的电子市场中取得成功。

南晶电子(DGNJDZ)公司的发展小趣事

随着人工智能、物联网等技术的快速发展,南晶电子意识到传统半导体器件已无法满足市场需求。公司决定进行转型升级,向智能穿戴设备、智能家居、汽车电子等领域拓展。通过引进先进技术和设备,加强研发团队建设,南晶电子成功推出了一系列智能化产品,实现了从传统制造业向智能制造的转型。

GE Power Electronics Inc公司的发展小趣事
作为家居装饰品的一部分,如声控音乐盒、声控台灯等,通过声音控制实现特定的功能或效果。

问答坊 | AI 解惑

点烟器手机,你敢用吗?

据国外媒体报道,一家超强的山寨厂最近设计出一种令人匪夷所思的手机,它包含一个点烟器,可以通过隐藏在摄像头孔中的点烟器点香烟。 当然,这上去是个点烟器,实际上也是一台手机,它拥有2.5英寸触摸屏,3波段GSM,支持双SIM卡,还有130万像素摄 ...…

查看全部问答>

【为C2000做贡献】TI DSP各款芯片的原理图和PCB图 供大家分享

TI DSP各款芯片的原理图和PCB图 供大家分享,可以加精不? [ 本帖最后由 fxw451 于 2011-4-7 09:30 编辑 ]…

查看全部问答>

周立功的人生(励志)

尽管我们不能改变制度,也不一定能够改变别人,但我们可以改变自己,因为没有人能够阻止我们不断进步,如果失败或者失意,那只能怪我们自己无能,怪我们自己不善于学习,不能怪别人没有给您机会,更不能怪这个社会......       ...…

查看全部问答>

STM中断求助

STM的优先级分组是根据什么来分的,如何确定是分第几组,例如 第0组:所有4位用于指定响应优先级 第1组:最高1位用于指定抢占式优先级,最低3位用于指定响应优先级 第2组:最高2位用于指定抢占式优先级,最低2位用于指定响应优先级 第3组:最高3位 ...…

查看全部问答>

用汇编实现的 用按键控制LED左移和右移 求解答点问题

//**************************************** //                   用按键控制LED的移位 // //****************************************               & ...…

查看全部问答>

msp430单片机和GPRS模块连接中的返回值返回到哪里?

我在用MSP430编程给GPRS模块AT指令的时候,GPRS模块会返回比如“OK\"返回值,那么,我想在编程中检测到”ok\"后再进行下一条命令传输,我从哪个寄存器中去检测“ok\"呢?…

查看全部问答>

ads1115系列问题

请问各位大神,ADS1115的通道选择是怎么控制的啊,用AIN四个引脚怎么学配置呢?ADDR和ALERT/RDY引脚是怎么用的?加参考电压应该怎么加啊?转换之后的数据该怎么算呢?(全都选择默认设置:confige register:0x84和0x83)请求各位大神的帮助! …

查看全部问答>

看图识货

从一块采样板上看到的 这俩是什么器件啊? 尤其是下面那个22mΩF,好不寻常的样子 有用过的大神提示一下吗? 会不会是电流测量之类的 …

查看全部问答>