OpenEdv-开源电子网

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

定时器中断问题求助。

[复制链接]

10

主题

26

帖子

0

精华

新手上路

积分
23
金钱
23
注册时间
2016-6-3
在线时间
13 小时
发表于 2017-11-6 15:02:35 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 1575485998 于 2017-11-6 15:04 编辑

要求是定时一个时间,到时间关闭。
现在的问题是,初始化玩定时器后,会立即进入中断服务函数,然后定时的时间到了以后第二次进入定时器中断函数。这是什么原因呢,
我只想让它从定时器初始化完成以后,定时完成进一次中断就够了。
求大神。
[mw_shl_code=c,true]void TIM3_Int_Init(u16 arr)
{
        
        //¶¨ê±Æ÷£¬ê±¼ä=£¨£¨arr+1£©*£¨psc+1£©£©/Tclk¡£=5000*8400/84Mhz=0.5s
        //¼ÆêyÆμÂê¡£84M/·ÖÆμÏμêy*5000.
        TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
        
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
        
        TIM_TimeBaseInitStructure.TIM_Period=arr;
        TIM_TimeBaseInitStructure.TIM_Prescaler=42000-1;
        TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;
        TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CKD_DIV1;
        
        TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);
        TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);
        
        NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;
        NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
        NVIC_Init(&NVIC_InitStructure);
        
        //TIM_Cmd(TIM2,ENABLE);
}
//ÖD¶Ï′ò¿a£¬¿aê¼¼Æêy¡£×îoó·μ»ØÆμÂêÖμ¡£
                                TIM3_Int_Init(time*10000/100*20-1);
                                TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
                                TIM_Cmd(TIM3,ENABLE);
void TIM3_IRQHandler(void)
{
        if(TIM_GetITStatus(TIM3,TIM_IT_Update)!=RESET)
        {
                printf("½øÖD¶Ï\r\n");
                frequ_init(DISABLE);
                TIM_Cmd(TIM3,DISABLE);
                if(frequency!=0)
                        {
                                CAN_SEND_INT(frequency);
                                printf("%d\r\n",frequency);
                                frequency=0;
                        }
                //1رÕÖD¶Ï¡£
        }
        TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
}[/mw_shl_code]

代码如上所示。先是初始化函数,然后给一个定时时间参数,最后是中断服务函数。为什么初始化完成以后立即就进入中断服务函数了,已经清除了中断标志位。

最佳答案

查看完整内容[请看2#楼]

找到原因了。 解决方法: 总结:应该是TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure);产生了更新事件,只要将 TIM_ClearFlag(TIM5, TIM_FLAG_Update); TIM_ITConfig(TIM5,TIM_IT_Update,ENABLE); 放在TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure);的后面,就不会出现一开允许中断函数TIM_ITConfig(),定时器立刻进入中断函数一次的情况。 IM_Cmd(TIM5, ENABLE); 放前放后无所谓,他只是让计数器开始计数,只是 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

10

主题

26

帖子

0

精华

新手上路

积分
23
金钱
23
注册时间
2016-6-3
在线时间
13 小时
 楼主| 发表于 2017-11-6 15:02:36 | 显示全部楼层
找到原因了。
解决方法:

总结:应该是TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure);产生了更新事件,只要将
TIM_ClearFlag(TIM5, TIM_FLAG_Update);
TIM_ITConfig(TIM5,TIM_IT_Update,ENABLE); 放在TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure);的后面,就不会出现一开允许中断函数TIM_ITConfig(),定时器立刻进入中断函数一次的情况。
IM_Cmd(TIM5, ENABLE); 放前放后无所谓,他只是让计数器开始计数,只是放后面的话可能需要将计数器清零。

希望对:解决一开允许中断函数TIM_ITConfig(),定时器立刻进入中断函数一次;有帮助。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-7 19:39

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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