一、介绍
1.1 对信号进行计时
定时器可以测量外部输入信号的时间参数,包括:
| 功能 | 说明 | 应用场景 |
|---|---|---|
| 输入捕获 | 测量信号上升沿或下降沿到来的时刻 | 计算脉冲宽度、频率测量 |
| PWM输入捕获 | 同时捕获周期和占空比 | 测量PWM信号的高电平时间和低电平时间 |
| 测量脉宽 | 记录两个边沿之间的时间差 | 解码遥控器信号(如红外、接收机PWM) |
| 测频率 | 在固定时间内统计脉冲个数 | 测量电机转速编码器反馈、外部脉冲计数 |
举例:
-
测量电机编码器输出脉冲的频率 → 计算出转速
-
测量舵机控制信号的脉宽(1ms~2ms) → 转换为角度
1.2 读取信号时间
定时器可以按固定的时间间隔去读取外部信号状态,并做出响应:
| 功能 | 说明 | 应用场景 |
|---|---|---|
| 输出比较 | 定时到达设定值时翻转或改变IO口状态 | 产生PWM波(舵机、电机调速、LED调光) |
| 周期中断 | 每次计数溢出时产生中断 | 固定时间间隔采样、系统心跳、按键扫描 |
| 单脉冲模式 | 到达设定时间后输出一个单次脉冲 | 触发其他设备动作、延时控制 |
举例:
-
设定每1ms产生一次中断 → 读取传感器数据(如加速度计)
-
输出比较产生50Hz、占空比可调的PWM → 控制舵机角度
1.3 软件定时缺陷
1.定时不准:涉及到入栈和出栈
2.CPU死等:浪费资源
1.4 核心组成
| 组成部分 | 作用 |
|---|---|
| 时钟 | 提供稳定的计数脉冲(如1MHz、1kHz),决定计数速度 |
| 计数器 | 在每个时钟脉冲到来时,计数值加1(或减1)(可能有多种计数方式) |
| 重装载值 | 设定计数器的计数目标(计到多少时产生事件) |
| 中断 | 计数器达到重装载值时触发,通知CPU执行任务 |
1.5 工作流程
时钟脉冲 → 计数器不断累加 → 计数值 == 重装载值 → 触发中断 → 计数器清零重来
-
时钟 提供稳定的脉冲信号
-
计数器 每来一个脉冲就加1
-
当计数值达到 重装载值 时
-
产生 中断(或触发事件)
-
计数器清零,重新开始计数
1.6 定时器分类

1.6.1 常规定时器
| 定时器类型 | 核心功能 | 特有功能 | 典型应用 |
|---|---|---|---|
| 基本定时器 | 只有计数功能,无输入捕获和输出比较 | 结构简单,可触发DAC | 基础定时、DAC触发 |
| 通用定时器 | 计数 + 输入捕获 + 输出比较 + PWM | 功能灵活,可测信号、可输出PWM | 信号捕获、PWM生成(电机、背光) |
| 高级定时器 | 通用定时器的全部功能 | 死区时间控制、刹车机制 | 电机控制、复杂功率信号、需要安全机制的应用 |
二、基本定时器
2.1 基本定时器
STM32F4xx 系列的基本定时器有 TIM6 和 TIM7,两者相互独立,不共享资源。
2.2 两大核心功能
| 功能 | 说明 |
|---|---|
| 生成时基(定时) | 提供精准的时间基准,实现定时功能 |
| 驱动 DAC | 内部连接到 DAC,可通过触发输出驱动数模转换器 |
2.3 主要特性
| 特性 | 说明 |
|---|---|
| 计数器 | 16 位,递增计数 |
| 自动重装载 | 计到设定值后自动清零重新开始 |
| 预分频器 | 16 位可编程,分频系数 1~65536,运行时可修改; 降低时钟频率,让定时时间可以更长 |
| 触发输出 | 可触发 DAC 进行数模转换 |
| 中断/DMA | 计数器上溢(计满)时,可产生中断或 DMA 请求 |
基本定时器结构框图

2.4 基本定时器组成

