STM32F1与STM32CubeIDE快速入门-定时器(Timer)概述

定时器(Timer)概述

在本文中,将介绍 STM32 微控制器中的 STM32 定时器模块。 STM32 微控制器中有不同的硬件定时器,每个定时器都可以在多种模式下运行并执行多种任务。 将了解这些不同的硬件变体及其应用用例。 本文将从计时器模式开始,其他模式将在稍后讨论。

在这里插入图片描述

1、定时器模块介绍

最基本形式的定时器模块是一个数字逻辑电路,它对每个时钟周期进行计数。 更多功能在硬件中实现以支持定时器模块,因此它可以向上或向下计数。 它可以有一个预分频器,将输入时钟频率除以一个可选值。 它还可以具有用于输入捕获、PWM 信号生成等的电路。

比如,一个基本的 16 位定时器,如下所示。 作为一个 16 位时间,它可以从 0 计数到 65535。每个时钟周期,定时器的值递增 1。正如你所看到的,Fsys 不是递增定时器模块的频率。 但它被预分频器除以,然后它被馈送到计时器。

在这里插入图片描述

在定时器模式下,TCNT 寄存器在每个时钟周期以频率(Fsys/PSC)递增 1。 这意味着如果 Fsys 为 80MHz 且 PSC 为 1:1024,则 TCNT 每 12.8μSec 增加 1。 因此,如果您启动此计时器从 0 开始计数直到溢出(在 65535),它将每 0.839 秒给您一个中断信号。

如果需要设置这个定时器每 1 秒给我一个中断信号怎么办? 事实上,不一定想要这个 0.839 秒的时间间隔,出于这个原因,存在一种称为预加载寄存器(Preload Register ),它强制定时器从任意选择的值开始计数直到溢出。 因此,不再需要从零开始计数,从而可以使用定时器模块获得任何时间间隔。

定时器模块也可以在时钟源未知的计数器模式下运行,它实际上是一个外部信号。 也许来自一个按钮,所以计数器在按钮按下时的每个上升沿或下降沿递增。 正如我们将在下文中讨论的那样,这种模式在许多应用中可能是有利的。 但是现在,请考虑下图。

在这里插入图片描述

可以看到,时钟信号现在由按钮驱动,并通过预分频器到达定时器时钟输入。 并且可以通过简单地读取 TCNT 寄存器的值来获取按钮按下次数的信息。

2、STM32定时器硬件

STMicroelectronics 为硬件定时器模块提供了一些不同的版本或变体。 STM32 微控制器通常每种类型都有少量,但是,某些部件可能缺少一个或多个这些硬件定时器。 因此,在本节中,将重点介绍这些计时器模块及其主要功能、框图等。

只是为了让概述 STM32 微控制器中不同的可用硬件定时器。 因此,可以更好地了解哪种类型适合哪种应用程序。 这反过来又可以帮助更好地为您的项目选择合适的 MCU 部件。

2.1 基本定时器模块

基本定时器由一个由可编程预分频器驱动的 16 位自动重载计数器组成。 它们可用作生成时基的通用定时器,但它们也专门用于驱动数模转换器 (DAC)。 事实上,定时器在内部连接到 DAC 并能够通过其触发输出驱动它。 定时器是完全独立的,不共享任何资源。

在这里插入图片描述

基本定时器功能包括:

  • 16 位自动重载递增计数器
  • 16 位可编程预分频器用于对计数器时钟频率进行分频(也“动态”)1 到65536之间的任何因子触发DAC的同步电路
  • 更新事件上的中断/DMA 生成:计数器溢出

可编程定时器的主要模块是一个带有相关自动重载寄存器的16位递增计数器。 计数器时钟可由预分频器分频。 计数器、自动重载寄存器和预分频器寄存器可由软件写入或读取。 即使在计数器运行时也是如此。 时基单位包括:

  • 计数器寄存器 (TIMx_CNT)
  • 预分频寄存器 (TIMx_PSC)
  • 自动重载寄存器 (TIMx_ARR)

自动重载寄存器是预加载的。 每次尝试写入或读取自动重载寄存器时,都会访问预加载寄存器。 预加载寄存器的内容永久地或在每次更新事件 UEV 时传输到影子寄存器中,具体取决于自动重加载预加载使能位 (ARPE)。

在计数器模式下,计数器从 0 计数到自动重载值(TIMx_ARR 寄存器的内容),然后从 0 重新开始并产生计数器溢出事件。 可以在每次计数器溢出时或通过设置 TIMx_EGR 寄存器中的 UG 位(通过软件或使用从模式控制器)生成更新事件。

2.2 低功耗定时器模块

