一、 基础知识
| 参数 | 定义 | 公式 | 示例 |
|---|---|---|---|
| 频率 f | 1 秒内信号从高到低再回到高电平的次数(周期个数) | f = 1 / T | 50 Hz |
| 周期 T | 一个完整脉冲的时间长度 | T = 1 / f | 20 ms |
| 占空比 | 高电平时间占整个周期的比例 | 占空比 = (高电平时间 / T) × 100% | 50%(高电平 10ms,低电平 10ms) |
1.1 PWM 工作原理(以递增计数为例)
设置两个关键寄存器:
-
ARR(自动重载寄存器):计数器累加的最大值
-
比较值(CCR):与当前计数值进行比较的阈值
-
CNT(计数器寄存器):计数器当前计数的值
工作过程:
-
CNT 从 0 开始递增
-
当 CNT < 比较值时,输出高电平
-
当 CNT ≥ 比较值时,输出低电平
-
当 CNT 计数到 ARR 时,清零并重新从 0 开始
-
所以一个周期就为CNT的值从0开始加,加到ARR,这个过程中与比较值比较的结果
结论:
-
ARR 决定 PWM 周期(一个周期 = CNT 从 0 加到 ARR 的时间)
-
比较值决定 PWM 占空比(高电平时间 = 比较值 × 每个计数步长的时间)
下面是PWM的时序图

1.2 PWM输出比较内部结构
| 条件 | 说明 |
|---|---|
| 完成对预装载寄存器的写入 | 用户通过 CCR1H/CCR1L 成功写入比较值 |
| 通道配置为输出模式 | CC1S1:0 设置为输出模式(非输入捕获) |
| OC1PE 决定传输时机 | OC1PE=0 时立即传输;OC1PE=1 时等待更新事件(UEV) |

CCR1H 和 CCR1L 是两个 8 位寄存器,合起来组成一个 16 位的捕获/比较寄存器 1(CCR1),用于存放与计数器 CNT 比较的数值(输出模式)。
写入比较值的过程
- 用户通过总线写入 CCR1H 和 CCR1L 时,写控制逻辑会产生一个 "write_in_progress" 的内部状态信号,
- write_in_progress 的高电平表示正在写入,其下降沿才代表写入成功;
- 未写入时信号一直为低电平且无下降沿,通过检测边沿而非电平来区分"从未写入"和"写入已完成"。。
1.3 PWM输出控制内部结构
| 类别 | 项目 | 说明 |
|---|---|---|
| 输入信号 | OCREF_CLR | 当ETRF(TIMx_SMCR 配置的外部触发信号)检测到高电平时,强制清零 OC1REF,实现逐周期电流管理(如刹车或过流保护) |
| CNT > CCR1 | 来自时基单元(CNT 与 CCR1 比较结果),判断当前计数值是否大于比较值,用于决定输出电平 | |
| CNT = CCR1 | 来自时基单元(CNT 与 CCR1 比较结果),判断当前计数值是否等于比较值,用于产生匹配事件 | |
| 控制参数 | OC1M2:0 | 来自 TIMx_CCMR1,决定当 CNT 与 CCR1 判断时 OC1REF 的行为(置高、置低、翻转或强制固定电平) |
| 输出信号 | OC1REF | 输出模式控制器产生的中间参考信号,决定 PWM 或比较输出的原始波形形态,再经输出控制单元送到芯片引脚 |

CC1P 位(来自 TIMx_CCER)用于选择输出极性;选择高/低电平有效
CC1E是输出使能
1.4 两种中断
| 类别 | 状态标志 | 含义 | 置1条件 | 中断控制位 | 作用 |
|---|---|---|---|---|---|
| 捕获/比较 | CC1IF | 捕获/比较1中断标志 | 当 TIMx_CNT = TIMx_CCR1时 | CC1IE | 决定 PWM 占空比 |
| 更新 | UIF | 更新中断标志 | 计数器溢出时(UDIS=0 允许 UEV 更新) | UIE | 决定 PWM 频率 |
二、输入脉宽捕获
2.1 基本原理
-
捕获过程:你把 TIMx 的某个通道(比如通道1)配置为输入捕获模式,并选择要捕获的边沿(比如上升沿)。
-
事件发生 :当外部信号引脚的上升沿到来时,当前计数器的值 会立刻被自动锁存 到对应的捕获/比较寄存器
TIMx_CCR1里。 -
软件介入 :同时,硬件会触发捕获中断(如果使能了)。你可以在中断服务程序里读出
TIMx_CCR1里的值。 -
计算脉宽:
-
捕获第一次上升沿:记录值
t1。 -
捕获紧接着的下降沿:记录值
t2。 -
脉宽 =
t2 - t1(乘以计数周期就是实际时间)
-

Nuev是溢出次数
2.2 内部结构


2.3 输入捕获中断
输入捕获中断包含两种主要中断来源:
-
捕获/比较中断(为了先检测上升沿后转下降沿)
-
触发条件:CH通道发生输入捕获事件
-
标志位:
CC1IF(捕获/比较中断标志)置 1 -
使能控制:
CCxIE -
产生条件:捕获事件发生
-
-
更新中断(为了获取溢出次数)
-
触发条件:计数器溢出(且
UDIS = 0允许 UEV 更新) -
标志位:
UIF(更新中断标志)置 1 -
使能控制:
UIE -
产生条件:计数器溢出
-
表格简记:
| 状态标志 | 中断控制 | 状态名称 | 含义 |
|---|---|---|---|
| CCxF | CCxIE | 捕获/比较x中断标志 | 发生捕获事件 |
| UIF | UIE | 更新中断标志 | 计数器溢出 |
三、脉冲计数
3.1 基本原理
3.1.1 从模式
允许定时器根据外部信号或内部事件来同步或控制其计数行为
| SMS | 模式 | 描述 |
|---|---|---|
| 000 | 禁止从模式 | CEN=1 时,预分频器时钟直接由内部时钟提供 |
| 100 | 复位模式 | 所选触发输入(TRGI)上升沿时,重新初始化计数器并生成更新事件 |
| 101 | 门控模式 | TRGI 为高电平时使能计数器时钟;低电平时立即停止(不复位) |
| 110 | 触发模式 | TRGI 上升沿时启动计数器(不复位) |
| 111 | 外部时钟模式1 | 由 TRGI 的上升沿提供计数器时钟 |
3.1.2 定时器内部同步(级联)
定时器可通过内部硬件连接实现同步或级联 :一个定时器作为主模式 ,另一个作为从模式 ,主定时器可以对从定时器的计数器执行复位、启动、停止 或提供时钟。
典型应用场景
-
多个定时器级联实现更长位数的计数器
-
一个定时器触发另一个定时器开始计数
-
一个定时器的更新事件作为另一个定时器的时钟源

3.2 输入脉冲计数中断
两种中断来源:
1. 触发中断
-
触发条件:CH通道出现选定的输入信号(上升沿或下降沿)
-
标志位 :
TIF(触发中断标志)置1 -
使能控制 :
TIE -
产生事件:外部通道出现选定信号
2. 更新中断
-
触发条件 :计数器溢出(且
UDIS = 0允许 UEV 更新) -
标志位 :
UIF(更新中断标志)置1 -
使能控制 :
UIE -
产生事件:计数器溢出
| 状态标志 | 中断控制 | 状态名称 | 含义 |
|---|---|---|---|
| TIF | TIE | 触发中断标志 | 外部通道出现选定信号 |
| UIF | UIE | 更新中断标志 | 计数器溢出 |