目录:

1.定时器介绍

2.基本定时器

3.基本定时器(定时点灯)

4.通用定时器

5.通用定时器(配置过程)

6.PWM输出

一.定时器介绍

使用精准的时基,通过硬件的方式,实现定时功能。其核心是计数器。

STM32 定时器分为基本定时器、通用定时器和高级定时器,它们功能各有侧重,适用于不同的应用场景。
① 基本定时器
 特点

只有计数功能,没有输入捕获和输出比较功能,结构简单,常用于基础时间基准的生成。
 应用场景

实现简单的定时、提供DAC的转换触发信号。
② 通用定时器


 特点

功能较为灵活,支持输入捕获、输出比较、PWM 等功能,既可以用作普通的时间计时器,也可以处理外部信号
 应用场景
外部信号捕获、PWM信号生成(电机控制、屏幕背光控制等)。
【省】③ 高级定时器
 特点

功能最为强大,除了通用定时器的所有功能外,还支持专门的功能(如死区时间控制和刹车机制),专为复杂控制任务设计,如电机控制。
 应用场景

专用于电机控制、复杂的功率信号生成,尤其是需要安全机制(刹车)和高精度 PWM 的应用

二.基本定时器

STM32F4XX系列的基本定时器有TIM6和TIM7【具备的功能:生成时基(定时),驱动数模转换器(DAC)】

TIM6和TIM7简介:

里面包含了16位自动重载计数器(递增计数器),该计数器由可编程预分频器驱动(16位可编程预分频器,用于对计数器时钟频率进行分频(即运行时修改),分频系数介于1~65536),不仅可以生成时基,还可以用于驱动数模转换器(DAC)(DAC的同步电路),通过触发输出驱动DAC且二者独立。时钟源(内部时钟CK——INT)TIM6和TIM7的时钟源来源于APB1总线。

定时器结构细分:

预分频器(PSC):
负责对定时器输入时钟进行分频,它的主要作用是通过降低定时器的输入时钟频率,为定时器的计时和定时功能提供更灵活的时间控制。TIMx_PSC寄存器是定时器的预分频器寄存器,用于设置定时器的预分频因子,分频因子决定了定时器的时钟频率。需要注意的是实际的分频值是TIMx_PSC+1,例如,当TIMx_PSC寄存器的值为0时,实际的分频因子的大小为 0 + 1 = 1。

由于TIMx_PSC控制器有缓冲区,因此可对预分频器(PSC)进行修改。新的预分频要在下一个更新事件发生时被采用(发生UEV事件)。

UEV事件:TIMx_ARR是自动重装载器的重装载值寄存器,当TIMx_CNT寄存器等于TIMx_ARR寄存器时,计数器上溢,TIMx_CNT寄存器的值自动重置为 0,同时产生一个UEV更新信号。或手动产生(将TIMx_EGR.UG位写1)。

产生UEV事件的信号来源是否可以产生一个UEV的更新事件,取决于TIMx_CR1.UDIS位域。
TIMx_CR1.UDIS为0时,允许产生更新事件; TIMx_CR1.UDIS为1时,则禁止产生UEV事件。

二分频和四分频:

计数器:
计数器通过对输入时钟(由预分频器分频后的时钟信号),记录经过的时间。计数器的计数模式有三种,递增计数、递减计数、中央对齐计数,但是,基本定时器仅支持递增模式。
TIMx_CNT寄存器是计数寄存器,用于存储定时器的计数值。

计数器由预分频器输出CK_CNT提供时钟,仅当TIMx_CR1寄存器中的计数器启动位(CEN)置1时,才会启动计数器。
请注意,实际的计数器使能信号CNT_EN在CEN置1的一个时钟周期后被置1
 
计数器从0计数到自动重载值(TIMx_ARR寄存器的内容),然后重新从0开始计数并生成计数器上溢事件。

自动重载寄存器:
控制计数器的最大计数值,从而影响定时器的溢出时间和功能行为。
 
TIMx_ARR是自动重载器的重载值寄存器,当TIMx_CNT寄存器等于TIMx_ARR寄存器时,计数器上溢,TIMx_CNT寄存器的值自动重置为0,同时产生一个UEV更新信号。
 
