STM32 HardFault异常调试实践总结
HardFault异常调试
在进行单片机的开发时,我们有时会遇到程序运行异常,进入到了hardfault中断。
异常产生的原因
软件
软件的错误是比较常见导致单片机进入hard fault的原因
硬件
定位错误
方法一 Show Caller Code
在进入hard fault中断时打断点,然后查看call stack + local,右键,选择show caller code 可能查看到进入hardfault时运行前的代码。但有时不一定有效
方法二 根据栈中存的寄存器值,定位问题
1、确定sp数值,看使用的是MSP还是PSP,可以利用LR的bit[2]确定调用进程的使用的哪个栈,如果Bit 2 == 0则是MSP压栈,如果Bit 2 == 1则是PSP压栈
2、查看arm内核寄存器值,查看SP指针数值
3、在memory中查看sp指向的地址,以unsigned long查看
4、查看第六个数值,即异常压栈前LR寄存器的值,一般是08xxxxxx。
5、反汇编,查看这个数值所指向的代码
由于CortexM3 M4的处理器只支持Thumb状态,所以BLX使用的寄存器最低位必须要置为1。使用栈中保存的lr的值-1就为实际的反汇编代码的地址。
5、在跳转的地址附近查找可能出现的错误代码
参考资料
1、《ARM Cortex-M3与Cortex-M4权威指南》
2、MDK快速定位硬件异常位置方法,调用show caller code即可快速锁定