blazeblade 发表于 2015-5-12 23:54:59

TIM1更新事件中断过快的问题

大家好,我调试TIM1定时器时出现一个很奇怪的问题。我打算配置定时器,生成一个10KHz的PWM波,同时开启更新事件中断。在中断服务程序中,我做了一个软件计数器TIM1_BRK_UP_TRG_COM_IRQTicker,每次进中断都累加一次,当累加到10000时,另一个计数器i加1。在正常情况下,一个PWM周期会有两个更新事件,产生两个中断,中断周期应该为20KHz,i的累加周期应该为0.5s。但是在WatchWindow里观察,i刷新很快。在TIM1_BRK_UP_TRG_COM_IRQTicker++处加一个断点,发现每次进中断,TIM1->CNT只计数了26。以上现象让我百思不得其解。盼望哪位经验丰富的朋友能够帮我指出问题所在。多谢了!

代码如下:
TIM1配置:
void Tim1Init(void)
{
      
                TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure;
               
                RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
                DBGMCU_APB2PeriphConfig(DBGMCU_TIM1_STOP, ENABLE);   

                TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
                TIM_DeInit(TIM1);

                TIM_ARRPreloadConfig(TIM1,ENABLE);
               
                TIM_TimeBaseStructure.TIM_Prescaler = 0;
                TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_CenterAligned1;
                TIM_TimeBaseStructure.TIM_Period = 2399;//ÐÅºÅÆµÂÊ10KHz;
                TIM_TimeBaseStructure.TIM_ClockDivision = 0;
                TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
                TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
               
                TIM_Cmd(TIM1,ENABLE);//TIM1 counter enable

                TIM_ClearFlag(TIM1, TIM_FLAG_Update);
                TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE);
}


中断程序:
void TIM1_BRK_UP_TRG_COM_IRQHandler(void)
{
                TIM1_BRK_UP_TRG_COM_IRQTicker++;
               
                if(TIM1_BRK_UP_TRG_COM_IRQTicker == 10000)
                {
                        i++;
                        TIM1_BRK_UP_TRG_COM_IRQTicker = 0;
                }
}

eurphan 发表于 2015-5-15 13:44:07

写的真好啊      ,简单易懂

mark0668 发表于 2015-5-16 00:21:26

谢谢分享

Winddddd 发表于 2015-5-16 00:40:20

不知道你的系统时钟和定时器时钟

blazeblade 发表于 2015-6-15 20:15:58

问题已解决:需要在中断里先判断是哪种中断,最后要清中断标志!奇怪,为什么跟别的芯片不一样,还要判断是哪种中断?
页: [1]
查看完整版本: TIM1更新事件中断过快的问题