自动重载寄存器是预装载的。每次尝试对自动重载寄存器执行读写操作时,都会访问预装载寄存器。预装载寄存器的内容既可以直接传送到影子寄存器也可以在每次发生更新事件UEV时传送到影子寄存器,这取决于 TIMx_CR1 寄存器中的自动重载预装载使能位 (ARPE)【为零时立即更新】。当计数器达到上溢值并且 TIMx_CR1 寄存器中的 UDIS 位为 0 时,将发送更新事件。该更新事件也可由软件产生。下文将针对各配置的更新事件的产生进行详细介绍。

- 单脉冲模式选择(取决于 TIMx_CR1.OPM 位域):

-  0 :计数器在发生更新事件时不会停止计数

-  1 :计数器在发生下一更新事件时停止计数(将CEN位清零)

- 更新中断和DMA请求:
生成更新中断和DMA请求的两种情况(取决于 TIMx_CR1.URS 位域):
 
 TIMx_CR1.URS 设置为1时:
只有计数器上溢( TIMx_CNT 寄存器值== TIMx_ARR 寄存器值),会生成更新中断和DMA请求。
 
 TIMx_CR1.URS 设置为0时:
所有以下事件都会生成更新中断或DMA请求。此类事件包括:
 
- 计数器上溢 ( TIMx_CNT 寄存器值== TIMx_ARR 寄存器值)

- 将UG位置1

- 通过从模式控制器生成的更新事件

三.基本定时器(定时点灯)

流程图:

1.配置引脚

始终保持默认(16MHZ)

2.核心代码

不要忘记加头文件#include "stdio.h"

四.通用定时器

通用定时器-介绍
 
STM32F4xx系列的通用定时器有10个:
 
15 通用定时器(TIM2到TIM5)
16 通用定时器(TIM9到TIM14)
 
通用定时器的TIM2到TIM5:
 
TIM2到TIM5简介
通用定时器包含一个 16 位或 32 位自动重载计数器,该计数器由可编程预分频器驱动。它们可用于多种用途,包括测量输入信号的脉冲宽度(输入捕获)或生成输出波形(输出比较和 PWM)


使用定时器预分频器和 RCC 时钟控制器预分频器,可将脉冲宽度和波形周期从几微秒调制到几毫秒。

这些定时器彼此完全独立,不共享任何资源。

TIM2 到 TIM5 主要特性
 
通用 TIMx 定时器具有以下特性:
 
- 16 位(TIM3 和 TIM4)或 32 位(TIM2 和 TIM5)递增、递减和递增/递减自动重载计数器。

- 16 位可编程预分频器,用于对计数器时钟频率进行分频(即运行时修改),分频系数介于 1 到 65536 之间。

- 多达 4 个独立通道,可用于:

- 输入捕获

- 输出比较

- PWM 生成(边沿和中心对齐模式)

- 单脉冲模式输出

- 使用外部信号控制定时器且可实现多个定时器互连的同步电路。

- 发生如下事件时生成中断/DMA 请求:

- 更新:计数器上溢/下溢、计数器初始化(通过软件或内部/外部触发)

- 触发事件(计数器启动、停止、初始化或通过内部/外部触发计数)

- 输入捕获

- 输出比较

- 支持定位用增量(正交)编码器和霍尔传感器电路

- 外部时钟触发输入或逐周期电流管理

1. 时钟源选择(左上角)

定时器的计数时钟(CK_PSC)可以来自多个源:

· 内部时钟(CK_INT):来自 RCC 的 TIMxCLK,通常是 APB 总线时钟。
· 外部时钟模式2:通过 TIMx_ETR 引脚输入,经过极性和边沿检测、预分频器、输入滤波器后进入。
· 外部时钟模式1:来自 ITR0~ITR3(其他定时器的触发输出)或 TIIF_ED【它最特别的地方是:它不关心是上升沿还是下降沿,只要检测到任意一个边沿(即电平变化),就会产生一个脉冲。】(来自通道1的边沿检测)。
· 编码器接口:用于连接正交编码器,自动控制计数方向。

这些信号通过触发控制器和从模式控制,最终产生 CK_PSC 送入 预分频器(PSC)。

---

2. 预分频器(PSC)与计数器(CNT)

