OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 12770|回复: 19

请教大家为什么启动定时器时会进定时器中断

[复制链接]

3

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2012-3-13
在线时间
3 小时
发表于 2012-3-13 14:03:23 | 显示全部楼层 |阅读模式
用的定时器2,初始化代码如下:
//定时器中断处理函数
void TIM2_IRQHandler(void)
{                  
     if(TIM2->SR&0X0001)   //溢出中断
     {
          printf("timer2 timeout!\r\n");
          TIM2->CR1&=0xFE;    //禁止定时器2                            
      }      
     TIM2->SR &= ~(1<<0);  //清除中断标志位     
}
//定时器初始化
void Timer2Init()
{
      RCC->APB1ENR|=1<<0;  //TIM2时钟使能    
      TIM2->ARR = 50000;   //设定计数器自动重装值//刚好5s    
      TIM2->SC = 7199;    //预分频器7200,得到10Khz的计数时钟
       TIM2->CR1 |= 1<<2; 
       //这两个东东要同时设置才可以使用中断
       TIM2->DIER |= 1<<0;    //允许更新中断    
        //TIM2->DIER |= 1<<6;    //允许触发中断 
        TIM2->SR &= ~(1<<0); //清除中断标志位   
         MY_NVIC_Init(2,2,TIM2_IRQChannel,2);//抢占1,子优先级3,组2         
}
//开启定时器
void Timer2Start()
{
    TIM2->SR &= ~(1<<0); //清除中断标志位
    TIM2->CR1|=0x01;    //使能定时器2 
}

现在的问题是在主函数中初始化定时器2后,调用Timer2Start()函数开启定时器,第一次开启会很快进入中断,以后开启5s后进中断,请教各位大侠,是怎么回事?
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-3-13 15:56:01 | 显示全部楼层
回复【楼主位】rainy0415:
---------------------------------
你软件仿真就知道了,第一次进入中断服务函数的时候,TIMx->SR=0x001F。
通过查询寄存器定义,可以知道,这标志着发生了更新以及比较匹配的条件。从而导致这5个位均为1.
而中断设置的时候,我们开启了允许更新中断,所以会跳到中断函数,只要你吧允许更新中断屏蔽,则无此问题了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

3

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2012-3-13
在线时间
3 小时
 楼主| 发表于 2012-3-14 13:35:32 | 显示全部楼层
测试情况如下:
1.允许更新中断
  允许触发中断

定时器初始化后,第一次启动定时器5s定时,立刻进入中断,以后再启动,5s后进入中断;

2.允许更新中断
  禁止触发中断

定时器初始化后,第一次启动定时器5s定时,立刻进入中断,以后再启动,5s后进入中断;同情况1;

3.禁止更新中断
  允许触发中断
定时器初始化后,启动定时器5s定时,无法进入中断;

更新中断包括计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发),是因为开启定时器的时候初始化了计数器,才导致的中断么?那为什么以后再开启就不会产生中断了呢?请大家多多指教啊:)



回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-3-14 15:02:36 | 显示全部楼层
回复【3楼】rainy0415:
---------------------------------
是,因为以后你没有更新了.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

20

主题

562

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
670
金钱
670
注册时间
2012-2-28
在线时间
0 小时
发表于 2012-3-14 20:29:10 | 显示全部楼层
楼主的意思是,下完程序第一次的时候会进入中断,而如果是关掉电源再开启就不会进入中断吗???


开机应该就是和程序第一次运行一样啊,应该不会出现那种情况啊,原理上说不过去啊???
努力,前进。
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
21
金钱
21
注册时间
2013-11-1
在线时间
0 小时
发表于 2013-11-15 16:46:16 | 显示全部楼层
回复【2楼】正点原子:
-----------------------------回复【5楼】5498折戟沉沙:
---------------------------------
在设置之前清空中断标志就可以了
TIM2->SR &= ~(1<<0);  //清除中断标志位
TIM2->DIER |= 1<<0;    //允许更新中断
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-11-15 21:03:28 | 显示全部楼层
回复【6楼】路人甲azj:
---------------------------------
谢谢指出,我试试。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

14

主题

