stm32 HardFault异常调试总结

6 篇文章 0 订阅


在进行单片机的开发时,我们有时会遇到程序运行异常,进入到了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即可快速锁定

  • 8
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值