本帖最后由 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¶Ï
");
frequ_init(DISABLE);
TIM_Cmd(TIM3,DISABLE);
if(frequency!=0)
{
CAN_SEND_INT(frequency);
printf("%d
",frequency);
frequency=0;
}
//1رÕÖD¶Ï¡£
}
TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
}[/mw_shl_code]
代码如上所示。先是初始化函数,然后给一个定时时间参数,最后是中断服务函数。为什么初始化完成以后立即就进入中断服务函数了,已经清除了中断标志位。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
解决方法:
总结:应该是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(),定时器立刻进入中断函数一次;有帮助。
一周热门 更多>