STM32硬件错误进入HardFault_Handle()的解决
有人插袋记得拍照
2023年11月29日 11:33

在运行stm32代码的时候,有时候会出现程序卡死的原因,很多人都喜欢在主函数里面放一个闪灯的代码来表示程序在运行,在没有看门狗的情况下,如果灯不闪了,就表示程序可能发生了卡死现象。

那么我们应该如何解决这种问题呢?要解决这种问题就要先了解为什么会卡死以及,是什么原因导致的以及如何定位问题代码等问题。

我本次实验是在STM32CubeIDE里面进行的。

用ST-LINK连接好芯片,打开调试界面。

点击箭头指向的那个按钮,让芯片全速运行。直到出现卡死现象。

当芯片卡死的时候,可以发现是进入了一个叫HardFault_Handler()的一个函数,里面就是一个while(1)死循环,这也是为什么会卡死的直接原因。

那么是什么导致进入这个函数的呢?

常见的有数组越界堆栈溢出,内存溢出,中断处理错误

具体是什么原因,要定位到具体问题代码才能明白。

我们观察左栏的函数调用情况

我们找问题代码,要找到LR是0xfffffff9或者0xfffffffD的情况,如果是0xfffffff9,就查看MSP的内容,如果是0xfffffffD,就查看PSP的内容。

这里我的LR值是0xfffffff8,所以是查看MSP,复制其内容,然后打开内存视图查找。

根据CM3的压栈规则,出现异常系统会自动地压入6个寄存器的值,分别是R0、R1、R2、R3、R12和LR寄存器的值,我们根据MSP的内容,往上偏移5个寄存器大小的位置,(因为栈是向下生长),就可以找到LR寄存器。由于CM3是小端模式,我们还需要调整下顺序:得到0x0800051D。然后根据这个去找问题代码区。

打开反汇编视图:输入 0x0800051C,因为CM3使用的是Thumb模式,所有指令地址的最低位是0。故输入0x0800051C。

0x0800051C所在的代码段就是问题代码段,我们找到对应的源码就可以找到问题了。很明显,我这里的源码区有对数组元素进行赋值的操作,所以可以断定是出现了数组越界的操作。

实际情况也确实是这样的。

以上就是进入Hardware异常查定位问题代码的过程。