打印
[APM32F4]

HardFault排查——软件方案

[复制链接]
1139|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 山不转水转 于 2022-6-22 14:26 编辑

问题背景
实际调试、或者产品开发阶段,有时候会碰到产品触发异常、报HardFault这类错误。
在这里介绍一种排查软件端问题的调试方法。

测试原理
简单来说,就是利用 “MCU触发HardFault异常、跳转到HardFault服务函数前,会把现场的内核寄存器值先压入堆栈空间保存好” 的这个特性。
所以我们可以:


    • 确认触发HardFault后,使用的是PSP进程堆栈,还是MSP主堆栈(一般是MSP,也可理解用户在SRAM中划分出来的堆栈空间)
    • 根据对应堆栈SP指针,挑出触发HardFault的PC指针所指向的位置。
    • 注意现场保存、寄存器值入栈顺序:xPSR->PC->LR->R12->R3~R0

   

   

   

实测
基于APM32F407demo板,新建会触发HardFault的例程——访问、改写溢出实际SRAM存储空间的数据
   
   
仿真调试下,全速运行,成功触发Hardfault。
   
0x2000_03E0堆栈位置,存储着进入HardFault的内核寄存器信息,如图所示
  • PC指向地址是0x08003AA——可找到对应触发HardFault的汇编代码

   
上述分析可以看到,在对0x2003_0002这个异常存储空间进行操作后,会影响往下代码指令的执行(特别是操作SRAM空间)从而触发HardFault

后话
HardFault的触发还有很多因素,比如客户的MCU供电问题、某些VCAP脚没接上、硬件接地干扰、Flash等待周期不符合芯片规定等等。文章所介绍的方法只是针对软件部分的排查参考。



使用特权

评论回复
沙发
山不转水转|  楼主 | 2022-6-22 10:53 | 只看该作者
怎么这么一大串文字

使用特权

评论回复
板凳
teltium| | 2022-7-14 21:30 | 只看该作者
精华贴,干货满满,好贴

使用特权

评论回复
地板
duo点| | 2022-7-15 15:05 | 只看该作者
好贴,干货满满,赞一个

使用特权

评论回复
5
Fanexs168| | 2022-7-18 22:08 | 只看该作者
顶一下 干货

使用特权

评论回复
6
MessageRing| | 2022-10-4 20:51 | 只看该作者
干货顶起

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

4

帖子

1

粉丝