[STM32F0] stm32中断会进入2次的解决办法

[复制链接]
7144|11
 楼主| jxmzzr 发表于 2014-11-26 10:39 | 显示全部楼层 |阅读模式
、问题提出:如果你操作不当STM32的中断每次会进2次。
2、验证方法:如下面的1ms中断程序:
void TIM6_IRQHandler(void)                  //1ms
{
  ms_100_cntdbu++;
  if ((TIM6->SR & 0x0001) != 0)    // check interrupt source
  {                 
                ms_100_cnt++;
                   TIM6->SR &= ~(1<<0);                          // clear UIF flag        
   }
               
}
     你会看到  ms_100_cntdbu =2*  ms_100_cn
如果增加硬件管脚指示,从示波器上很容易看到1ms内中断近了2次,但1ms中断技术没问题,也就是说SR标志清掉了,SR中也没有其他标志置位,进中断是保存下来看。
     其他所有的中断都是这个问题。我验证了,不是仿真,是真运行。
3、解决方法:清中断标志,只要不是中断函数的最后一条语句就没问题了。
4、指令流水线问题。其他的片子有的也会有这问题。
5、结论:如果你对程序要求不严,可以不用管它,不会影响到你应用的。否则参照3.
如果你的习惯是先清中断后干活,你不会碰到这个问题。如果你使用的是库函数差标志,也不会碰到这个问题
mmuuss586 发表于 2014-11-26 12:28 | 显示全部楼层

谢谢楼主分享;
lei129210 发表于 2014-11-26 12:28 | 显示全部楼层
进中断清标志位是必须的。这有什么好纠结的?
huzi2099 发表于 2014-11-26 13:06 | 显示全部楼层
这个我研究过,问题出在
  if ((TIM6->SR & 0x0001) != 0)    // check interrupt source
如果用库函数就没问题,你可以参照下库源码.
diweo 发表于 2014-11-26 13:44 | 显示全部楼层
当然是先清中断后干活了。
小班儿 发表于 2014-11-26 14:33 | 显示全部楼层
TIM6->SR &= ~(1<<0);                          // clear UIF flag

清中断标志应该放到if判断外。
拿起书本 发表于 2014-11-26 14:50 | 显示全部楼层
中断进了要先清中断标志这是常识,也很重要啊!
huangfeng33 发表于 2014-11-26 14:51 | 显示全部楼层
这个很重要呀,看来还是先清除标志位比较好,需要注意的是ST的MCU有些中断标志清除不是直接对标志位置零,而是对某些寄存器读操作,硬件自动清零.
小浣熊 发表于 2014-11-26 23:32 | 显示全部楼层
讨论很激烈啊,进来学习了。。。
zh113214 发表于 2014-11-30 17:27 | 显示全部楼层
这个问题我还忽视了,不过貌似也没遇到过类似的问题啊
viplinjian 发表于 2023-10-23 08:24 | 显示全部楼层
怎么能先删除标志能  有的中断是公用的 必须先判断
BullTalented 发表于 2023-10-23 10:26 | 显示全部楼层
中断进了要先清中断标志
您需要登录后才可以回帖 登录 | 注册

本版积分规则

460

主题

2188

帖子

12

粉丝
快速回复 在线客服 返回列表 返回顶部