一、HardFault定义
STM32出现HardFault_Handler硬件错误的原因主要有两个方面:
1、内存溢出或者访问越界。(包括使用野指针)
2、堆栈溢出。
二、定位HardFault步骤
1. 判断所使用堆栈:
发生异常之后可首先查看LR寄存器中的值,确定当前使用堆栈为MSP或PSP
LR 寄存器的工作原理。当 Cortex-M4 处理器接受了一个异常后,寄存器组中的一些寄存器值会被自动压入当前栈空间里,这其中就包括链接寄存器(LR )。这时的 LR 会被更新为异常返回时需要使用的特殊值(EXC_RETURN)
EXC_RETURN 的定义如下,其为 32 位数值,高 28 位置 1,第 0 位到第三位则提供了异常返回机制所需的信息,如下表所示。可见其中第 2 位标示着进入异常前使用的栈是 MSP还是PSP。在异常处理过程结束时,MCU 需要根据该值来分配 SP 的值,0主栈,1进程栈。
在Cortex_M3权威指南中可以看到如下图所示:
发送在MSP
-
打开调试,全速运行,然后停止程序会在hardfault位置停止
2.找到相对应的堆栈指针
2. 在内存中查看相对应堆栈的内容,并找到PC指针
发生hardfault异常,内核将会将8个通用寄存器压入当前栈中R0~R3,R12,LR,PC(Return address),xPSR寄存器依次入栈,其中堆栈后第25个字节到28字节PC(Return address)即为发生异常前PC将要执行的下一条指令地址
-
对应内存中存储
3. 在反汇编窗口中输入PC寄存器里面存放的的地址,
-
实现了跳转
发生在PSP
同样实现了跳转
小技巧:
memory窗口这里可以右键设置为32位查看,这样看得比较方便:
设置后如下图: