在学习stm32的过程中,了解到定时器是非常核心且实用的一个模块,而定时器的中断更是应用的十分广泛,在学习了中断的一些知识后对普通定时器的中断进行了编写,发现都可以成功。将其移植到高级定时器当中,然而在对高级定时器tim1和tim8的一些中断配置中出现了中断只进行一次就不进行的现象,经过调试发现是中断标志位无法置零,以下是普通定时器的中断配置
NVIC_InitTypeDef NVIC_InitType;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能
TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 计数到5000为500ms
TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值 10Khz的计数频率
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
TIM_ITConfig(TIM3,TIM_IT_CC1,ENABLE);
NVIC_InitType.NVIC_IRQChannel=TIM3_IRQn;
NVIC_InitType.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitType.NVIC_IRQChannelPreemptionPriority=1;
NVIC_InitType.NVIC_IRQChannelSubPriority=1;
NVIC_Init(&NVIC_InitType);
TIM_Cmd(TIM3, ENABLE); //使能TIMx外设
对普通定时器是可以运行的,高级定时器的定时器初始化还需要加个参TIM_RepetitionCounter。
NVIC_InitTypeDef NVIC_InitType;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8, ENABLE);
TIM_TimeBaseStructure.TIM_Period = arr;
TIM_TimeBaseStructure.TIM_Prescaler =psc;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseStructure.TIM_RepetitionCounter=0;
TIM_TimeBaseInit(TIM8, &TIM_TimeBaseStructure);
TIM_ITConfig(TIM8,TIM_IT_Update,ENABLE);
NVIC_InitType.NVIC_IRQChannel=TIM8_UP_IRQn ;
NVIC_InitType.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitType.NVIC_IRQChannelPreemptionPriority=0;
NVIC_InitType.NVIC_IRQChannelSubPriority=0;
NVIC_Init(&NVIC_InitType);
TIM_Cmd(TIM8, ENABLE);