80

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
339
金钱
339
注册时间
2013-1-1
在线时间
6 小时
发表于 2013-11-19 11:53:01 | 显示全部楼层
我上次也遇到,我加了句TIM2->EGR |= 1<<0;就没事了...不知道对你有没有用...你试一试...我上次提问的贴http://www.openedv.com/posts/list/0/23823.htm?privmsg=1#137458
回复 支持 反对

使用道具 举报

50

主题

124

帖子

0

精华

高级会员

Rank: 4

积分
528
金钱
528
注册时间
2013-6-27
在线时间
79 小时
发表于 2013-11-19 13:48:02 | 显示全部楼层
回复【7楼】正点原子:
------------------------------回复【7楼】正点原子:
---------------------------------
原子哥,你试了吗?我试了下,好像不行呢
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-11-19 14:16:34 | 显示全部楼层
回复【9楼】szn1423:
---------------------------------
没试过啊。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

4

主题

200

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
236
金钱
236
注册时间
2012-12-19
在线时间
0 小时
发表于 2014-3-28 20:25:50 | 显示全部楼层
回复【7楼】正点原子:
---------------------------------
原子大哥,我想用定时器实现超时检测的功能,想法是这样的。设置超时时间,开始检测时使能定时器,然后根据更新中断中设置的变量来判断是否超时。现在问题是,但是,只有第一次能成功检测.然后我DISABLE(TIM3) 再ENABLE[TIM3],就不是从0开始计时了,而是在上一次基础上。
不想重新配置定时器,因为语句还不少,担心浪费时间,怎么让他只要一个语句又能让它从0开始计数?
目前在玩STM32,BBB,RPi
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-3-29 00:10:39 | 显示全部楼层
回复【11楼】w0rmis20:
---------------------------------
你加一句定时器计数寄存器清零的语句。
比如:TIM3->CNT=0
就可以了
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

4

主题

200

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
236
金钱
236
注册时间
2012-12-19
在线时间
0 小时
发表于 2014-3-29 21:07:55 | 显示全部楼层
回复【12楼】正点原子:
---------------------------------
谢了,果然好久不看书都忘了STM32定时器里也有CNT这个寄存器
目前在玩STM32,BBB,RPi
回复 支持 反对

使用道具 举报

1

主题

9

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2014-12-22
在线时间
0 小时
发表于 2015-3-18 19:06:24 | 显示全部楼层
回复【10楼】正点原子:
---------------------------------
原子哥,
   你好,我最近也遇到了楼上提出的定时器初始化后立即进入中断的问题,即第一次中断触发的时间不正确的问题。请问怎样设置才能使定时器按照设定的时间触发中断呢?谢谢!
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-3-18 22:37:07 | 显示全部楼层
回复【14楼】gtf:
---------------------------------
参考7楼的.
我是没有办法.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

9

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2014-12-22
在线时间
0 小时
发表于 2015-4-8 21:32:10 | 显示全部楼层
回复【8楼】疯狂者:
---------------------------------
你好,请问你说的TIM2->EGR |= 1<<0;具体加在什么位置呢?
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
22
金钱
22
注册时间
2015-6-27
在线时间
0 小时
发表于 2015-6-27 13:46:41 | 显示全部楼层
TIM_ClearITPendingBit(TIM3,TIM_IT_Update);//先清除中断标记
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);//再打开中断使能就OK了

回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
22
金钱
22
注册时间
2015-6-27
在线时间
0 小时
发表于 2015-6-27 13:47:43 | 显示全部楼层
回复【17楼】我的学习板很新:
---------------------------------
注意一下先后顺序
回复 支持 反对

使用道具 举报

10

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
109
金钱
109
注册时间
2011-7-28
在线时间
2 小时
发表于 2015-6-28 01:00:49 | 显示全部楼层
以前碰到了这个问题搞了好久一直解决不掉
就做了个迂回战术
主循环开始前先故意进一次中断
并确保这次循环不会有不良后果
然后再进主循环
看来得再去研究一下
回复 支持 反对

使用道具 举报

86

主题

983

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1848
金钱
1848
注册时间
2013-4-15
在线时间
163 小时
发表于 2015-11-19 09:53:03 | 显示全部楼层
5楼和16楼是正确的解决办法,可能默认的中断标志位是置1的状态,需要先清除中断标志位,再开中断
合肥-文盲
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-21 10:28

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表