· CK_PSC 经 PSC 分频后得到 CK_CNT,驱动 16位/32位计数器 CNT。
· 计数器可以向上、向下或中心对齐计数。
· 自动重载寄存器(ARR)保存计数上限,当 CNT 达到 ARR 时触发更新事件(U)。

---

3. 触发控制器(TRGO)

· 可以产生触发输出(TRGO),送给其它定时器、DAC 或 ADC,实现同步或级联。
· 触发源可以是:复位、使能、更新事件、边沿信号等。TRGO 是定时器向外部输出的一个触发信号,全称 Trigger Output。它的作用是:让这个定时器去同步或触发其他外设,比如另一个定时器、ADC或DAC。

常见的 TRGO 信号源

通过配置寄存器,你可以让 TRGO 在以下几种情况下产生脉冲:

1. 复位 (Reset):当定时器计数器被复位时(例如从模式接收到复位信号)。
2. 使能 (Enable):当定时器被使能开始计数时。
3. 更新 (Update):当计数器溢出并重新从0开始计数时(即一个完整的PWM周期结束时)。这是最常用的模式,相当于输出一个"节拍"。
4. 比较匹配 (Compare):当某个通道的输出比较匹配成功时(例如 CC1 事件)。
   · 如图中所示,OC1REF 可作为 TRGO 的来源。
5. 边沿检测:当检测到某个输入引脚(如 TI1)有边沿变化时。

TRGO 的典型应用

1. 同步多个定时器(形成主从结构)

这是最经典的应用。比如需要两个定时器输出完全同步的PWM波,或者一个定时器作为另一个的预分频器。

· 主定时器:配置 TRGO 输出为"更新事件"(即每次溢出都触发)。
· 从定时器:配置为"外部时钟模式1"或"触发模式",输入源选择对应的 ITRx(内部触发输入),ITR 信号内部就是连接其他定时器的 TRGO 的。

效果:主定时器每溢出一次,TRGO 输出一个脉冲,从定时器收到这个脉冲后,计数器就加一(或开始计数)。这样就实现了两个定时器的级联,可以延长定时范围或产生更复杂的时序。

2. 触发ADC/DAC进行精确转换

这常用于电机控制或开关电源。比如,在PWM周期的特定时刻(如电流采样点),需要立即启动ADC进行采样。

· 定时器:配置某个通道的输出比较(OC4REF)作为 TRGO 的源。当CNT达到CCR4时,TRGO 输出脉冲。
· ADC:配置为外部触发转换模式,触发源选择为该定时器的 TRGO。

效果:PWM波形输出的同时,硬件在指定时刻自动触发ADC,无需CPU干预,采样点非常精准。

---

4. 输入捕获与输出比较通道(右边 1/2/3/4)后面会详细讲解PWM的例子

图片右侧有 4 个独立的通道(OC1~OC4):

· 输入捕获:通过 TI1FP1/2 等信号,记录外部事件时 CNT 的值。
· 输出比较:当 CNT 与比较寄存器匹配时,控制输出引脚(OC1)输出高低电平或 PWM 波形。
· 每个通道都有输入滤波、极性选择、边沿检测、预分频器,以及输出控制单元(极性、使能、PWM 模式等)。

我们来详细拆解通用定时器中输入捕获和输出比较通道的工作原理。图中每个通道(如通道1)的结构基本相同,但信号路径不同。

为方便理解,先区分两个关键信号:

· TIx:来自外部引脚(如TIMx_CH1)的原始输入信号。
· OCx:连接到外部引脚(如TIMx_CH1)的输出信号。

一个通道不能同时做输入捕获和输出比较,但可以通过寄存器配置切换功能。

---

一、输入捕获模式

目标:检测外部信号(如PWM、脉冲)的边沿,并记录下该时刻计数器的值(CNT),用于测量频率、脉宽等。

信号路径(以通道1为例):

1. 输入引脚 → TI1
2. 输入滤波器:可设置采样频率和次数,滤除高频抖动。
3. 边沿检测与极性选择:选择上升沿、下降沿或双边沿触发。
4. 输入预分频器:可设置为每1、2、4、8个事件才捕获一次,避免过快中断。
5. 捕获寄存器(CCR1):当有效边沿到来时,自动将当前 CNT 的值存入 CCR1。
6. 中断/DMA:触发捕获中断或DMA请求。

