当前位置: 代码迷 >> 综合 >> 关于STM32F10X 刚配置完定时器后 会立刻进入 中断的 BUG 修复
  详细解决方案

关于STM32F10X 刚配置完定时器后 会立刻进入 中断的 BUG 修复

热度:83   发布时间:2024-01-21 04:24:33.0

定时器初始化

static void Timer3_Init(u16 Period, u16 Prescaler)
{TIM_TimeBaseInitTypeDef  TIM_TimeBaseStrucure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);TIM_TimeBaseStrucure.TIM_Period = Period - 1;TIM_TimeBaseStrucure.TIM_Prescaler = (Prescaler - 1); //7200-1为10KHzTIM_TimeBaseStrucure.TIM_ClockDivision = 0;TIM_TimeBaseStrucure.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStrucure);NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);TIM_Cmd(TIM3, DISABLE);
}void Timer3_Settings(u16 Period, u16 Prescaler)
{Timer3_Init(Period, Prescaler);TIM_ClearITPendingBit(TIM3, TIM_IT_Update); //清除更新中断请求位      【此处顺序很重要】TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE); //使能定时器3更新中断TIM_Cmd(TIM3, ENABLE);
}

 

PS:初始化时的顺序很重要 

       1、TIM_ClearITPendingBit(TIM3, TIM_IT_Update); //清除更新中断请求位      
       2、TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE); //使能定时器3更新中断
       3、TIM_Cmd(TIM3, ENABLE);

 

实时更改频率值,且不会产生 中断 的操作,先关闭定时器 后配置!

           

TIM_Cmd(TIM3, DISABLE);  
TIM_ITConfig(TIM3, TIM_IT_Update, DISABLE);          
TIM_SetCounter(TIM3, 0);                                   // 向上计数时此处 清零
TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
Timer3_Settings(10000, 432000 / HittingFrequency);