#有奖活动# #申请原创#
前言:这里有一个案例,说明TIMER关闭代码顺序是有讲究的。关闭TIMER时钟,关闭TIMER功能,关TIMER中断,代码顺序不合理,会引发可靠性问题。下面是具体案例。 芯片:APM32E103VET6 应用场景:客户程序结构为自己的Bootloader+APP。芯片启动上运行Bootloader程序,如果没有升级任务就会跳转到APP。跳转前Bootloader会关闭各个外设。 问题描述: 1.上电后Bootload无法顺利跳转APP,导致超时看门狗复位。 2.快上电强相关,失效情况1/100,但失效芯片通过改动任何代码失效情况消失(优化等级1) 3.其他板子失效概率很低,200次有可能出现一次复位; 4.将当前失效率高板子上的芯片换到其它板上,失效概率很低,200次有可能出现一次复位; 5.将其它OK板上的芯片或其它芯片换到当前失效率高的板子上,失效率高,10次会出现2次; 6.优化等级降底(客户测试反馈),keil版本更换(亲自测试),都能改善; 总的来说,看上去是个可靠性问题。 失效样机的复现工作: ●测试方法:快上电12V,观察屏幕是否点亮(APP运行会点亮屏幕),并用示波器观察NRST以判断看门狗复位情况。 ●测试结果:可以复现异常现象,此时屏幕无法点亮,消耗电流很低,说明APP没有正常运行。从示波器绿线波形可以看到,NRST由于看门狗触发多次拉低复位,但多次看门狗重启后,有机率恢复正常运行,不再重启。 分析实验1:确认芯片状态 ●测试方法:调整看门狗延时到最大,复现异常时将JLINK连上,检查芯片状态。 ●测试结果:检查确认PC指针位于0X0800472C位置,核对客户代码,此时处于TIM2中断函数中,XPSR=2C也说明这一点。观察此时的堆栈,LR位置0x080040EB,核对客户代码,确认此位置为Timer Deinit 程序中,正在进行关闭TIM2时钟动作,然后触发进入中断。 分析实验2:中断状态确认 ●测试方法:参考客户程序代码,调试确认中断中变量变化 ●测试结果:出现异常时,继续下指令持续运行,依旧会进入中断,并且计时参数有变化,在不断累加。检查此时堆栈,LR位置都在0x080040EB位置。从现象来看,出现异常时,程序一直处于持续进入中断的状态,持续触发,无法退出。尝试单步运行,可以正常退出中断,执行完APP跳转函数,恢复正常。 分析实验3:调整定时时间验证 ●测试方法:目前的客户程序使用TIM2设置1ms进入一次中断并累加。不改动代码结构,只调整定时器时间,观察现象。 ●测试结果:具体如下表,发现进入中断越频繁,越容易触发异常现象。 [size=9.0000pt]定时时间 | [size=9.0000pt]快上电能否触发异常现象 | | | | | | | | | 分析实验4:增加TIM2中断函数运行过程指示●测试方法:经验证确认,在0.5ms定时时间设置下,简单的增加_NOP等,依旧可以复现异常。故修改程序,增加IO输出指示:PA10指示进出中断,观察异常现象。 ●测试结果:从指示上看,芯片执行完中断函数中的代码,正常退出中断函数后几百纳秒后又进了这个tim中断函数,如此反复。 分析实验5:增加TimerDeinit 程序运行过程指示 ●测试方法:再上一个程序的基础上,增加IO输出指示:PA8指示Timer Deinit 程序运行过程,重复开关机,快上电观察异常现象。 ●测试结果:从指示上看,正常时芯片执行Deinit函数,并不会触发中断。异常时芯片执行到Deinit函数,会出现异常导致持续进出中断,验证了前面关于LR的判断,确认为执行Deinit函数时导致的中断异常。 分析实验6:调整TimerDeinit 程序执行步骤 ●测试方法:检查客户程序,修改TimerDeinit 程序内执行顺序:先关定时器,再关中断,最后关时钟。重复开关机,快上电观察异常现象。 ●测试结果:复测多次,异常现象消失,确认改动Deinit顺序可以解决问题。 总结: 通过上述实验,确认客户板子上电后Bootloader无法顺利跳转到APP的原因是:程序执行TimerDeinit程序时,触发中断导致程序一直处于持续循环进入TIM2中断处理过程中,无法正常运行APP跳转程序。根因为客户在TimerDeinit程序中关闭timer2外设时的代码顺序不合理导致。建议客户调整Timer2关闭的代码顺序:先关定时器,再关中断,最后关时钟。实测改代码后不再出现问题。
|
针对问题现象仔细推敲,查找问题原因,寻找解决方法,解决因非正常的代码顺序导致的问题。整理出正确的定时器关闭顺序。