打印

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

[复制链接]
2033|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+时间;就行了

如何实现中断后就结束,类似于计数器停止的功能呢

使用特权

评论回复
5
玩转单片机|  楼主 | 2013-10-17 18:45 | 只看该作者
jjjkkk00 发表于 2013-10-17 10:44
//初始化的时候,不要使能定时器TIM2
TIM_Cmd(TIM2,DISABLE);

这样还是会连续进入中断啊,并不是说开启一次仅进入中断一次

使用特权

评论回复
6
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

粉丝