当前位置:   article > 正文

stm32 HardFault异常调试总结

hardfault


在进行单片机的开发时,我们有时会遇到程序运行异常,进入到了hardfault中断。

异常产生的原因

软件

软件的错误是比较常见导致单片机进入hard fault的原因

  • 堆栈溢出(堆栈溢出可能导致hardfault,但不一定所有的栈溢出都会触发hardfault)
  • 数组越界
  • 野指针
  • 非对齐访问

硬件

  • 供电不稳
  • 电磁干扰
  • 极端的运行环境

定位错误

方法一 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即可快速锁定

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号