原子哥delay函数和通用定时器冲突

2019-07-20 14:45发布

今天用通用定时器写了个定时,定时时间为500ms,在溢出中断里加了一个gpio翻转,讲道理应该是输出方波的。但是,我在main函数里还加了一个原子哥写的delay函数,delay_ms(5000)。
奇怪的事情来了。
如果通用定时器溢出中断中只有gpio翻转,可以偶尔输出正常方波,但是正常的周期数不会超过5个。剩下的时间要么全高要么全低。
如果通用定时器溢出中断里加上别的东西,比如定义一个变量,则完全冲突,方波周期完全变成由delay函数控制,也就是说delay的过程中,定时器中断是等待的。

经过测试,TIM3可以和delay一起用,但是TIM4和TIM5都不行。TIM3和TIM4、TIM5的中断优先级都一样。
求问这是怎么一回事?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
8条回答
lkposible4
2019-07-21 08:48
本帖最后由 lkposible4 于 2017-5-6 14:27 编辑
Electronic 发表于 2017-5-6 14:15
把代码贴出来看看

定时器4中断程序
[mw_shl_code=c,true]void TIM4_IRQHandler(void){
        GPIOC_2=!GPIOC_2;
        TIM_ClearITPendingBit(TIM4,TIM_IT_Update);  
}[/mw_shl_code]
主函数
[mw_shl_code=c,true]int main(void){
Init();
TIM_Cmd(TIM4,ENABLE);
while(1){
delay_ms(5000);
}
}[/mw_shl_code]

定时器初始化:
[mw_shl_code=c,true]        TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
        
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);  ///ê1ÄüTIM4ê±Öó
        
  TIM_TimeBaseInitStructure.TIM_Period = 5000-1;         //×Ô¶ˉÖØ×°ÔØÖμ
        TIM_TimeBaseInitStructure.TIM_Prescaler=8400-1;  //¶¨ê±Æ÷·ÖÆ죨òÑμ÷êÔ£¬¶¨ê±Æ÷ê±ÖóÎa84M£©//¶¨ê±Æ÷ê±Öó84M£¬·ÖÆμÏμêy8400£¬ËùòÔ84M/8400=10KhzμļÆêyÆμÂ꣬¼Æêy5000′ÎÎa0.5s     
        TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //ÏòéϼÆêyÄ£ê½
        TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
        
        TIM_TimeBaseInit(TIM4,&TIM_TimeBaseInitStructure);//3õê¼»ˉTIM4
        TIM_ClearITPendingBit(TIM4,TIM_IT_Update);//Çå3yÖD¶Ï±êÖ¾
        TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE); //ÔêDí¶¨ê±Æ÷4¸üDÂÖD¶Ï
        //TIM_Cmd(TIM4,ENABLE); //ê1Äü¶¨ê±Æ÷4
        
        NVIC_InitStructure.NVIC_IRQChannel=TIM4_IRQn; //¶¨ê±Æ÷4ÖD¶Ï
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x01; //ÇàÕ¼óÅÏ輶1
        NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x03; //×óóÅÏ輶3
        NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
        NVIC_Init(&NVIC_InitStructure);[/mw_shl_code]

一周热门 更多>