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函数有关的代码,定位到错误代码为:
修改成只有打开控件后才能操作控件的内容:文章来源:https://www.toymoban.com/news/detail-728838.html
故障至此修复。文章来源地址https://www.toymoban.com/news/detail-728838.html
到了这里,关于stm32cube出现Hardfault的调试方法(emwin死机)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!