一、问题现象
整机设备在长期运行一段时间后,莫名其妙地突然没有运行现象了,表现为 LED 不闪烁了,按键也没有反应。
二、问题分析
1、可能是程序跑飞导致死机了;
2、可能是受到干扰后芯片异常了;
3、还可能是芯片 flash 数据被异常改写了。
三、问题定位
1、先使用 j-flash 将mcu flash 整片数据区的代码数据反读回来保存好,与原始烧录的程序bin文件做对比,发现一模一样,flash 数据正常。
2、reset引脚复位mcu后,程序如果依旧不能正常跑,需要断电重新上电才能恢复正常,那么大概率是芯片进入了某种“假死状态”(类似 latch up 了),那么需要将环境干扰源、干扰路径找到并消除,大概率需要做好板级防护措施以及layout 重新优化设计,做好 GND 等平面设计以及保证其完整性。
3、如果复位后正常,大概率是程序跑飞了或者跑到某个卡死地方去了,这种情况下需要调试工具 attach 到 mcu 内核,找到死机现场在何处以及究竟发生了什么,以下是大体步骤,使用 jlink 和 keil 环境。
-- 新建一个 not_reset_debug_init.ini 文件,内容为 LOAD %L INCREMENTAL ;
-- 在keil的配置页面,去掉启动时加载应用程序选项的勾号,并加入 not_reset_debug_init.ini文件,主要用于加载已经编译生成的.axf文件到Keil中,从而进行不会复位芯片调试mcu了,如下:
根据以上操作,实际抓取到本芯片死机后的 PC = 0x00000578 ,查看 .map 发现该位置位 hardfault ,原来是进入了硬件错误中断了。那么能否知道是哪一步触发了硬件错误中断呢?可以参考以下步骤:
|