STM32 包含11个定时器,其中TIM2~TIM5为通用定时器。
通用定时器挂载在低速外设总线APB1上,其时钟来源于输入为APB1的一个倍频器,只要APB1的时钟分频数不为1,TIMx的时钟频率就会为APB1时钟频率的2倍,即72MHz 。
配置通用定时器需要4步(以配置TIM2为例):
(1)配置系统时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);开启TIM2与GPIOA的时钟,其中TIM2挂载在APB1上,GPIOA挂载在APB2上;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);倍
(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);1.利用TIM_DeInit将TIMER设置为缺省值;
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);
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;