以前采用定时器的装载计数器,可是在初始化计数器时会很快产生中断,这样就会产生两个中断。现在采用通道的输出比较中的TIM_OCMode_Timing模式,可是会连续进入中断。
要实现的功能:使用定时器的输出比较TIM_OCMode_Timing模式,用作定时功能,例如20ms的定时,20ms时间到后进入中断。每一次启动定时器后才进入中断
异常现象:启动定时器后连续进入中断
oid TIM2_Start(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 , ENABLE);
TIM_TimeBaseStructure.TIM_Period=0xffff;
TIM_TimeBaseStructure.TIM_Prescaler= (72 - 1); /* 时钟预分频数 72M/72 */
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; /* 采样分频 */
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; /* 向上计数模式 */
TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
TIM2_OCInitStructure.TIM_OCMode = TIM_OCMode_Timing ; //TIM3_CCMR1[14:12]=011 翻转 当TIM3_CCR2=TIM3_CNT时,翻转OC2REF的电平
TIM2_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //输入/捕获2输出允许 OC2信号输出到对应的输出引脚PB5
TIM2_OCInitStructure.TIM_Pulse =60000; //若CC1通道配置为输出:CCR2是装入当前捕获/比较2 TIM3_CCR2寄存器的值(预装载值)。
//当前捕获/比较寄存器包含了与计数器TIM3_CNT比较的值,并且在OC端口上输出信号
TIM2_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性 低电平有效 TIM3_CCER[5]=1;
TIM_OC2Init(TIM2, &TIM2_OCInitStructure);
TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Disable); //TIM3_CCMR1[1]=0 禁止TIM3_CCR2寄存器的预装载功能,可随时写入TIM3_CCR2
//且新值马上起作用
TIM_Cmd(TIM2,ENABLE); //启动定时器3 TIM3_CR1[0]=1;
TIM_ITConfig(TIM2,TIM_IT_CC2,ENABLE); //TIM3_DIER[2]=1 允许捕获/比较2中断
}
void TIM2_IRQHandler(void)
{
if (TIM_GetITStatus(TIM2, TIM_IT_CC2) != RESET) //判断状态寄存器 TIM2_SR[2] 是否发生了捕获/比较2 中断
{
TIM_ClearITPendingBit(TIM2, TIM_IT_CC2); //软件清除状态寄存器 TIM2_SR[2] 捕获/比较2 中断中断标志
GPIO_ResetBits(GPIOD, GPIO_Pin_2);
}
} |