今天用通用定时器写了个定时,定时时间为500ms,在溢出中断里加了一个gpio翻转,讲道理应该是输出方波的。但是,我在main函数里还加了一个原子哥写的delay函数,delay_ms(5000)。
奇怪的事情来了。
如果通用定时器溢出中断中只有gpio翻转,可以偶尔输出正常方波,但是正常的周期数不会超过5个。剩下的时间要么全高要么全低。
如果通用定时器溢出中断里加上别的东西,比如定义一个变量,则完全冲突,方波周期完全变成由delay函数控制,也就是说delay的过程中,定时器中断是等待的。
经过测试,TIM3可以和delay一起用,但是TIM4和TIM5都不行。TIM3和TIM4、TIM5的中断优先级都一样。
求问这是怎么一回事?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
定时器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]
一周热门 更多>