STM32单片机

文章数:1121 被阅读:2938180

账号入驻

TIMER3 “中断丢失 ”现象分析

最新更新时间:2018-01-15
    阅读数:

前言

在一洗衣机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函数中的中断服务函数修改成与客户一样的-修改-方式来清除对应标志位,该问题被复现。


小结

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


===============================

往期话题链接:

1、ST新出多合一烧写编程软件STM32CubeProgrammer

2、时钟调高时出现异常的案例分享

3、基于不同STM32库函数的代码性能对比

4、STM32应用过程中与电源相关的案例分享

5、获取ST MCU技术资料及相关支持的方式与途径




最新有关STM32单片机的文章

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: TI培训

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

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