[应用相关]

STM32 定时器有时一开启就进中断

[复制链接]
865|15
手机看帖
扫描二维码
随时随地手机跟帖
wanglaojii|  楼主 | 2016-8-25 22:35 | 显示全部楼层 |阅读模式
在用到STM32定时器的更新中断时,发现有些情形下只要开启定时器就立即进入一次中断。准确说,只要使能更新中断允许位就立即响应一次更新中断【当然前提是相关NVIC也已经配置好】。换言之,只要使能了相关定时器更新中断,不管你定时间隔多长甚至不在乎你是否启动了相关定时器,它都会立即进入一次定时器更新中断服务程序。
STM32F051芯片为例,做了几种不同顺序的组合测试。根据测试发现,的确有些情况下一运行TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE); 【即使能更新中断】就立即进入更新中断服务程序。当然后面的中断都是正常的。
老实说,这个问题比较容易忽视,有些情况下也无关紧要,但有些情况可能会给应用带来困扰。从ST MCU相关技术手册似乎并不能明显地找到关于这个问题的很合适或者逻辑性很强的前因后果。
经过验证测试,如果注意一下相关指令代码顺序是可以回避这个问题的。
   
先做更新中断标志的清除操作,即清除TIMx->SR寄存器里的UIF标志,然后做定时器更新中断的使能操作。至于开启相关定时器的指令摆放位置并不严格。下面是相关动作的操作顺序及结果,可以参考、验证之。这里共罗列了6种写法,其中有3种情形是会立即进入中断的,另外3种不会。
   TIM_ClearITPendingBit(TIM1, TIM_IT_Update); //清除更新中断请求位
    TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE); //使能定时器1更新中断
TIM_Cmd(TIM1, ENABLE);                   //启动定时器
         (1。。。。。。不会立即进入更新中断程序。
    TIM_ClearITPendingBit(TIM1, TIM_IT_Update);//清除更新中断请求位
TIM_Cmd(TIM1, ENABLE);
    TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE);//使能定时器1更新中断
     (2。。。。。。不会立即进入更新中断程序。
TIM_Cmd(TIM1, ENABLE);
   TIM_ClearITPendingBit(TIM1, TIM_IT_Update);//清除更新中断请求位
  TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE);//使能定时器1更新中断
   (3。。。。。。不会立即进入更新中断程序。

    TIM_Cmd(TIM1, ENABLE);
    TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE);//使能定时器1更新中断
    TIM_ClearITPendingBit(TIM1, TIM_IT_Update);//清除更新中断请求位
       (4。。。。。。立即进入更新中断程序。

     TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE);//使能定时器1更新中断
   TIM_ClearITPendingBit(TIM1, TIM_IT_Update);//清除更新中断请求位
TIM_Cmd(TIM1, ENABLE);  
  (5。。。。。。立即进入更新中断程序。
     TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE);//使能定时器1更新中断
     TIM_Cmd(TIM1, ENABLE);
     TIM_ClearITPendingBit(TIM1, TIM_IT_Update);//清除更新中断请求位
  (6。。。。。。立即进入更新中断程序。
顺便提下关于定时器里UG位和URS位的使用,分别在TIMx->EGRTIMx->CR1寄存器里。对UG位置1可以产生更新事件并对相关计数器和寄存器重新初始化,如果URS位为0的话,同时会产生更新中断。如果不希望对UG位置1的同时产生更新中断,得置URS位为1,否则会立即进入更新中断。



laozhongyi| | 2016-8-25 22:42 | 显示全部楼层
这个问题也有遇到过,不知怎么解决。

使用特权

评论回复
Edisons| | 2016-8-25 22:43 | 显示全部楼层
先做更新中断标志的清除操作,即清除TIMx->SR寄存器里的UIF标志,然后做定时器更新中断的使能操作。这样能有什么用呢???

使用特权

评论回复
zhuotuzi| | 2016-8-25 22:50 | 显示全部楼层
定时太短了,开启前应该先清理中断标志位,清理干净,配置好后,最后一步再开启。

使用特权

评论回复
wanglaojii|  楼主 | 2016-8-25 22:55 | 显示全部楼层
laozhongyi 发表于 2016-8-25 22:42
这个问题也有遇到过,不知怎么解决。

可以看看上面的总结哦

使用特权

评论回复
wanglaojii|  楼主 | 2016-8-25 22:55 | 显示全部楼层
Edisons 发表于 2016-8-25 22:43
先做更新中断标志的清除操作,即清除TIMx->SR寄存器里的UIF标志,然后做定时器更新中断的使能操作。这样能 ...

清除TIMx->SR寄存器里的UIF标志 能够消除不必要的干扰呀

使用特权

评论回复
wanglaojii|  楼主 | 2016-8-25 22:56 | 显示全部楼层
zhuotuzi 发表于 2016-8-25 22:50
定时太短了,开启前应该先清理中断标志位,清理干净,配置好后,最后一步再开启。 ...

是的,开启前中断标志位最好清理干净。

使用特权

评论回复
Listate| | 2016-8-25 23:01 | 显示全部楼层
看看,这些都是经常容易混淆的东西。

使用特权

评论回复
zhuotuzi| | 2016-8-25 23:31 | 显示全部楼层
玩中断第一件事就是在关闭中断的情况下,先清理中断标志,不管你的系统有没有需要清理,都要这么做,然后是配置,配置完成后,都搞定了,启动中断。

使用特权

评论回复
icecut| | 2016-8-26 15:05 | 显示全部楼层
同意楼上

使用特权

评论回复
anvy178| | 2016-8-26 16:10 | 显示全部楼层
设置 手动写UG位  不进入中断,只能溢出才产生中断   这样就好了 。

使用特权

评论回复
merry_zsp| | 2016-8-27 22:39 | 显示全部楼层
玩中断第一件事就是在关闭中断的情况下,先清理中断标志,不管你的系统有没有需要清理,都要这么做,然后是配置,配置完成后,都搞定了,启动中断。
终于理解有些程序中的做法了,还以为他们是多余的呢。

使用特权

评论回复
309030106| | 2016-8-28 16:37 | 显示全部楼层
在中断打开前,先清理中断标志

使用特权

评论回复
戈卫东| | 2016-8-28 17:10 | 显示全部楼层
先来个RESET,RCC->AHB1RSTR=。。。。。

使用特权

评论回复
Garen2| | 2016-8-28 17:32 | 显示全部楼层
开启前中断标志位最好清理干净

使用特权

评论回复
wanglaojii|  楼主 | 2016-8-30 22:27 | 显示全部楼层
Garen2 发表于 2016-8-28 17:32
开启前中断标志位最好清理干净

嗯  是的  这个知道了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

220

主题

1411

帖子

1

粉丝