STM32通用定时器

本篇文章主要讲解用通用定时器TIM2产生1ms定时的中断:

首先是定时器配置,代码如下:

void Tim2_Configration(void)
{
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
    TIM_DeInit(TIM2);//重新将Timer设置为缺省值  
  TIM_InternalClockConfig(TIM2); //采用内部时钟给TIM2提供时钟源,内部时钟(CK_INT)、外部时钟模式1:外部输入脚(TIx)、外部时钟模式2:外部触发输入(ETR)  
    TIM_TimeBaseStructure.TIM_Prescaler = 72 - 1; //计数器时钟为72MHz/72 = 1MHz    
    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;//设置时钟分割    
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Down;//设置计数器模式为向上计数模式    
    TIM_TimeBaseStructure.TIM_Period = 1000 - 1;//设置计数溢出大小,每计1000个数就产生一个更新事件    
    TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);//将配置应用到TIM2中        
    TIM_ClearFlag(TIM2, TIM_FLAG_Update);//清除溢出中断标志    
    TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);//开启TIM2的中断
    TIM_Cmd(TIM2, ENABLE);  //计数器使能,开始工作    
}

TIM_Period设置了在下一个更新事件装入活动的自动重装载寄存器周期的值。它的取值必须在0x0000和0xFFFF之间。

TIM_Prescaler设置了用来作为TIMx时钟频率除数的预分频值。它的取值必须在0x0000和0xFFFF之间。

TIM_ClockDivision的作用是做一段延时,一般在特殊场合的时候会用到,可不关心。

TIM_CounterMode选择了计数器模式。

    TIM_CounterMode_Up
    TIM向上计数模式
    TIM_CounterMode_Down
    TIM向下计数模式
    TIM_CounterMode_CenterAligned1   TIM中央对齐模式1计数模式
    TIM_CounterMode_CenterAligned2   TIM中央对齐模式2计数模式
    TIM_CounterMode_CenterAligned3   TIM中央对齐模式3计数模式

注意:单片机时钟频率72MHz,APB1 二分频36MHz,故TIM2自动2倍频至72MHz

NVIC的配置:

void NVIC_Configuration(void)
{
    NVIC_InitTypeDef NVIC_InitStructure;
    #ifdef  VECT_TAB_RAM  
        /* Set the Vector Table base location at 0x20000000 */ 
        NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0); 
    #else  /* VECT_TAB_FLASH  */
        /* Set the Vector Table base location at 0x08000000 */ 
        NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);   
    #endif

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);//1 bits for pre-emption priority  3 bits for subpriority

    /* Enable the TIM2 gloabal Interrupt */
    NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;    
    NVIC_Init(&NVIC_InitStructure);
}

中断服务函数:

void TIM2_IRQHandler(void)
{
    if(TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
    {
        TIM_ClearITPendingBit(TIM2, TIM_IT_Update);    
    }
}
原文地址:https://www.cnblogs.com/zpehome/p/3166789.html