APM32E103VET6的TIMER关闭代码顺序要求
#有奖活动# #申请原创#前言:这里有一个案例,说明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进入一次中断并累加。不改动代码结构,只调整定时器时间,观察现象。●测试结果:具体如下表,发现进入中断越频繁,越容易触发异常现象。
定时时间快上电能否触发异常现象
0.5ms容易触发
1ms可以触发
10ms可以触发
100ms测试多次,无法触发
分析实验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关闭的代码顺序:先关定时器,再关中断,最后关时钟。实测改代码后不再出现问题。
调整Timer2关闭的代码顺序:先关定时器,再关中断,最后关时钟。实测改代码后不再出现问题。
学习了,这完全是实践经验啊 我们在做Bootloader的时候也遇到了类似的情况。
我们在关中断后,还要再清除一下涉及的中断状态。
这样就可以保证在进入APP时,再初始化此中断的时候不会直接触发,导致多一次的情况了。 "程序一直处于持续循环进入TIM2中断处理过程中"
为什么在中断处理函数里面没有清除中断的程序啊 其实,不仅仅是Timer关闭中断需要这个流程,其它的中断也有类似的要求。
还需要参与ARM的技术手册,规避设计的缺陷。
我们遇到的是GPIO中断会多触发一次
霜之闪耀 发表于 2025-3-26 23:38
"程序一直处于持续循环进入TIM2中断处理过程中"
为什么在中断处理函数里面没有清除中断的程序啊 ...
在中断处理函数里面有清除中断的程序,但操作无效,因为TIMER的时钟被关了。电路没有时钟就动不了 onemoren 发表于 2025-4-1 16:51
在中断处理函数里面有清除中断的程序,但操作无效,因为TIMER的时钟被关了。电路没有时钟就动不了 ...
还能这样啊!
又帮我避了个坑。
页:
[1]