如何实现每次启动定时器后单次进入中断,而且定时时间在启动时可设置

[复制链接]
2338|5
 楼主| 玩转单片机 发表于 2013-10-16 23:22 | 显示全部楼层 |阅读模式
以前采用定时器的装载计数器,可是在初始化计数器时会很快产生中断,这样就会产生两个中断。现在采用通道的输出比较中的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);

   
  }
}
huzi2099 发表于 2013-10-17 10:18 | 显示全部楼层
中断后修改通道值CCRX=TIM2->CNT+时间;就行了
jjjkkk00 发表于 2013-10-17 10:44 | 显示全部楼层
//初始化的时候,不要使能定时器TIM2
TIM_Cmd(TIM2,DISABLE);

,在你需要使用的时候;配置好TIM2->CCR2的值,然后使能TIM_Cmd(TIM2,ENABLE)。
 楼主| 玩转单片机 发表于 2013-10-17 18:44 | 显示全部楼层
huzi2099 发表于 2013-10-17 10:18
中断后修改通道值CCRX=TIM2->CNT+时间;就行了

如何实现中断后就结束,类似于计数器停止的功能呢
 楼主| 玩转单片机 发表于 2013-10-17 18:45 | 显示全部楼层
jjjkkk00 发表于 2013-10-17 10:44
//初始化的时候,不要使能定时器TIM2
TIM_Cmd(TIM2,DISABLE);

这样还是会连续进入中断啊,并不是说开启一次仅进入中断一次
jjjkkk00 发表于 2013-10-18 13:51 | 显示全部楼层
玩转单片机 发表于 2013-10-17 18:45
这样还是会连续进入中断啊,并不是说开启一次仅进入中断一次

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);

    //在这里把定时器关掉,或者失能中断
    TIM_Cmd(TIM2,DISABLE);或者 TIM_ITConfig(TIM2,TIM_IT_CC2,DISABLE);
  }
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

32

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部