STM32 HardFault异常调试实践总结

HardFault异常调试

  • 异常产生的原因
  • 软件
  • 硬件
  • 定位错误
  • 方法一 Show Caller Code
  • 方法二 根据栈中存的寄存器值,定位问题
  • 参考资料
  • 在进行单片机的开发时,我们有时会遇到程序运行异常,进入到了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即可快速锁定

    物联沃分享整理
    物联沃-IOTWORD物联网 » STM32 HardFault异常调试实践总结

    发表评论