0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

STM32单片机 来源:未知 作者:伍文辉 2018-01-15 15:11 次阅读

前言

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

小结

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

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 中断
    +关注

    关注

    5

    文章

    884

    浏览量

    41020
  • OC
    OC
    +关注

    关注

    0

    文章

    15

    浏览量

    12369
  • STM32F030
    +关注

    关注

    1

    文章

    33

    浏览量

    6462

原文标题:TIMER3 “中断丢失 ”现象分析

文章出处:【微信号:STM32_STM8_MCU,微信公众号:STM32单片机】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    TIMER3设置成外部捕获模式,T3_EXT引脚每秒输入10个脉冲,为什么得到的CNT寄存器和CAP寄存器的值这么大?

    TIMER3设置成外部捕获模式,T3_EXT引脚 每秒输入10个脉冲,但是得到的CNT寄存器和CAP寄存器的值怎么会这么大呢 TIMER3 CNT=8367060,CAP=51211
    发表于 01-17 07:40

    STM32入门篇之通用定时器彻底研究(新手教程,含11个例程,全面剖析TIMER,另外有个2.0库的

    的,希望能给你带来点帮助。例程列表:TIMER-1 : 定时器上溢。TIMER-2 : 强置输出模式。TIMER-3 : 输出比较模式。TIMER-4 : PWM1模式。
    发表于 11-27 09:07

    请问CC2540 timer3 timer4 的PWM怎么用?有没有例程参考?

    本帖最后由 一只耳朵怪 于 2018-6-6 17:11 编辑 你好timer.h内的API貌似不能用,请问 timer3 timer4 的PWM怎么用?有没有例程参考?
    发表于 06-06 00:10

    输入捕获模块中断发生会重置Time3值吗?

    ,如果Time3当前值为65000,输入捕获发生在这里,在65536发生溢出计数器吗?我的意思是说我还在检查溢出计数器来识别低频信号。它误导了我吗?我应该在第一个输入
    发表于 09-18 14:58

    stm32F207 APB1输出最大时钟给TIMER3问题

    ”。AHB:即HPRE[3:0],PLL作为系统时钟输出为120M)(2)现象:配置TIMER3,120分频,溢出中断次数为1000,中断产生周期是1ms(APB1,未分频)。(
    发表于 12-11 09:01

    使用TMRxH和TMRxL中相同内容的Timer1和Timer3的工作方式截然不同

    这个问题,THX! 以上来自于百度翻译 以下为原文 Hi, I was trying to use two timer(timer1 and timer3) to blink LED0
    发表于 03-01 07:25

    STM32F0 Timer3作为定时器输出

    设置Timer3 中断void TIM3_INT_Config(void){ NVIC_InitTypeDef NVIC_InitStructure; /* TIM3 clock en
    发表于 08-16 08:23

    NXP LPC1768 timer3定时器问题

    我配置timer3定时器,打印信息,结果只发现打印出了0,1打印不出来,感觉就是写了一下寄存器就不行了,有大佬指点下么
    发表于 08-28 18:19

    STM32F0 Timer3是怎样作为定时器输出的

    STM32F0 Timer3是怎样作为定时器输出的?STM32F0 Timer3是怎样作为中断输出的?
    发表于 11-16 06:03

    如何用timer3模拟霍尔信号TIH1、TIH2、TIH3出来?

    如何用timer3模拟霍尔信号TIH1、TIH2、TIH3出来?
    发表于 12-21 06:40

    MSP432定时器异常进捕获中断并没有发生捕获事件怎么解决

    MSP432定时器异常进捕获中断的问题问题描述:使用msp432定时器捕获外接信号的上升沿,设断点调试时发现总是会进中断服务函数,但是并没有发生
    发表于 02-15 07:02

    Timer3上设置定时器中断无法生成PWM信号咋办呢

    我正在使用 Bluepill 开发板。我想在 Timer2 上生成 PWM 信号,并在 Timer3 上以 20ms 的间隔设置一个定时器中断。我意识到,如果我在 Timer3 上设置
    发表于 12-22 07:28

    BSP\\TIMER_Capture范例中,Timer0和Timer3的输出频率和手册的不一致是为什么?

    各位大大安安,在官方BSP\\TIMER_Capture范例中,提到Timer0和Timer3的输出频率各位500Hz和1Hz,但是实际上则是1000Hz和2Hz,这其中是不是有什么误会???,谢谢
    发表于 06-27 15:05

    TIMER3设置成外部捕获模式,得到的CNT寄存器和CAP寄存器的值怎么会这么大呢?

    TIMER3设置成外部捕获模式,T3_EXT引脚 每秒输入10个脉冲,但是得到的CNT寄存器和CAP寄存器的值怎么会这么大呢 TIMER3 CNT=8367060,CAP=51211
    发表于 08-29 07:09

    MSP432定时器异常进捕获中断的问题

    MSP432定时器异常进捕获中断的问题问题描述:使用msp432定时器捕获外接信号的上升沿,设断点调试时发现总是会进中断服务函数,但是并没有发生
    发表于 12-16 16:53 8次下载
    MSP432定时器异常进<b class='flag-5'>捕获</b><b class='flag-5'>中断</b>的问题