打印
[STM32F0]

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

[复制链接]
5656|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
如果用库函数就没问题,你可以参照下库源码.

使用特权

评论回复
5
diweo| | 2014-11-26 13:44 | 只看该作者
当然是先清中断后干活了。

使用特权

评论回复
6
小班儿| | 2014-11-26 14:33 | 只看该作者
TIM6->SR &= ~(1<<0);                          // clear UIF flag

清中断标志应该放到if判断外。

使用特权

评论回复
7
拿起书本| | 2014-11-26 14:50 | 只看该作者
中断进了要先清中断标志这是常识,也很重要啊!

使用特权

评论回复
8
huangfeng33| | 2014-11-26 14:51 | 只看该作者
这个很重要呀,看来还是先清除标志位比较好,需要注意的是ST的MCU有些中断标志清除不是直接对标志位置零,而是对某些寄存器读操作,硬件自动清零.

使用特权

评论回复
9
小浣熊| | 2014-11-26 23:32 | 只看该作者
讨论很激烈啊,进来学习了。。。

使用特权

评论回复
10
zh113214| | 2014-11-30 17:27 | 只看该作者
这个问题我还忽视了,不过貌似也没遇到过类似的问题啊

使用特权

评论回复
11
viplinjian| | 2023-10-23 08:24 | 只看该作者
怎么能先删除标志能  有的中断是公用的 必须先判断

使用特权

评论回复
12
BullTalented| | 2023-10-23 10:26 | 只看该作者
中断进了要先清中断标志

使用特权

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

本版积分规则

460

主题

2188

帖子

12

粉丝