STM32(6)-通用定时器

DMA上次了解了基本概念,但是DMA+串口的应用我还不太懂,写的代码运行效果不好,因此先往后面放,这里先学习通用定时器GPTM的知识。


一、定时器是什么?

TIM(Timer)定时器
定时器可以对输入的时钟进行计数,并在计数值达到设定值时触发中断
16位计数器、预分频器、自动重装寄存器的时基单元,在72MHz计数时钟下可以实现最大59.65s的定时
不仅具备基本的定时中断功能,而且还包含内外时钟源选择输入捕获输出比较编码器接口主从触发模式等多种功能
根据复杂度和应用场景分为了高级定时器、通用定时器、基本定时器三种类型。
高级定时器模块包含一个功能强大的 16 位自动重装定时器(TIM1、TIM8、TIM9 和 TIM10)
通用定时器模块包含一个 16 位可自动重装的定时器(TIM2、TIM3、TIM4 和 TIM5)
基本定时器模块包含一个 16 位可自动重装的定时器(TIM6 和 TIM7)。

二、通用定时器

1.主要特征

通用定时器的主要特征包括:
16 位自动重装计数器,支持增计数模式,减计数模式和增减计数模式
16 位预分频器,分频系数从 1~65536 之间动态可调
支持四路独立的比较捕获通道
每路比较捕获通道支持多种工作模式,比如:输入捕获、输出比较、PWM 生成和单脉冲输出
支持外部信号控制定时器
支持在多种模式下使用 DMA
支持增量式编码,定时器之间的级联和同步

2.基本定时器基本结构

在这里插入图片描述
基本定时器的结构大致可以分为两部分,即输入时钟部分核心计数器部分
(1)输入时钟部分:
内部时钟CK_INT一般是系统的主频,比如72MHz。
(2)通用定时器的核心是一个 16 位计数器(CNT)。
CK_PSC 经过预分频器(PSC)分频后,成为 CK_CNT,再最终输给 CNT,CNT 支持增计数模式、减计数模式和增减计数模式,并有一个自动重装值寄存器(ATRLR)在每个计数周期结束后为 CNT 重装载初始化值。
注意,这里的分频器PSC可以对其写值来进行分频,比如对其写0,即不分频,写1即二分频,写2即三分频,以此类推。即实际分频=预分频+1。最多可以进行65535次分频。
自动重装载寄存器ARR:CNT寄存器用于计数,而ARR寄存器用于设置计数器的初值和自动重载值。当CNT计数到ARR所设置的值时,定时器会触发中断或产生输出信号,然后自动重新加载ARR的值,使计数器重新开始计数。通过不断重复这个过程,就可以实现定时器的功能。

3.通用定时器结构

在这里插入图片描述
通用定时器的结构大致可以分为三部分,即输入时钟部分核心计数器部分输入捕获部分
(1)输入时钟
通用定时器的时钟可以来自于 AHB 总线时钟(CK_INT)即72MHZ,还可以来自外部时钟输入引脚(TIMx_ETR),可以来自于其他具有时钟输出功能的定时器(ITRx),还可以来自于比较捕获通道的输入端(TIMx_CHx)
这些输入的时钟信号经过各种设定的滤波分频等操作后成为 CK_PSC 时钟,输出给核心计数器部分。另外,这些复杂的时钟来源还可以作为 TRGO 输出给其他的定时器、ADC 和 DAC 等外设。
(2)核心计数器
通用定时器支持向上计数、向下计数、中央对齐三种计数方式,
向上计数(Up-Counting)是指计数器从0开始递增计数,直到达到计数器最大值为止,然后重新从0开始递增计数。这种计数方式常用于定时器、计时器等场合。

向下计数(Down-Counting)是指计数器从最大值开始递减计数,直到计数器值为0为止,然后重新从最大值开始递减计数。这种计数方式常用于倒计时、计数器等场合。

中央对齐(Center-Aligned)是指计数器的计数方向既可以是向上计数,也可以是向下计数,同时计数器的计数值以及计数周期都是偶数。
(3)输入捕获和输出比较
通用定时器拥有四组比较捕获通道,每组比较捕获通道都可以从专属的引脚上输入脉冲,也可以向引脚输出波形,即比较捕获通道支持输入和输出模式。比较捕获寄存器每个通道的输入都支持滤波、分频、边沿检测等操作,并支持通道间的互触发,还能为核心计数器 CNT 提供时钟。每个比较捕获通道都拥有一组比较捕获寄存器(CHxCVR),支持与主计数器(CNT)进行比较而输出脉冲。
在这里插入图片描述