LPTIM 是一个 16 位定时器,受益于降低功耗的最终发展。 由于其时钟源的多样性,LPTIM 能够在除待机模式之外的所有功耗模式下保持运行。 鉴于即使没有内部时钟源也能运行,LPTIM 可用作“脉冲计数器”,这在某些应用中很有用。

此外,LPTIM 能够将系统从低功耗模式唤醒,因此适合以极低的功耗实现“超时功能”。 LPTIM 引入了一种灵活的时钟方案,可提供所需的功能和性能,同时最大限度地降低功耗。

在这里插入图片描述

低功耗定时器 (LPTIM) 的主要特点:

  • 16 位加计数器
  • 具有 8 个可能的分频因子 (1,2,4,8,16,32,64,128) 的 3 位预分频器
  • 可选择的时钟
    • – 内部时钟源:LSE、LSI、HSI16 或 APB 时钟
    • – LPTIM 输入上的外部时钟源(在没有 LP 振荡器运行的情况下工作,由脉冲计数器应用程序使用)
  • 16 位 ARR 自动重载寄存器
  • 16位比较寄存器
  • 连拍/单拍模式
  • 可选择的软件/硬件输入触发
  • 可编程数字毛刺滤波器
  • 可配置输出:脉冲、PWM
  • 可配置的 I/O 极性
  • 编码器模式
  • 重复计数器

2.3 通用定时器模块

通用定时器由一个由可编程预分频器驱动的 16 位自动重载计数器组成。 它们可用于多种用途,包括测量输入信号的脉冲长度(输入捕获)或生成输出波形(输出比较和 PWM)。 脉冲长度和波形周期可以使用定时器预分频器和 RCC 时钟控制器预分频器从几微秒到几毫秒进行调制。 定时器是完全独立的,不共享任何资源。 它们也可以同步在一起。

在这里插入图片描述

通用 TIMx 定时器功能包括:

  • 16 位向上、向下、向上/向下自动重载计数器。
  • 16 位可编程预分频器用于对计数器时钟频率进行分频(也“动态”)1 到 65536 之间的任何因子。
  • 多达 4 个独立通道,用于:
    • – 输入捕获
    • – 输出比较
    • – PWM 生成(边沿和中心对齐模式)
    • – 单脉冲模式输出
  • 用外部信号控制定时器并互连多个定时器的同步电路。
  • 以下事件的中断/DMA 生成:
    • – 更新:计数器上溢/下溢、计数器初始化(通过软件或内部/外部触发)
    • – 触发事件(计数器启动、停止、初始化或由内部/外部触发计数)
    • – 输入捕获
    • – 输出比较
  • 支持用于定位目的的增量(正交)编码器和霍尔传感器电路
  • 外部时钟或逐周期电流管理的触发输入

2.4 高级控制定时器模块

高级控制定时器由一个由可编程预分频器驱动的 16 位自动重载计数器组成。 它可用于多种用途,包括测量输入信号的脉冲长度(输入捕获),或生成输出波形(输出比较、PWM、带死区插入的互补 PWM)。 脉冲长度和波形周期可以使用定时器预分频器和 RCC 时钟控制器预分频器从几微秒到几毫秒进行调制。 高级控制定时器和通用定时器是完全独立的,不共享任何资源。 它们也可以同步在一起。

在这里插入图片描述

高级控制定时器功能:

  • 16 位向上、向下、向上/向下自动重载计数器。
  • 16 位可编程预分频器允许按 1 到 65536 之间的任何因子对计数器时钟频率进行分频(也可以“动态”分频)。
  • 多达 4 个独立通道,用于:
    • – 输入捕捉
    • – 输出比较
    • – PWM 生成(边沿和中心对齐模式)
    • – 单脉冲模式输出
  • 具有可编程死区时间的互补输出
  • 用外部信号控制定时器并将多个定时器互连在一起的同步电路。
  • 重复计数器仅在计数器的给定周期数后更新定时器寄存器。
  • 中断输入将定时器的输出信号置于复位状态或已知状态。
  • 以下事件的中断/DMA 生成:
    • – 更新:计数器上溢/下溢、计数器初始化(通过软件或内部/外部触发)
    • – 触发事件(计数器启动、停止、初始化或由内部/外部触发计数)
    • – 输入捕获
    • – 输出比较
    • – 中断输入
  • 支持用于定位目的的增量(正交)编码器和霍尔传感器电路
  • 外部时钟或逐周期电流管理的触发输入

2.5 高分辨率定时器模块

高分辨率定时器可以生成多达 10 个具有高精度计时的数字信号。 它主要用于驱动电源转换系统,例如开关模式电源或照明系统,但也可用于通用用途,只要需要非常精细的时序分辨率(高达 217pSec)。

