一、时基配置
定时器时基配置主要是配置定时器周期,即分频系数和自动重载寄存器。
比如现在我需要配置一个100us的定时周期,那么我需要先选择定时器,然后确定它的时钟频率,定时器的时钟不是直接来自APB1或APB2,而是来自于输入为APB1或APB2的一个倍频器。
下面以定时器2的时钟说明这个倍频器的作用:当APB1的预分频系数为1时,这个倍频器不起作用,
定时器的时钟频率等于APB1的频率;当APB1的预分频系数为其它数值(即预分频系数为2、4、8或16)
时,这个倍频器起作用,定时器的时钟频率等于APB1的频率两倍。
假定AHB=36MHz,因为APB1允许的最大频率为36MHz,所以APB1的预分频系数可以取任意数值;当预
分频系数=1时,APB1=36MHz,TIM2的时钟频率=36MHz(倍频器不起作用);当预分频系数=2时,
APB1=18MHz,在倍频器的作用下,TIM2的时钟频率=36MHz。
定时器定时周期计算:
公式:T=(arr+1)*(PSC+1)/Tck 其中TCK为时钟频率,PSC为时钟预分频系数,arr为自动重装载值。
要配置100us周期,我需要设置TIM_Prescaler预分频器的值为36-1,这样可以得到1us的周期,再设置TIM_Period重载寄存器的值为100-1,这样就得到100us的定时器周期。-1是因为定时器是从0开始或结束的。
最后配置向上计数或向下计数。
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
TIM_TimeBaseStructure.TIM_Period = 100-1;
TIM_TimeBaseStructure.TIM_Prescaler = 84-1;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
二、捕获/比较通道配置
定时器捕获比较模式说明:
TIM_OCInitTypeDef 结构体是用于配置定时器的输出比较模式的参数,与 TIM_OCxInit 函数配合使用,可以实现 PWM 波形、脉冲宽度调节、频率调节等功能。
TIM_OCInitTypeDef 结构体包含以下成员:
TIM_OCMode:输出比较模式,可以选择 8 种不同的模式,如 TIM_OCMode_Timing、TIM_OCMode_PWM1、TIM_OCMode_PWM2 等。不同的模式决定了输出信号的波形和极性。
TIM_OutputState:输出比较使能,可以选择是否将输出信号通过外部引脚输出,如 TIM_OutputState_Enable 或 TIM_OutputState_Disable。
TIM_OutputNState:互补输出比较使能,只适用于高级定时器,可以选择是否将互补输出信号通过外部引脚输出,如 TIM_OutputNState_Enable 或 TIM_OutputNState_Disable。
TIM_Pulse:输出比较脉冲宽度,可以设置比较寄存器 CCRx 的值,决定了输出信号的占空比或脉冲宽度。
TIM_OCPolarity:输出比较极性,可以选择输出信号的有效电平是高电平还是低电平,如 TIM_OCPolarity_High 或 TIM_OCPolarity_Low。
TIM_OCNPolarity:互补输出比较极性,只适用于高级定时器,可以选择互补输出信号的有效电平是高电平还是低电平,如 TIM_OCNPolarity_High 或 TIM_OCNPolarity_Low。
TIM_OCIdleState:空闲状态下的输出比较状态,只适用于高级定时器,可以选择在空闲状态下(即 BDTR_MOE 位为 0)经过死区时间后的输出信号是高电平还是低电平,如 TIM_OCIdleState_Set 或 TIM_OCIdleState_Reset。
TIM_OCNIdleState:空闲状态下的互补输出比较状态,只适用于高级定时器,可以选择在空闲状态下(即 BDTR_MOE 位为 0)经过死区时间后的互补输出信号是高电平还是低电平,如 TIM_OCNIdleState_Set 或 TIM_OCNIdleState_Reset。
以通用定时器为例,具有四个捕获/比较通道,每个通道可以设置不同的占空比
TIM_OCStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
TIM_OCStructure.TIM_Pulse = Main_Time*0.5;
TIM_OC1Init(TIM9,&TIM_OCStructure);
三、中断优先级配置
中断优先组:以stm32为例,可设置5组中断分组,分别是0~4,其中根据组别不同分别对应有
0,1,2,3,4个抢占优先级
4,3,2,1,0个响应优先级
抢占优先级:若A比B高,B正在执行时,当A发生中断,停止B,A立刻响应执行
响应优先级:若A比B高,C正在执行时,当C执行完后,A开始执行。
四、开启中断与定时器相关函数
TIM_ITConfig(TIM2,TIM_FLAG_Update,ENABLE);//中断使能
TIM_Cmd(TIM2, ENABLE);//定时器使能