打印
[STM32F1]

排查Hard fault错误

[复制链接]
587|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
secretuniverse|  楼主 | 2016-5-25 14:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一、 Hard fault 产生原因硬件方面常见原因
       硬件原因:
                     1、电源设计有错误,造成器件供电不稳;
                     2、电源质量不好,文波,噪声过大;
                     3、器件接地不良;
                     4、对于带有 Vcap 引脚的器件,管脚处理不当;
                     5、电路中有强干扰源,对器件造成干扰;
       软件原因:
                     1、使用了空指针;
                     2、对地址偏移量的计算有误
                     3、数组越界导致程序出错;
                     4、动态内存使用不当,导致访问了已释放的内存地址;
                     5、通过地址访问了已失效的局部变量;
                        一般因为硬件造成 Hard Fault 错误的可能性较低, 90%都是软件原因造成的,
                        所以遇到硬件中断错误,基本就是通过软件来排查到硬件中断错误,基本就是通过软件来排查

二、 排查问题使用到的工具
       Jlink, Segger( Jlink 上位机), Keil

三、 排查步骤
                  1、 使用 keil 生成 map 文件,生成 lst 文件。
                    Map 文件是 keil 自动生成的,里面能标明每个函数、 每个变量的位置。他被放在工程路径下。
                    lst 文件反映的是每一个函数,每一条指令的 PC 指针,在 keil 中需要调用 USER 命令生成
                  2、保存出问题时候的 RAM
                    出问题的时候调用别断电,接上 Jlink,调用 Segger 里面的 Jlink commander 来获取现场
                    (1)先输入一个“ USB”让 Jlink 接上设备,然后输入 halt 来停住内核;
                    (2)调用 savebin ram.bin 0x20000000 0x2000 将 RAM 中的内容全部保存下来,保存下来的东西被存在放 Segger 的安装目录中。
                  3、分析问题
                      查看 map 文件找到栈的位置
                      打开保存的 bin 文件,找到进入硬件中断前调用了哪些函数,在使用哪个变量,然后逐一分析。
                     从栈的底部往上看,哪个地方的值是函数指针,然后对应 lst 文件去逐一查看,分析,就能大致知道是在执行哪个函数,
                     哪一条指令,或者是调用某个参数导致的硬件中断错误的。通过 map 文件可以知道每个变量的位置,可以直接去查看
                     我们保存下来的 ram 中变量的当前情况来分析程序逻辑。

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

本版积分规则

12

主题

55

帖子

1

粉丝