典型应用:

· 测量PWM周期与高电平时间:一个通道捕获上升沿(记录周期开始),另一个通道捕获下降沿(记录高电平结束),或同一通道切换边沿。
· 测量信号频率:连续两次上升沿的 CNT 差值 × 时钟周期 = 信号周期。

---

二、输出比较模式

目标:当计数器 CNT 与比较寄存器 CCR 匹配时,控制输出引脚产生电平翻转、置高、置低或PWM波形。

信号路径(以通道1为例):

1. 设置比较值:写入 CCR1 寄存器。
2. 比较器:连续比较 CNT 与 CCR1。
3. 输出控制单元:根据比较结果和输出模式(PWM、强制输出、翻转等),生成中间信号 OC1REF。
4. 极性选择:最终输出 OC1 可以取反(高/低有效)。
5. 输出使能:控制引脚是否输出,还是复用为其它功能。

常见输出模式:

· PWM模式1/2:向上计数时,CNT < CCR 输出有效电平,否则无效电平,生成PWM波。
· 强制输出:忽略比较,直接固定为高或低。
· 翻转模式:每次匹配时翻转输出电平,可生成对称方波。

典型应用:

· 生成PWM波:占空比 = CCR / ARR,频率 = 时钟 / (PSC+1) / (ARR+1)。
· 输出单脉冲:配合从模式,在匹配时清零计数器,产生一个指定宽度的脉冲。
· 定时触发:匹配时触发中断或DMA,或从模式输出信号(TRGO)。

---

三、多通道的协作

· 最多4个通道:可同时用于不同任务,如通道1、2做输入捕获测量PWM,通道3做PWM输出。
· TI1FP1与TI1FP2:同一个引脚(TI1)的信号可以同时给通道1和通道2使用,但通道2需要配置边沿选择(比如TI1上升沿给通道1捕获周期,下降沿给通道2捕获脉宽)。
· 输出比较与输入捕获互斥:同一个通道不能同时做输入和输出,但不同通道之间独立。

---

四、图上小细节解读

· TI1F_ED:来自通道1的边沿检测信号(不分上升/下降),可作为触发控制器的源(比如复位计数器)。
· OC1REF:输出比较的参考信号(未极性处理前),实际引脚电平由 CCER 寄存器的极性位控制。
· 预分频器:在捕获输入路径上,减少捕获事件频率,避免CPU过载。
· 滤波器:可消除引脚上的毛刺,需设置采样频率和有效连续采样次数。

---

---

5. 编码器接口

· (了解)专门用于处理来自 A/B 相编码器的信号,自动增减 CNT,节省软件开销。

1. 硬件自动根据A、B两相脉冲的相位关系(谁先谁后)

· 背景:编码器旋转时,会输出A、B两路方波信号,这两路信号形状一样,但存在90°的相位差。
· 谁先谁后:旋转方向不同,这个90°的相位差方向就不同。
  · 正转:A相 领先 B相 90°。意思是,当A相从0跳变到1(上升沿)时,B相此时还是0。
  · 反转:A相 滞后 B相 90°。意思是,当A相从0跳变到1(上升沿)时,B相此时已经是1。
· 硬件怎么检测:编码器接口会同时盯着A和B的信号。它通过一个简单的逻辑来判断:当某一边沿发生时,看另一个信号是0还是1。

2. 直接得出旋转的方向和速度

· 得出方向:根据上面“谁先谁后”的规则,硬件在每检测到一个边沿时,就能立刻、肯定地知道电机是正转还是反转。这完全由硬件逻辑门电路完成,速度极快。
· 得出速度:速度信息体现在边沿产生的快慢上。转得越快,A、B信号的边沿就出现得越密集。硬件虽然不直接输出“每秒100转”这样的数值,但它通过产生计数脉冲的频率告诉了你速度。

3. 并自动更新计数器的值

这是最关键的动作。硬件得出方向后,会直接去控制计数器:

· 如果正转:每来一个有效的边沿,硬件就让计数器 CNT = CNT + 1(递增)。
· 如果反转:每来一个有效的边沿,硬件就让计数器 CNT = CNT - 1(递减)。