2.4.1 时钟源
基本定时器(TIM6/TIM7)的时钟源(CK_INT)来源于 APB1 总线时钟。
2.4.2 预分频器(PSC)
对定时器输入时钟(CK_INT)进行分频,降低频率,实现更灵活的时间控制。
关键规则
| 项目 | 说明 |
|---|---|
| 时钟源 | APB1 总线时钟 |
| 寄存器 | TIMx_PSC |
| 实际分频值 | TIMx_PSC + 1 |
| 分频范围 | 1 ~ 65536 |
| PSC = 0 | 不分频,时钟最快 |
| PSC 越大 | 时钟越慢,定时时间越长 |
| 一句话 | 预分频器对 APB1 时钟进行分频,实际分频值 = PSC寄存器值 + 1 |
影子寄存器
| 项目 | 说明 |
|---|---|
| 分频范围 | 1 ~ 65536 |
| 控制方式 | TIMx_PSC 寄存器的 16 位值 |
| 实时更改 | 支持(因为有缓冲) |
| 生效时机 | 下一更新事件发生时,预分频器的值先更新到影子寄存器,实际输出分频 = 影子寄存器值 + 1 |
2.4.3 计数器
| 项目 | 说明 |
|---|---|
| 时钟来源 | 预分频器输出 CK_CNT |
| 计数模式 | 仅支持递增计数(基本定时器) |
| 计数寄存器 | TIMx_CNT |
| 启动条件 | TIMx_CR1 寄存器中的 CEN 位置 1 |
| 启动延迟 | CEN 置 1 后,一个时钟周期后计数器才真正开始 |
| 计数范围 | 从 0 → 自动重载值(TIMx_ARR)(实际计数要减一,因为从0开始) |
| 上溢事件 | 计到 ARR 后,下一时钟回到 0 并产生上溢事件 |
TIMx_CNT存放计数器的值;TIMx_ARR存放的是用户设计的目标值
时序图

CNT_EN 是计数器使能信号,CEN 置 1 后一个时钟周期有效,高电平期间计数器正常工作。
2.4.4 自动重载器
| 项目 | 说明 |
|---|---|
| 作用 | 控制计数器的最大计数值,决定溢出时间 |
| 寄存器 | TIMx_ARR(预装载寄存器) |
| 影子寄存器 | 实际生效的寄存器,预装载寄存器的值在更新事件时传入 |
| 溢出条件 | TIMx_CNT = TIMx_ARR |
| 溢出后 | CNT 自动清零,产生更新事件(UEV) |
| 预装载生效方式 | 由 TIMx_CR1 寄存器的 ARPE 位控制 |
| ARPE = 0 | 或后为1;写入 ARR 后立即生效(直接进影子寄存器) |
| ARPE = 1 | 或后为0;写入 ARR 后,等**下一次更新事件(UEV)**时才生效 |
| 更新事件产生条件 | 计数器上溢 且 TIMx_CR1 寄存器中的 UDIS 位 = 0 |
| 软件更新 | 也可通过软件产生更新事件 |
2.5 UEV 事件的产生

| 项目 | 说明 |
|---|---|
| UEV来源1 | 计数器上溢(CNT = ARR) |
| UEV来源2 | 软件手动触发(TIMx_EGR 寄存器的 UG 位置 1) |
| 允许产生条件 | TIMx_CR1 寄存器中的 UDIS = 0 |
| 禁止产生条件 | TIMx_CR1 寄存器中的 UDIS = 1 |
| UDIS = 0 时 | 上述两种来源都能正常产生 UEV |
| UDIS = 1 时 | 上述两种来源都无法产生 UEV |
2.6 定时周期计算公式

2.7 单脉冲模式(OPM)
| 项目 | 说明 |
|---|---|
| 控制位 | TIMx_CR1 寄存器的 OPM 位(位3)取决于 TIMx_CR1.OPM 位域 |
| OPM = 0 | 计数器在发生更新事件时不会停止,继续循环计数(连续模式) |
| OPM = 1 | 计数器在发生下一更新事件时自动停止(CEN 位被清零),只运行一个周期 |
2.8 更新中断和DMA请求
| 项目 | 说明 |
|---|---|
| 控制位 | TIMx_CR1 寄存器的 URS 位 |
| URS = 1 | 只有计数器上溢时,才产生更新中断和DMA请求 |
| URS = 0 | 以下所有 事件都会产生更新中断和DMA请求: ① 计数器上溢 ② 软件将 UG 位置 1 ③ 从模式控制器生成的更新事件 |
| 上溢时机 | CNT = ARR 后,下一个时钟周期产生溢出(共计了 ARR+1 个数) |
| 前提条件 | UDIS = 0(允许产生更新事件) |
URS = 1 时只有上溢才触发中断/DMA;URS = 0 时上溢、手动UG、从模式触发都能触发。
