STM32学习笔记:通用定时器基本设定

时间:2021-11-13 23:21:42

STM32 包含11个定时器,其中TIM2~TIM5为通用定时器。

通用定时器挂载在低速外设总线APB1上,其时钟来源于输入为APB1的一个倍频器,只要APB1的时钟分频数不为1,TIMx的时钟频率就会为APB1时钟频率的2倍,即72MHz 。


配置通用定时器需要4步(以配置TIM2为例):

(1)配置系统时钟

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);倍
开启TIM2与GPIOA的时钟,其中TIM2挂载在APB1上,GPIOA挂载在APB2上;

(2)配置NVIC

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置NVIC中断分组2,2位抢占优先级,2为子优先级 							
NVIC_InitStructure.NVIC_IRQChannel = TIM2_UP_IRQn;//设置中断为TIM2上升中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;//抢占优先级1
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;//子优先级3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能中断
NVIC_Init(&NVIC_InitStructure);

(3)配置GPIO

GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;//PA0,PA1,PA2,PA3
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//设置为端口复用模式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);

(4)配置TIMER

TIM_DeInit(TIM2);	
TIM_TimeBaseStructure.TIM_Period = arr;
TIM_TimeBaseStructure.TIM_Prescaler = psc;
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1 ;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

TIM_ARRPreloadConfig(TIM2, ENABLE);
TIM_Cmd(TIM2, ENABLE);
1.利用TIM_DeInit将TIMER设置为缺省值; 

2.TIM_Period设置自动装入的值,累计(TIM_Period+1)个时钟脉冲后产生更新或中断;

3.TIM_Prescaler设置预分频系数,定时器的时钟频率=72Mhz/(TIM_Prescaler+1);

定时器频率=((1+TIM_Prescaler )/72M)*(1+TIM_Period )

       例:如果想要设置定时器频率为1秒,可以设置

TIM_Prescaler=35999,TIM_Period=1999 //2Khz的频率,计数到2000

TIM_Prescaler=7199,TIM_Period=9999 //10KHz的频率,计数到10000

两种不同的参数设置都会使定时器的频率为1秒,但是在作为PWM输出时会有细度不同的问题,后者的细度更高些,作者更倾向于第二种配置。

4.TIM_ClockDivision设置时钟分割,可设置为TIM_CKD_DIV1,TIM_CKD_DIV2,TIM_CKD_DIV4,

当设置为TIM_CKD_DIV1时:
       TDTS = Tck_tim
当设置为TIM_CKD_DIV2时:
       TDTS = 2Tck_tim
当设置为TIM_CKD_DIV4时:
       TDTS = 4Tck_tim

TIM_ClockDivision的作用就是在未分频之前根据要求建立新的分频器,确定定时器,确定一定的延时时间,在此时间内完成一定预期的功能,一般不太用,所以无论是定义上文中的哪个值对原本定时器的频率都毫无影响,不过并不是没有作用的,以后会有能用到的地方。


5.TIM_CounterMode设置计数模式,可以设置为向上计数、向下计数和*对齐计数,其中比较常用的为向上计数模式TIM_CounterMode_Up和向下计数方式TIM_CounterMode_Down;

6.TIM_RepetitionCounter设置重复溢出次数,就是多少次溢出后会给你一次中断,一般设置为0,只有高级定时器才有用;

7.TIM_ARRPreloadConfig设置是否使用 预装载缓冲器;

8.TIM_Cmd来开启定时器TIM2;