使用APM32一种排查软件端问题的调试方法

描述

问题背景

实际调试、或者产品开发阶段,有时候会碰到产品触发异常、报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等待周期不符合芯片规定等等。文章所介绍的方法只是针对软件部分的排查参考。

审核编辑 :李倩

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分