定时器初始化
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);