STM32F4(KEIL) HardFault_Handler()调试方法

时间:2024-03-07 11:37:34

STM32F4, ARM Cortex-M4处理器。

问题:STM32F4板子仿真时,进入硬件异常中断处理函数HardFault_Handler(),如何调试?

HardFault_Handler()可能原因

1) 内存溢出或访问越界

2) 堆栈溢出

关于调试方法,以下基于一个例子说明。

1)查看异常寄存器:Peripherals>>Core Peripherals>>Fault Reports

关键寄存器:R15(PC),记录被异常中断打断前正在执行的指令地址。

Hard Faults:硬件错误。

FORCED置位:*引起。表示产生了其他类型的异常,但由于某些原因导致无法处理异常,升级为硬件错误异常。其真实原因参考其他错误状态。

此处,Bus Faults:总线错误。

PRECISERR置位:发生一个数据总线错误,PC值指向引起错误的指令。

BFARVALID置位:BFAR中保留一个有效故障地址。

2)查看寄存器:

view>>registers window

查看寄存器R14(LR)的值。如果是0XFFFFFFF9,使用的是MSP,中断返回用户程序。如果是0XFFFFFFFD,使用的是PSP,中断返回用户程序。如果是0XFFFFFFF1,使用MSP,从中断返回另一个中断。此处使用的是PSP。

(MSP:主堆栈指针;PSP:进程堆栈指针。)

3)在内存中查看PSP的值。

view>>memory windows>>memory 1

 

从堆栈地址开始的8个32位数值,依次是:R0, R1, R2, R3, R12, R14(LR), R15(PC), XPSR。

此处R15(PC)=0X0804EC90,在此地址基础上,偶数对齐,并向上减去8字节,=0X804EC88。

KEIL中调出show code at address窗口。

view>>disassembly window

空白处点右键,选择show disassembly at address...

输入地址0X804EC88,可定位到可能出问题的代码。

4)另一种测试方法

__asm void wait()
{
      BX lr
}

 void HardFault_Handler(void)
{
       wait();
}

在此设置断点,可以返回到出错位置。