漂泊的雨林 发表于 2017-4-13 09:47:03

一个关于定时器的奇怪现象

本帖最后由 漂泊的雨林 于 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;
}   此为定时器的配置函数



我想问下大家有遇到同样情况的没顺便看看有没有大神能解惑的没

wenyangzeng 发表于 2017-4-13 10:21:38

貌似进入定时器的其他中断。你可以在中断处判断是定时器的哪个中断源引起的。

anobodykey 发表于 2017-4-13 13:58:20

看着代码应该没啥问题?中断ISR中else经常进去迈?

漂泊的雨林 发表于 2017-4-13 14:35:29

wenyangzeng 发表于 2017-4-13 10:21
貌似进入定时器的其他中断。你可以在中断处判断是定时器的哪个中断源引起的。 ...

问题是中断只开了一个更新中断   其他的都没有开

wenyangzeng 发表于 2017-4-13 16:09:39

漂泊的雨林 发表于 2017-4-13 14:35
问题是中断只开了一个更新中断   其他的都没有开

对呀,你在中断那个“else”里设置断点,然后查看中断标志位,就可以知道是哪个意外中断,再来查找意外中断的原因。

漂泊的雨林 发表于 2017-4-25 18:40:31

wenyangzeng 发表于 2017-4-13 16:09
对呀,你在中断那个“else”里设置断点,然后查看中断标志位,就可以知道是哪个意外中断,再来查找意外中 ...

我发现TIM4->SR的值为1F   CCxIF 4个标识位全都置位了   UIF也置位了   按道理说 中断使能只开了一个UIF其他的不应该触发中断但是为什么会进中断呢   而且UIF位之前也情了 为什么这次置位了 但是没有触发前面的中断呀
页: [1]
查看完整版本: 一个关于定时器的奇怪现象