4.定时器中断结构

在这里插入图片描述
左边是输入时钟部分,核心是时基单元,即PSC、CNT和ARR,运行控制是指计数方式,如向上、向下计数,然后CNT计数产生中断,输出控制,给到NVIC中断线。
在这里插入图片描述
计数器计数频率:CK_CNT = CK_PSC / (PSC + 1)
计数器溢出频率:CK_CNT_OV = CK_CNT / (ARR + 1)
= CK_PSC / (PSC + 1) / (ARR + 1)
计数器溢出频率指的是计数器溢出的频率,也就是计数器从最大值溢出后重新从0开始计数的频率。例如,如果一个计数器的时钟频率为1MHz,自动重载寄存器的值为999(即计数器最大值为999),计数器时钟预分频器的时钟频率为10MHz,分频系数为9,那么该计数器的溢出频率为:

CK_CNT_OV = 1MHz / (999 + 1) = 1kHz

5.疑问

在这里插入图片描述
这里可以看到,系统时钟是144MHz,TIM2,3,4,5,6,7是挂载在APB1总线上的,那么中间这个红框是什么意思?
如果APB1总线预分频器的分频系数为1,那么定时器使用的时钟频率就是APB1总线的时钟频率,否则定时器使用的时钟频率就是APB1总线的时钟频率除以2。当APB1预分频系数为2时,系统时钟输出为72MHZ,但又要再乘以2,就又变为了144MHZ。
所以,对于定时器,他们的时钟频率就是系统时钟频率。

6.输出比较功能

比较输出模式是定时器的基本功能之一。比较输出模式的原理是在核心计数器(CNT)的值与比较捕获寄存器的值一致时,输出特定的变化或波形。OCxM 域(在 R16_TIMx_CHCTLRx 中)和 CCxP 位(在R16_TIMx_CCER 中)决定输出的是确定的高低电平还是电平翻转。产生比较一致事件时还会置CCxIF 位,如果预先置了 CCxIE 位,则会产生一个中断;如果预先设置了 CCxDE 位,则会产生一个 DMA请求。
配置为比较输出模式的步骤为下:
1) 配置核心计数器(CNT)的时钟源和自动重装值;
2) 设置好需要对比的计数值到比较捕获寄存器(R16_TIMx_CHxCVR)中;
3) 如果需要产生中断,置 CCxIE 位;
4) 保持 OCxPE 为 0,禁用比较捕获寄存器的预装载寄存器;
5) 设定输出模式,设置 OCxM 域和 CCxP 位;
6) 使能输出,置 CCxE 位;
7) 置 CEN 位启动定时器;

PWM 输出模式

PWM 输出模式是定时器的基本功能之一。PWM 输出模式最常见的是使用重装值确定 PWM 频率,使用捕获比较寄存器确定占空比的方法。将 OCxM 域中置 110b 或者 111b 使用 PWM 模式 1 或者模式 2,置 OCxPE 位使能预装载寄存器,最后置 ARPE 位使能预装载寄存器的自动重装载。在发生一个更新事件时,预装载寄存器的值才能被送到影子寄存器,所以在核心计数器开始计数之前,需要置 UG 位来初始化所有寄存器。在 PWM 模式下,核心计数器和比较捕获寄存器一直在进行比较,根据 CMS 位,定时器能够输出边沿对齐或者中央对齐的 PWM 信号。
边沿对齐
使用边沿对齐时,核心计数器增计数或者减计数,在 PWM 模式 1 的情景下,在核心计数器的值大于比较捕获寄存器时,OCxREF 上升为高;当核心计数器的值小于比较捕获寄存器时(比如核心计数器增长到 R16_TIMx_ATRLR 的值而恢复成全 0 时),OCxREF 下降为低。
中央对齐
使用中央对齐模式时,核心计数器运行在增计数和减计数交替进行的模式下,OCxREF 在核心计数器和比较捕获寄存器的值一致时进行上升和下降的跳变。但比较标志在三种中央对齐模式下,置位的时机有所不同。在使用中央对齐模式时,最好在启动核心计数器之前产生一个软件更新标志(置 UG
位)。

总结

这里对通用定时器进行了一个学习,我比较关注PWM输出功能,应该是TIM一个非常常用的功能了。

猜你喜欢

转载自blog.csdn.net/qq_53092944/article/details/130700464