出于控制和监视目的,定时器还具有计时测量功能并链接到内置 ADC 和 DAC 转换器。 最后,它具有轻负载管理模式,能够处理各种故障方案以实现安全关闭。

在这里插入图片描述

高分辨率定时器 (HRTIM) 功能包括:

  • 高分辨率计时单元
    • – 217 ps 分辨率,补偿电压和温度变化
    • – 所有输出都具有高分辨率,可以在触发的单脉冲模式下调整占空比、频率和脉冲宽度
    • – 6 个 16 位计时单元(每个都有一个独立的计数器和 4 个比较单元)
    • – 10 个输出,可由任何计时单元控制,每个通道多达 32 个设置/复位源
    • – 模块化架构,可处理具有 1 个或 2 个开关的多个独立转换器或少数大型多开关拓扑
  • 到内置模拟外设的多个链接
    • – ADC 转换器的 4 个触发器
    • – DAC 转换器的 3 个触发器
    • – 3 个用于模拟信号调节的比较器
  • 多个 HRTIM 实例可以与外部同步输入/输出同步
  • 多功能输出级
    • – 高分辨率死区插入(低至 868 pSec)
    • – 可编程输出极性
    • – 斩波模式
  • 突发模式控制器可在多个转换器上同步处理轻负载操作
  • 7 个中断向量,每个中断向量最多 14 个源
  • 6 个 DMA 请求,多达 14 个源,具有用于多个寄存器更新的突发模式

3、STM32 定时器操作模式

STM32 定时器模块可以在以下任何一种模式下运行,但是,不应假设给定的定时器确实支持所有这些模式。 相反,必须查看数据表以确定哪些定时器支持哪些模式。 正如我们之前看到的,有许多组定时器,其中包括:通用、低功耗、高分辨率、高级控制定时器。 每一种都支持以下多种模式,但是,有些定时器确实支持大多数操作模式。下面将简要介绍每种操作模式。

3.1 定时器模式

在定时器模式下,定时器模块从具有已知频率的内部时钟源获得时钟。 因此时钟频率是已知的,溢出时间也可以由预加载寄存器计算和控制以获得任意选择的时间间隔。 每次定时器溢出时,定时器都会向 CPU 发出一个中断信号,指示指定的时间间隔结束。

这种操作模式通常用于在每个特定时间间隔完成特定操作。 并实现系统中各种任务和事件之间的计时和同步。 它还可以替代各种情况下的延迟,以获得更好的系统响应。

在这里插入图片描述

3.2 计数器模式

在计数器模式下,定时器模块从外部源(定时器输入引脚)获得时钟。 因此定时器在外部输入的每个上升沿或下降沿向上或向下计数。 当需要在不轮询输入引脚或定期读取 GPIO 或连续中断 CPU(如果选择将其连接到 EXTI 引脚)的情况下实现数字计数器时,这种模式在许多情况下非常有用。

实际上可以监视每个时间间隔的计数器值差异,以了解确实发生了多少个脉冲或其频率。 这种模式在很多情况下都是有利的。

3.3 PWM模式

在 PWM 模式下,定时器模块由内部时钟源提供时钟,并在输出通道引脚上产生称为 PWM 信号的数字波形。 通过使用输出比较寄存器 (OCR),递增定时器的寄存器值不断与该 OCR 寄存器进行比较。 当匹配发生时,输出引脚状态翻转,直到周期结束,整个过程重复。

PWM 模式下的定时器将以用户选择的指定频率产生 PWM 信号。 占空比也由其寄存器以编程方式控制。 PWM 分辨率受所需 FPWM 和其他因素的影响,将在后面 PWM 生成的专门实例中看到。

在这里插入图片描述

3.4 高级PWM模式

高级 PWM 信号生成是指控制更多参数的硬件能力,并添加一些硬件电路来支持 PWM 信号生成的额外功能。 包括:

  • 产生互补 PWM 信号的能力,该信号通常与主通道上的 PWM 相同,但逻辑反转(高部分变为低部分,反之亦然)。
  • 能够在 PWM 信号中为电机驱动应用注入死区,以防止 PWM 信号重叠导致的直通电流。
  • 能够对 PWM 信号执行自动关闭,也称为“自动制动”,这是安全关键应用的重要功能。
  • 以及对 PWM 信号进行相位调整的能力,等等! 所有这些都被称为高级 PWM 控制。

以下是具有互补波形输出、插入死区和相位延迟调整的 PWM 通道示例。 半桥模式下的典型控制信号。

在这里插入图片描述

