你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

stm32l151定时器 寄存器 开启定时器就进入中断的疑惑

[复制链接]
shuihehe 提问时间:2018-8-3 15:38 /
1.先贴上 tim2 配置       
TIM2->EGR  &=~TIM_EGR_UG;//不产生事件            
IM2->CR1  |=TIM_CR1_URS;       
TIM2->CR1  &=~TIM_CR1_UDIS;       
TIM2->CR1  |=TIM_CR1_ARPE;                       
                        //TIM2->CR2  |=TIM_CR2_MMS_0;//ENABLE
                        //psc
TIM2->PSC   =32000-1;//1kHZ 1MS
TIM2->ARR   =2000-1;
TIM2->SR    &=~TIM_SR_UIF;
TIM2->CNT   =0;
TIM2->DIER  |=TIM_DIER_UIE;
TIM2->CR1   |=TIM_CR1_CEN;

在开启中断之前清除了中断标志位,但是使能之后马上就进入中断,而不是等待10s进入,之后都是10s 进入更新中断请教一下这是问题导致的
另外,我看到有些帖子针对stm32f103系列的,我做了相关测试,用库函数版本debug了一下,在打开中断之前如果没有加清除中断标志,定时器开启会立马进入中断函数中;如果在打开中断之前添加清除标志位,则会在设置的定时时间之后进入中断函数。

但是l151tim2的关键定时器就这么多,debug的时候也对比了寄存的值,但是还是不行,所以大家看看是什么问题导致的









收藏 1 评论7 发布时间:2018-8-3 15:38

举报

7个回答
废鱼 回答时间:2018-8-3 16:20:04
清除一下TIMx_SR寄存器。

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

shuihehe 回答时间:2018-8-3 16:49:22
安 发表于 2018-8-3 16:20
清除一下TIMx_SR寄存器。

TIM->SR &=~TIM_SR_UIF  已经清除了  好好看看我写的 不要走马观花
feixiang20 回答时间:2018-8-3 23:41:17
本帖最后由 feixiang20 于 2018-8-3 23:42 编辑

是不是开启了允许更新中断。给你个参考实例看看吧

在用到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->EGR和TIMx->CR1寄存器里。对UG位置1可以产生更新事件并对相关计数器和寄存器重新初始化,如果URS位为0的话,同时会产生更新中断。如果不希望对UG位置1的同时产生更新中断,得置URS位为1,否则会立即进入更新中断。



中断使能和中断标志IFG是没有关系的,开中断使能会使程序指针随着中断标志的置位而跳到那个中断向量所指的段里去;不开中断使能的时候你的主函数就不会被打断。


中断标志xxxIFG会随着某个事件发生而置位,是为了方便编程时候判断具体发生了什么事件用的,两者互相独立不冲突。


shuihehe 回答时间:2018-8-4 08:57:52
feixiang20 发表于 2018-8-3 23:41
是不是开启了允许更新中断。给你个参考实例看看吧

在用到STM32定时器的更新中断时,发现有些情形下只要开 ...

1. 我屏蔽掉 ug 位 ,置urs位 ,也是会立即产生中断
2.事件和中断 是两个概念,我觉得你没正明白
3.请看我的配置再说,你给的帖子我看了,在103上我测试过,加和不加清除标志位确实不一样,但是我看了库函数的实现,没什么不同的。
shuihehe 回答时间:2018-8-4 23:19:03
问题已经解决了

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2 可以分享下解决方法啊

查看全部评分

Timyang 回答时间:2019-4-16 14:59:55
请问楼主如何解决的?我现在也遇到了这个问题,希望能得到解决,感谢
shuihehe 回答时间:2019-4-17 10:15:52
274632473 发表于 2019-4-16 14:59
请问楼主如何解决的?我现在也遇到了这个问题,希望能得到解决,感谢

用寄存器变成,要注意寄存器位赋值的顺序

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版