STM32定时器使用(一)时钟定时

定时器分类

1,基本定时器TIM6、TIM7;计时,能产生中断,没有输入输出引脚;
2,通用计时器TIM2、TIM3/TIM4/TIM5;计时、中断、比较/捕获,PWM方波输出,编码器接口;
3,高级定时器TIM1、TIM8;上面都具有,还具有三相6步电机的接口、刹车功能以及用于PWM驱动电路的四驱时间控制。

时钟源

TIM2-TIM7的时钟源是APB1
TIM1、TIM8的时钟源是APB2

应用代码

使用TIM2的基本定时器功能,配置过程
1、配置TIM2,打开时钟,重装载值设置(周期),时钟分频器,计数方式,使能中断

void TIM2_Configuration(void)
{
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 , ENABLE);		/* 打开时钟 72MHZ */
	
    TIM_TimeBaseStructure.TIM_Period=1000;/* 重装载值*/
    TIM_TimeBaseStructure.TIM_Prescaler= 71; /*时钟预分频数72,也就是本来72M,现在是1M */
    TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;/* 对外部时钟进行采样的时钟频率,这里没有用到 */
    TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数
    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);//设置TIM2参数
	
    TIM_ClearFlag(TIM2, TIM_FLAG_Update);//清除标志位
    TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);//使能中断
		
    TIM_Cmd(TIM2, ENABLE);//使能定时器																		
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 , DISABLE);		/*先关闭,等待使用*/    
}

接下来配置中断优先级

void TIM2_NVIC_Configuration(void)
{
    NVIC_InitTypeDef NVIC_InitStructure; 
    
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); //无主优先级,次优先级为16个												
    NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;	  //指定中断服务函数
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;	//这里0-15都可以
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
}

接下来写中断服务函数

extern volatile u32 time; //volatile  是修饰字符,不用优化
void TIM2_IRQHandler(void)
{
	if ( TIM_GetITStatus(TIM2 , TIM_IT_Update) != RESET ) 
	{	
		time++;
		TIM_ClearITPendingBit(TIM2 , TIM_FLAG_Update);  		 
	}		 	
}

主函数的循环

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 , ENABLE);//打开时钟开始计数
  while(1)
  {
    if ( time == 1000 ) /* 1000 * 1 ms = 1s 周期,中断1000次,中断中期为1/1M = 1ms */
    {
      time = 0;
		//做自己的事
    }        
  }

你可能感兴趣的:(STM32)