STM8 定时器TIM1 计时

      ST公司的STM8单片机的TIM1定时器,是一个16位高级控制定时器,可用于实现基本的定时,PWM波的产生,这里主要分析下基本的计时功能。

       我们先看ST提供的库函数中TIM1定时器的初始化函数

      void TIM1_TimeBaseInit(uint16_t TIM1_Prescaler,
                       TIM1_CounterMode_TypeDef TIM1_CounterMode,
                       uint16_t TIM1_Period,
                       uint8_t TIM1_RepetitionCounter)

        其中,TIM1_Prescaler是一个16位的分频配置,可输入值为0-65535,这个值最终是写入TIM1_PSCR寄存器的,而我们计算定时器的频率公式为:fcnk = fsys/(PSCR[15:0]+1),其中fsys为系统时钟频率,PSCR[15:0]为TIM1_PSCR寄存器的16位值;

         TIM1_CounterMode是计数模式,总共有5种模式,分别为:

        TIM1_COUNTERMODE_UP               向上计数模式
        TIM1_COUNTERMODE_DOWN              向下计数模式
        TIM1_COUNTERMODE_CENTERALIGNED1    
        TIM1_COUNTERMODE_CENTERALIGNED2    
       TIM1_COUNTERMODE_CENTERALIGNED3    

       TIM1_Period,计数值,此项可取1-65535任意数值

       TIM1_RepetitionCounter,重复计数次数,此项可取0-255任意数值。

       假设我们的系统时钟是8Mhz,我们定时1秒钟,那我们初始化设置应该为:  

      TIM1_TimeBaseInit(7,TIM1_COUNTERMODE_UP,1000,100);

       时间计算:

       定时器的频率fcnk = 8Mhz/(7+1) = 1Mhz,说明一次计数为1us,1000次计数为1ms,而重复计数100次,则一次中断计时时间为100ms,为了到达1s的效果,我们还需要在中断函数里面,进行一个10次的判断

      中断函数代码实现

INTERRUPT_HANDLER(TIM1_UPD_OVF_TRG_BRK_IRQHandler, 11)

  count_number++;
  if(count_number < 10)
  {
  }
  else
  {
       count_number = 0;//此时到达1秒钟定时
  }  
  TIM1_ClearITPendingBit(TIM1_IT_UPDATE);

}

      下面为相关代码,进行1S定时的实现

/*********************
*函数名称:TIM_Config
*函数描述:计时器配置
*参数说明:
*         输入参数  无
*         输出参数  无
*********************/
void TIM_Config(void)
{
  TIM1_DeInit();
  TIM1_TimeBaseInit(7,TIM1_COUNTERMODE_UP,1000,100);
  TIM1_ARRPreloadConfig(ENABLE);
  TIM1_ITConfig(TIM1_IT_UPDATE,ENABLE);
  TIM1_Cmd(ENABLE);
}
/**
  * @brief Timer1 Update/Overflow/Trigger/Break Interrupt routine.
  * @param  None
  * @retval None
  */
INTERRUPT_HANDLER(TIM1_UPD_OVF_TRG_BRK_IRQHandler, 11)
{
  /* In order to detect unexpected events during development,
     it is recommended to set a breakpoint on the following instruction.
  */
  count_number++;
  if(count_number < 10)
  {
  }
  else
  {
    count_number = 0;  
  }  
  TIM1_ClearITPendingBit(TIM1_IT_UPDATE);
}




你可能感兴趣的:(2018年)