举个最直观的例子

想象一个音量旋钮(编码器),你顺时针拧(正转):

1. 动作:A相信号领先。
2. 硬件:检测到这个相位关系。
3. 结果:硬件将计数器 CNT 从 100 变成 101,再变成 102……
4. 软件视角:CPU 只需要每隔一段时间去读一下 CNT 的值。它发现 CNT 从 100 涨到了 120。CPU 立刻就知道:“哦,旋钮被顺时针拧了20格,我要把音量调大20个单位。”

总结

这句话的核心就是告诉你:这个苦活、累活、要求反应极快的活(解码A/B信号并换算成位置),已经被定时器的编码器接口硬件全包了。

软件(CPU)根本不用去管A、B信号谁先谁后、现在是上升沿还是下降沿,它只需要最后去 “看一眼” 计数器 CNT 这个最终结果就行了。这极大地简化了程序,并提高了响应速度。

---

6. 注意点(图片底部)

· 通常提醒:不同定时器(如 TIM2~TIM5 与 TIM1/8 高级定时器)的框图细节略有差异,比如刹车、互补输出等只在高级定时器中存在。

五.通用定时器(配置过程)

六.PWM输出

认识PWM:简称脉冲宽度调制,是利用微处理器的数字输出来对模拟电路进行控制的。

基本知识:

PWM的频率就是1秒钟内信号从高到低再到高,就是1秒钟有多少个周期。

占空比是高电平占整个周期时间的比例单位%

模拟图:

由于在同一个通道不能同时输入与输出。所以:

芯片说明书(参考):

注意:PWM的两个模式。

画红圈的地方是要求三者为一时才回去更新影子寄存器。条件为:

注意:CC1P处的TIMx_CCER位的高低电平,高电平是走上面的0的路,低电平时走下面的路。

PWM中断:

当 TIMx_CNT = TIMx_CCR1 时,TIMx_SR 寄存器“捕获/比较中断标志(CC1IF)”置 1,如果 CC1 中断使能还会触发捕获/比较中断。

当计数器发生溢出时,如果 TIMx_CR1 寄存器 UDIS 为 0 允许 UEV 更新,“更新中断标志(UIF)”置 1,如果 UE 中断使能还会触发更新中断。

状态标志 中断控制 状态名称 含义
CCxF CCxIE 捕获/比较x中断标志 决定PWM占空比
UIF UIE 更新中断标志 决定PWM频率

七.PWM风扇控制

流程图:

配置引脚:

未显示的保持默认:

时钟16MHZ

核心代码:

解释:第一行代码是比较用的(计数器的数与比较寄存器的数比较)三个参数分别是时钟器3和输出通道,占空比。

八.通用定时器之输入脉宽捕获原理

一般来说是递增计数。

1.捕获事件可以有两种产生方式:1.通过软件产生,将CCxG位置1,软件生成捕获事件,2.硬件产生,当输入通道检测到与设置的极性相同的边沿时。

2.捕获影子寄存器的值更新到捕获寄存器,需要同时满足2个条件:1.没有正在读捕获寄存器、2.当前通道模式为输入模式。

输入中断:

当CH通道发生输入捕获时“捕获/比较标志CC1IF”会置1,如果CC1中断使能还会触发捕获/比较中断。
当计数器发生溢出时,如果TIMx_CR1寄存器UDIS为0允许UEV更新,“更新中断标志(UIF)”置1,如果UIE中断使能还会触发更新中断。

状态标志 中断控制 状态名称 含义
CCxF CCxIE 捕获/比较x中断标志 发生捕获事件
UIF UIE 更新中断标志 计数器溢出

可以再中断中去处理一些事件。

九.脉宽捕获

流程图:

配置引脚:

注意:不是Rising Edge而是Faling Edge.

时钟16MHZ。

串口打开(USART6)

核心代码:

括:查看次数

十.通用定时器之输入脉冲计数

从模式:

1.从模式:复位模式
 
当触发输入信号发生变化时,计数器及其预分频器可重新初始化。此外,如果 TIMx_CR1 寄存器中的 URS 位处于低电平,则会生成更新事件 UEV。然后,所有预装载寄存器(TIMx_ARR 和 TIMx_CCRx)都将更新。
 
