通用定时器的功能概述
通用定时器除了具有基础定时器的功能以外,还具有内外时钟源选择、输入捕获、输出比较、编码器接口、主从触发模式等功能。
通用定时器的输出比较简介
OC(Output Compare)输出比较可以通过比较CNT与CCR寄存器(输入捕获寄存器)值的关系,来对输出电平进行置1、置0或翻转的操作,用于输出一定频率和占空比的PWM波形,每个高级定时器和通用定时器都拥有4个输出比较通道。注意高级定时器的前3个通道额外拥有死区生成和互补输出的功能。
由于本此使用的是定时器的输出比较部分,我们着重分析右下角,输出比较与输入捕获的核心在于捕获比较寄存器,但定时器用于输出比较时,则捕获比较寄存器为比较寄存器,而定时器用于输入捕获时,则捕获比较寄存器为捕获寄存器。
输出比较的工作模式为,内部时钟信号经过时基单元分频后,计数器CNT在自增时会与CCR继续比较,其输出模式又有以下几种:
我们常用的是PWM模式1,在CNT小于CCR时,通道输出有效电平信号,CNT大于CCR时,通道输出无效电平信号。由此可见PWM的周期取决于时基单元,而占空比取决于CCR与时基单元,基于CCR与ARR的比值。
而有效电平则与CC1P选择器有关,其选择对应的波形输出的极性,这里我们通常都选择为高极性,也就是有效电平为高电平,理论部分就到这,下面开始配置代码。
代码配置
在配置定时器的过程种,这里通道输出所对应的GPIO口仍然需要查引脚复用表所得。
/*
通用定时器TIM4的配置;输出比较OC(输出PWM)
CNT与CCR(捕获比较寄存器)比较
TIM4_CH1 PB6
*/
void Tim4_Init(u16 arr,u16 psc,u16 ccr)
{
GPIO_InitTypeDef GPIO_InitStructure = {0};
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure = {0};
TIM_OCInitTypeDef TIM_OCInitStructure = {0};
/*开启时钟*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
/*GPIO配置*/
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStructure);
/*定时器时基单元配置*/
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;//不分频
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;//设置为向上计数
TIM_TimeBaseStructure.TIM_Prescaler=psc-1;//设置预分频值
TIM_TimeBaseStructure.TIM_Period=arr-1;//自动重装载值
TIM_TimeBaseInit(TIM4,&TIM_TimeBaseStructure);
/*输出比较配置*/
TIM_OCStructInit(&TIM_OCInitStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; // PWM模式1
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; // 使能输出
TIM_OCInitStructure.TIM_Pulse = ccr; // 脉冲宽度,决定占空比
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; // 输出极性高(有效电平为高电平)
TIM_OC1Init(TIM4, &TIM_OCInitStructure);
TIM_Cmd(TIM4, ENABLE);
}
执行此函数后,定时器就可以成功输出PWM波了,这也是定时器使用的最常用的功能之一。但要注意的是,同一输出比较与输入捕获是共用一个单元的,因此一个通道无法同时实现两种功能。