STM32F4(KEIL) HardFault_Handler()调试方法
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();
}
在此设置断点,可以返回到出错位置。