[APM32F407] HardFault排查——软件方案

[复制链接]
10|1
手机看帖
扫描二维码
随时随地手机跟帖
山不转水转|  楼主 | 2022-6-22 10:52 | 显示全部楼层 |阅读模式
本帖最后由 山不转水转 于 2022-6-22 14:26 编辑

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

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


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

    1.png

    2.png

    3.png

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

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

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



使用特权

评论回复
山不转水转|  楼主 | 2022-6-22 10:53 | 显示全部楼层
怎么这么一大串文字

使用特权

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

本版积分规则