通用定时器简介(以F429为例)
(部分图引自于ATK)
前情提要(基本定时器)
通用定时器类别
通用定时器和基本定时器相比大致的工作方式是相似的,不过通用定时器比基本定时器多了一些很好用的功能,比如:
- 外部输入捕获
- 输出比较
- 输出PWM
时钟源
CubeMX为我们提供了配置时钟的非常方便的工具。首先还是看这张图:
通用定时器的时钟源可以选择以下四种:
- 内部时钟
- 外部时钟模式1
- 外部时钟模式2
- 内部触发输入
一般用的最多的还是内部时钟源。以TIM3为例,由上图,TIM3挂载于APB1总线。在Cube MX中可以设置APB1总线定时器的时钟频率。
本文内APB1定时器频率均设置为75MHz。
计数模式
通用定时器的计数模式有三种,分别为:
- 向上(递增)计数
- 向下(递减)计数
- 中心对齐
这部分和基本定时器的内容基本一致。
功能
通用定时器可以实现输入捕获、输出比较等功能。以输入捕获为例,其顾名思义是定时器对输入的某个信号的上升沿、下降沿或者双边沿进行检测。输入信号通常来自于定时器的4个通道中的某一通道,其通过GPIO的复用功能引入。比如我们在CubeMX中随便选中一个GPIO,以PB0为例:
TIM3_CH3表明该GPIO可以被复用为TIM3的第3通道。
输入捕获功能可以测量输入信号的脉冲宽度、测量 PWM 输入信号的频率和占空比等。其他功能同理都基于这些定时器通道实现。
通用定时器中断应用(TIM3)
预期功能
使用通用定时器TIM3在定时器中断中以2s的间隔点亮LED0,在main.c的While(1)中以500ms间隔点亮LED1,比较二者的点亮间隔。
CubeMX配置
时钟源选择内部时钟。此处没用到定时器通道,因此4个通道都是禁用状态。在Parameter Settings里配置PSC、ARR寄存器的写入值和计数方式。这一部分和基本定时器相同。(截图里的PSC写错了,应该是15000)
NVIC中开启TIM3全局中断。抢占优先级设为1.
tim.c配置
重写HAL_TIM_PeriodElapsedCallback():
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
UNUSED(htim);
if (htim->Instance == TIM3) //确认中断由TIM3申请
{
HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_0); //反转LED0电平
}
}
main.c配置
打开TIM3时基:
HAL_TIM_Base_Start_IT(&htim3);
重写死循环:
while (1)
{
HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_1);
HAL_Delay(500);
}
编译下载
实物演示就不放了。这一部分和基本定时器的使用是一致的,只不过改了定时器的编号。
通用定时器输出PWM应用(TIM3)
简介
生成PWN是定时器最为实用的功能之一,PWM可以用在很多地方,最常见的就是驱动调速。
在计数器频率固定时,PWM的频率由ARR确定,其占空比由CCR(捕获/比较寄存器)确定。产生原理如下图:
显然上图中的定时器工作在向上计数模式,纵轴为CNT。当CNT小于CCR写入值时,IO视为输出低电平;CNT大于等于CCR写入值时,IO视为输出高电平。CNT=ARR时定时器事件更新,CNT清零,进入下一个PWM周期。
定时器可以通过多种方式产生PWM,一般使用边沿对齐模式:
预期功能
使用TIM3通道3(复用PB0)输出PWM至LED,通过PWM控制LED亮度。
CubeMX配置
GPIO(PB0)选择复用推挽输出,上拉,高速。
定时器选择TIM3,时钟源选择内部时钟,通道3选择PWM Generation CH3.
接下来开始配置定时器参数。根据以下顺序一步步的进行:
1.配置TIM3时钟频率:这部分在Clock Configuartion中设置。根据上文,APB2总线定时器频率为75MHz。
2.配置PWM频率:根据
T o u t = ( A R R + 1 ) ∗ ( P S C + 1 ) f c l k T_{out} = \frac{(ARR+1)*(PSC+1)}{f_{clk}} Tout=fclk(ARR+1)∗(PSC+1)
而KaTeX parse error: Expect