发现问题:
使用定时器中断,一复位就进入中断。
原因分析:
1、怎么识别到产生了定时器中断?
中断标志位,当标志位置1时就会产生中断。
2、什么时候中断标志位置1?
以向上计数为例:当计数值计到重装载值再回到0时,此时中断标志位置1。
3、复位进入中断?
当复位后重新开始定时器初始化,从0开始计数,当计数值为0时就已经将标志位置1,产生了一个中断。
解决方法:
在初始化定时器后将标志位清零即可。
/***************************************************************************
* 函数名称:TIM3_Init
* 功 能:TIM3初始化
* 参 数:arr:周期(ms)
* 返 回:无
* 说 明:84MHz,42000/84M =0.5ms
* 作 者:chengzhou
****************************************************************************/
void TIM3_Ini_Init(u16 arr)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
NVIC_InitTypeDef NVIC_InitStruct;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
TIM_TimeBaseInitStruct.TIM_Period = arr*2-1;
TIM_TimeBaseInitStruct.TIM_Prescaler = 42000-1;
TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStruct);
TIM3->SR &= ~(1<<0); //清除中断标志位,防止一复位就进入中断
TIM3->DIER |= 1<<0; //使能中断
TIM_Cmd(TIM3,ENABLE);
NVIC_InitStruct.NVIC_IRQChannel =TIM3_IRQn;
NVIC_InitStruct.NVIC_IRQChannelCmd =ENABLE;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStruct.NVIC_IRQChannelSubPriority =0;
NVIC_Init(&NVIC_InitStruct);
}