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

发布者:快乐的成长最新更新时间:2024-06-27 来源: elecfans关键字:TIMER3  捕获中断 手机看文章 扫描二维码
随时随地手机看文章

前言

在一洗衣机MC项目中,客户选择使用STM32F030作为主控芯片。使用TIMER3(CH3)来捕获电机的HALL Sensor的中断,同时使用TIMER3(CH2)的OC功能,在OC match中断中调整转速。客户在调试中发现,当捕获中断和OC中断“同时发生(对齐)”时,会发生捕获中断丢失。


问题分析

客户最初发现使用该配置控制电机时,在某一时刻会出现电机转速异常。经过抓取波形发现,HALL Sensor和捕获输出波形(在中断中翻转IO)不匹配,在某个时刻,会出现“中断丢失”现象,表现为捕获输出高电平或低电平周期被拉长,如图1所示。黄色为HALL信号,绿色为捕获中断输出,紫色为OC中断输出,可以明显看到在第四个上升沿之后,高电平长度被拉长半个周期。客户怀疑是硬件Bug导致中断“同时发生”时,捕获“中断丢失”,从而导致该问题。

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

图 一

查看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__))

结合客户观察到的现象,怀疑可能的原因是捕获中断标志在从读状态寄存器到写入寄存器之间被置位,这样的话,该标志就可能未被检测处理到就被清除掉了,从而导致异常的发生。

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

将HAL Driver函数中的中断服务函数修改成与客户一样的“读-修改-写”方式来清除对应标志位,该问题被复现。


小结

如果通过直接操作寄存器的方式来集成底层驱动,那么在通过“读-修改-写”方式操作此类会由硬件修改的寄存器时,一定要加倍小心。根据寄存器具体的描述,可以采用直接写入或者联合体(按位修改)的方式修改。


关键字:TIMER3  捕获中断 引用地址:基于TIMER3发生捕获中断丢失问题分析与总结

上一篇:一个关于LPUART输出异常问题分享
下一篇:气压传感器MS5611使用SPI接口的程序

小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved