stm32cube出现Hardfault的调试方法(emwin死机)

stm32cube出现Hardfault的调试方法

在STM32芯片开发中,当程序运行时出现HardFault异常,通常是由于以下原因引起的:

  • 程序中出现了无效的指令,比如指向不存在的内存地址或未初始化的指针;

  • 栈溢出,导致程序无法正常运行;

  • 部分寄存器值异常,例如SP(栈指针)、PC(程序计数器)、LR(链接寄存器)等;

  • 硬件问题,如时钟问题或存储器故障。

当HardFault发生后,事后诸葛亮分析方法:

首先,当程序异常时,将触发HardFault中断,进入HardFault_Handler,如下图所示:

由于STM32中断前,处理器会将错误信息推送到堆栈上。该信息包括程序计数器、故障状态寄存器和处理器寄存器。我们可以使用调试器从堆栈中读取这些信息,并对其进行分析以确定错误的原因。

简单地,我们可以利用IDE的优势,查找到堆栈的内容,如下图:

查找出出现硬错误进入HardFault_Handler前,堆栈的情况,这里可以看出,故障前,是调用了GUI_SetText函数,然后再调用GUI_ALLOC_LockH,我们可以直接通过查找调用过GUI_SetText函数的相关程序有无异常,从而查找出问题,我这里的问题是对未创建的控件进行操作,导致出现HardFault。

对于发生故障时,顺藤摸瓜,查找中断和堆栈的变化原理:

中断的堆栈变化如下图所示:

根据上图内容,我们需要得到中断前的PC(Return address)值,具体步骤:

(1)在HardFault_Handler中断服务程序里面取得当前SP值

(2)当前SP值加上6*4(Byte),得到中断前PC值的地址

确定SP:

因为堆栈寄存器SP实际有两个,一个是MSP,一个是PSP。不同的情况,使用不同的SP。需要通过LR寄存器确定使用的是哪个SP,详细解释如下图所示:

总结一下上表,可以得出,合法的EXC_RETURN值共3个,如下表所示:

读取了当前LR的值,如下图所示:

从LR的值可以看出,程序进入中断前使用的是MSP,将MSP的值放在Memory Monitor中搜索,如下图 所示:

选择Hex Integer格式:

找到MSP的地址:

在中断的描述中已经详细说明,根据MSP的地址加上6*4(Byte)可以找到中断前PC的值:

利用反编译工具,找到PC值上对应的程序段:

往上滑,找到出现故障的函数名:

打开Debug文件里的map文件,查找地址0x8026BF7附近的函数段也是GUI_SetText

确定是emwin的API GUI_SetText出现了问题,一般是对未创建的控件进行操作,导致出现HardFault,搜索与SetText函数有关的代码,定位到错误代码为:

修改成只有打开控件后才能操作控件的内容:

故障至此修复。

  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值