3.5 输出比较模式

在输出比较模式下,定时器模块控制输出波形或指示时间段何时过去。 当检测到输出比较寄存器 (OCR) 与计数器匹配时,输出比较功能会将相应的输出引脚分配给由输出定义的可编程值
由程序员定义的比较模式。

输出比较引脚可以被驱动为高电平、低电平、切换其状态或保持不变。 这是由程序员根据应用程序要求确定的。 这种操作模式对于在许多应用中生成时序信号和输出驱动非常有利,我们将在以后的实例中看到。

以下是输出比较模式下计数定时器的示例。 注意输出状态何时改变(切换)和 OCR 中的值(比较寄存器 TIM1_CCR1)。

在这里插入图片描述

3.6 单脉冲模式

单脉冲模式 (OPM) 是先前模式的一种特殊情况。 它允许计数器响应激励而启动,并在可编程延迟后生成具有可编程长度的脉冲。 启动计数器可以通过从模式控制器来控制。 可以在输出比较模式或 PWM 模式下生成波形。

只有当比较值与计数器初始值不同时,才能正确产生脉冲。 启动前(定时器等待触发时),配置必须是CNT<CCRx ≤ ARR(特别是0<CCRx)。 例如,希望在 TI2 输入引脚上检测到上升沿后立即在 OC1 上生成一个长度为 tPULSE 的正脉冲,并在 tDELAY 延迟之后生成。

3.7 输入捕捉模式

在输入捕捉模式下,捕捉/比较寄存器(TIMx_CCRx)用于在相应的 ICx 信号检测到转换后锁存计数器的值。 发生捕捉时,相应的 CCXIF 标志(TIMx_SR 寄存器)被设置,如果使能,则可以发送中断或 DMA 请求。

该模式对于外部信号测量或外部事件时序检测极为重要。 当外部事件发生并触发中断时,定时器计数的当前值被捕获。 因此,我们可以将此功能用于广泛的测量应用。

一个典型的应用示例是超声波传感器,它测量距离并将信息作为脉冲发送到您的微控制器。 通过测量脉宽时间,可以找出距离读数。 这可以通过使用定时器模块内的输入捕捉单元 (ICU) 来实现。

3.8 编码器模式

在编码器接口模式下,定时器模块作为具有两个输入的数字计数器运行。计数器由两个输入引脚上的每个有效转换计时。评估两个输入的转换序列并生成计数脉冲以及方向信号。根据顺序,计数器向上或向下计数。所以你不必单独检测这些脉冲,看看哪个先检测旋转方向和这种工作。现在,由于编码器模式硬件支持,所有这些都由硬件完成。

在编码器接口模式下配置的定时器提供有关传感器当前位置的信息。用户可以通过使用在捕获模式下配置的第二个定时器测量两个编码器事件之间的周期来获取动态信息(速度、加速度、减速度)。指示机械零位的编码器输出可用于此目的。根据两个事件之间的时间,也可以定期读取计数器。

在这里插入图片描述

3.9 定时门模式

在定时器门控模式下,定时器模块也被称为在“从模式”下工作。 只要外部输入引脚保持高电平或低电平,它就会计数。 据说这个输入引脚是允许定时器计数或根本不计数的定时器门。

该模式可用于广泛的应用和信号测量。 它可以帮助您以非常高的分辨率测量极短的脉冲。 并且还触发计时器以对来自传感器或其他 MCU 的外部事件进行计数。

只要 TI1 为低,计数器就开始使用内部时钟计数,并在 TI1 变为高时停止。 TIMx_SR 寄存器中的 TIF 标志在计数器启动或停止时都会设置。 TI1 上的上升沿和计数器实际停止之间的延迟是由于 TI1 输入上的再同步电路造成的。

在这里插入图片描述

3.10 定时器 DMA 突发模式

STM32 定时器(并非所有定时器)都能够根据单个事件生成多个 DMA 请求。 主要目的是能够在没有软件开销的情况下多次重新编程定时器的一部分,但它也可以用于定期读取连续的多个寄存器。

3.11 IRTIM 红外模式

用于远程控制的红外接口 (IRTIM) 可与红外 LED 一起使用以执行远程控制功能。 它使用与 TIM15 和 TIM16 的内部连接,如下图所示。 要生成红外遥控信号,必须启用红外接口,并且必须正确配置 TIM15 通道 1 (TIM15_OC1) 和 TIM16 通道 1 (TIM16_OC1) 以生成正确的波形。 红外接收器可以通过基本的输入捕获模式轻松实现。

在这里插入图片描述

文章来源: https://iotsmart.blog.csdn.net/article/details/123268617