基于TIMER3发生捕获中断丢失问题分析与总结

前言
在一洗衣机mc项目中,客户选择使用stm32f030作为主控芯片。使用timer3(ch3)来捕获电机的hall sensor的中断,同时使用timer3(ch2)的oc功能,在oc match中断中调整转速。客户在调试中发现,当捕获中断和oc中断“同时发生(对齐)”时,会发生捕获中断丢失。
问题分析
客户最初发现使用该配置控制电机时,在某一时刻会出现电机转速异常。经过抓取波形发现,hall sensor和捕获输出波形(在中断中翻转io)不匹配,在某个时刻,会出现“中断丢失”现象,表现为捕获输出高电平或低电平周期被拉长,如图1所示。黄色为hall信号,绿色为捕获中断输出,紫色为oc中断输出,可以明显看到在第四个上升沿之后,高电平长度被拉长半个周期。客户怀疑是硬件bug导致中断“同时发生”时,捕获“中断丢失”,从而导致该问题。
图 一
查看erratasheet, 没有相关的描述。另外,硬件bug导致中断丢失的可能性较小,因为中断同时发生的概率很低而该现象很容易复现。
构建测试环境
通过cubemx构建对应的测试工程,分别在捕获和oc中断中翻转io来检测中断状况。另外,通过其它开发板产生相应的pwm来模拟hall信号。经过测试发现,使用cube库生成的代码,并没有“丢失中断”的现象,波形见下图。
代码分析
客户的代码,包括中断服务函数都是通过直接操作寄存器的方式编写。分析客户的代码发现,客户在中断服务函数中清除相关中断标志位时是通过常用的寄存器操作方式“读-修改-写”来完成,如下:
tim3->sr&= ~tim_sr_cc3if; /* clear the flags */
而在hal driver中是通过对应的位直接赋值的方式清除,如下:
#define__hal_tim_clear_it(__handle__, __interrupt__) ((__handle__)->instance->sr= ~(__interrupt__))
结合客户观察到的现象,怀疑可能的原因是捕获中断标志在从读状态寄存器到写入寄存器之间被置位,这样的话,该标志就可能未被检测处理到就被清除掉了,从而导致异常的发生。
将hal driver函数中的中断服务函数修改成与客户一样的“读-修改-写”方式来清除对应标志位,该问题被复现。
小结
如果通过直接操作寄存器的方式来集成底层驱动,那么在通过“读-修改-写”方式操作此类会由硬件修改的寄存器时,一定要加倍小心。根据寄存器具体的描述,可以采用直接写入或者联合体(按位修改)的方式修改。

腾讯云与意法半导体宣布合作,携手推进LoRa开发者生态
2021年有方科技在物联网通信领域实现突破
加密协议将从根本上去构建去中心化商业和社会基础
华为摊上事 被美国法院勒令赔偿7170万元:侵犯别人4G专利
基于几何相位校正的柔性超声收发器阵列的实现
基于TIMER3发生捕获中断丢失问题分析与总结
在智能家居音箱领域上的音频功放芯片IC
指纹调湿机制有利于开发更好的机器人等设备
大众出行携手AutoX,将在全国范围打造自动驾驶示范应用的规模化车队
iphone8什么时候上市?iphone8最新消息:iphone8五大亮点汇总,看了它的这么多新功能你还不心动?
是德科技推出PathWave Design 2024 EDA软件工具
无人机行业的四大发展趋势详解
什么是区块链中的杀手级应用
优化责任国(SOC)精确度和电池管理系统(BMS)设计
1Hz至1MHz的信号发生电路,1Hz~1MHz Signal generating circuit
变频串联谐振交流耐压装置的原理和操作步骤
MIPS最近以一家独立公司之姿重新回到了硅谷 并放眼下一代AI领域
高亮度圆形和椭圆LED灯介绍
顶尖玩家集结:宁德时代与长安、华为联手造车
AI技术与少儿编程教育的出口正在逐渐拓宽