在以下示例中,TI1 输入上出现上升沿时,递增计数器清零:
 
- 将通道 1 配置为检测 TI1 的上升沿。配置输入滤波时间(本例中不需要任何滤波,因此保持 IC1F=0000)。由于捕获预分频器不用于触发操作,因此无需对其进行配置。CC1S 位只选择输入捕获源,即 TIMx_CCMR1 寄存器中的 CC1S = 01。在 TIMx_CCER 寄存器中写入 CC1P=0 和 CC1NP=0,验证极性(仅检测上升沿)。

- 在 TIMx_SMCR 寄存器中写入 SMS=100,将定时器配置为复位模式。在 TIMx_SMCR 寄存器中写入 TS=101,选择 TI1 作为输入源。

- 在 TIMx_CR1 寄存器中写入 CEN=1,启动计数器。
 
计数器使用内部时钟计数,然后正常运转,直到出现 TI1 上升沿。当 TI1 出现上升沿时,计数器清零,然后重新从 0 开始计数。同时,触发标志(TIMx_SR 寄存器中的 TIF 位)置 1,使能中断或 DMA 后,还可发送中断或 DMA 请求(取决于 TIMx_DIER 寄存器中的 TIE 和 TDE 位)。

2.从模式:门控模式
 
输入信号的电平可用来使能计数器。
 
在以下示例中,递增计数器仅在 TI1 输入为低电平时计数:
 
- 将通道 1 配置为检测 TI1 上的低电平。配置输入滤波时间(本例中不需要任何滤波,因此保持 IC1F=0000)。由于捕获预分频器不用于触发操作,因此无需对其进行配置。CC1S 位只选择输入捕获源,即 TIMx_CCMR1 寄存器中的 CC1S=01。在 TIMx_CCER 寄存器中写入 CC1P=1,以确定极性(仅检测低电平)。

- 在 TIMx_SMCR 寄存器中写入 SMS=101,将定时器配置为门控模式。在 TIMx_SMCR 寄存器中写入 TS=101,选择 TI1 作为输入源。

- 在 TIMx_CR1 寄存器中写入 CEN=1,使能计数器(在门控模式下,如果 CEN=0,则无论触发输入电平如何,计数器都不启动)。
 
只要 TI1 为低电平,计数器就开始根据内部时钟计数,直到 TI1 变为高电平时停止计数。计数器启动或停止时,TIMx_SR 寄存器中的 TIF 标志都会置 1。

3.从模式:触发模式

所选输入上发生某一事件时可以启动计数器。
 
在以下示例中,TI2 输入上出现上升沿时,递增计数器启动:
 
- 将通道 2 配置为检测 TI2 上的上升沿。配置输入滤波时间(本例中不需要任何滤波,因此保持 IC2F=0000)。由于捕获预分频器不用于触发操作,因此无需对其进行配置。CC2S 位只选择输入捕获源,即 TIMx_CCMR1 寄存器中的 CC2S=01。在 TIMx_CCER 寄存器中写入 CC2P=1,以确定极性(仅检测低电平)。

- 在 TIMx_SMCR 寄存器中写入 SMS=110,将定时器配置为触发模式。在 TIMx_SMCR 寄存器中写入 TS=110,选择 TI2 作为输入源。
 
当 TI2 出现上升沿时,计数器开始根据内部时钟计数,并且 TIF 标志置 1。

同步多个定时器,也就是定时器的级联,主模式定时器的触发信号,连接到从模式定时器的内部触发输入源,实现级联

输入脉冲计数原理:

中断:

当CH通道出现选定的输入信号(上升沿或下降沿)时“触发中断标志(TIF)”置1,如果TIE中断使能还会产生触发中断
当计数器溢出时如果TIMx_CR1寄存器UDIS为0允许UEV更新,“更新中断标志(UIF)”置1,如果UIE中断使能还会触发更新中断。

状态标志 中断控制 状态名称 含义
CCxF CCxIE 触发中断 外部通道出现选定信号
UIF UIE 更新中断标志 计数器溢出

十一.脉冲计数

流程图:

引脚配置:

时钟16MHZ。

串口打开(USART6)

核心代码:

定义:int count=0;

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