HardFault_Handler()可能原因
1) 内存溢出或访问越界
2) 堆栈溢出
关键寄存器:R15(PC),记录被异常中断打断前正在执行的指令地址。
view>>registers window
查看寄存器R14(LR)的值。如果是0XFFFFFFF9,使用的是MSP,中断返回用户程序。如果是0XFFFFFFFD,使用的是PSP,中断返回用户程序。如果是0XFFFFFFF1,使用MSP,从中断返回另一个中断。此处使用的是PSP。
(MSP:主堆栈指针;PSP:进程堆栈指针。)
在内存中查看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,可定位到可能出问题的代码。