发新帖本帖赏金 50.00元(功能说明)我要提问
返回列表
打印
[APM32E1]

APM32E103VET6的TIMER关闭代码顺序要求

[复制链接]
841|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
#有奖活动# #申请原创#
前言:这里有一个案例,说明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]快上电能否触发异常现象
[size=9.0000pt]0.5ms
[size=9.0000pt]容易触发
[size=9.0000pt]1ms
[size=9.0000pt]可以触发
[size=9.0000pt]10ms
[size=9.0000pt]可以触发
[size=9.0000pt]100ms
[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关闭的代码顺序:先关定时器,再关中断,最后关时钟。实测改代码后不再出现问题。

使用特权

评论回复

打赏榜单

21小跑堂 打赏了 50.00 元 2025-03-27
理由:恭喜通过原创审核!期待您更多的原创作品~~

评论
21小跑堂 2025-3-27 16:52 回复TA
针对问题现象仔细推敲,查找问题原因,寻找解决方法,解决因非正常的代码顺序导致的问题。整理出正确的定时器关闭顺序。 
沙发
阳光爆裂| | 2025-3-25 22:53 | 只看该作者
调整Timer2关闭的代码顺序:先关定时器,再关中断,最后关时钟。实测改代码后不再出现问题。

学习了,这完全是实践经验啊

使用特权

评论回复
板凳
心跳回响| | 2025-3-26 15:34 | 只看该作者
我们在做Bootloader的时候也遇到了类似的情况。
我们在关中断后,还要再清除一下涉及的中断状态。
这样就可以保证在进入APP时,再初始化此中断的时候不会直接触发,导致多一次的情况了。

使用特权

评论回复
地板
霜之闪耀| | 2025-3-26 23:38 | 只看该作者
"程序一直处于持续循环进入TIM2中断处理过程中"
为什么在中断处理函数里面没有清除中断的程序啊

使用特权

评论回复
5
黎明热忱| | 2025-3-27 18:49 | 只看该作者
其实,不仅仅是Timer关闭中断需要这个流程,其它的中断也有类似的要求。
还需要参与ARM的技术手册,规避设计的缺陷。

使用特权

评论回复
6
jobszheng| | 2025-3-28 11:12 | 只看该作者
我们遇到的是GPIO中断会多触发一次

使用特权

评论回复
7
onemoren|  楼主 | 2025-4-1 16:51 | 只看该作者
霜之闪耀 发表于 2025-3-26 23:38
"程序一直处于持续循环进入TIM2中断处理过程中"
为什么在中断处理函数里面没有清除中断的程序啊 ...

在中断处理函数里面有清除中断的程序,但操作无效,因为TIMER的时钟被关了。电路没有时钟就动不了

使用特权

评论回复
发新帖 本帖赏金 50.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

29

主题

41

帖子

0

粉丝