本帖最后由 漂泊的雨林 于 2017-4-13 09:48 编辑 我在写程序的时候发现一个奇怪的现象 我用的是定时器4 开启了更新中断 但是在中断函数里面 发现其他的原因触发了中断 void TIM4_IRQHandler(void) { if(TIM_GetITStatus(TIM4,TIM_IT_Update)==SET) //溢出中断 { timeup++; LEDCHANGE; // if(timeup%2) // LEDON; // else // LEDOFF; } else { timeup=0; } TIM_ClearITPendingBit(TIM4,TIM_IT_Update); //清除中断标志位 } 程序运行到了else 里面 void TIMER4_Config(u32 nms) { TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE); ///使能TIM4时钟 //配置定时器 TIM_TimeBaseInitStructure.TIM_Period = 42000-1; //自动重装载值 TIM_TimeBaseInitStructure.TIM_Prescaler=2*nms-1; //定时器分频 TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式 TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1; TIM_TimeBaseInit(TIM4,&TIM_TimeBaseInitStructure);//初始化TIM4 //配置定时器的中断 // NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); // NVIC_InitStructure.NVIC_IRQChannel=TIM4_IRQn; //定时器4中断 // NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x00; //抢占优先级1 // NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x01; //子优先级3 // NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; // NVIC_Init(&NVIC_InitStructure); //使能定时器中断开启定时器 // TIM_ClearITPendingBit(TIM2,TIM_IT_Update); TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE); //允许定时器4更新中断 TIM_Cmd(TIM4,ENABLE); //使能定时器4 //清空定时器列表 listtmr.head=(TMR *)0; listtmr.end=(TMR *)0; listtmr.present=(TMR *)0; } 此为定时器的配置函数 我想问下大家有遇到同样情况的没 顺便看看有没有大神能解惑的没 |
问题是中断只开了一个更新中断 其他的都没有开
对呀,你在中断那个“else”里设置断点,然后查看中断标志位,就可以知道是哪个意外中断,再来查找意外中断的原因。
我发现TIM4->SR的值为1F CCxIF 4个标识位全都置位了 UIF也置位了 按道理说 中断使能只开了一个UIF 其他的不应该触发中断 但是为什么会进中断呢 而且UIF位之前也情了 为什么这次置位了 但是没有触发前面的中断呀