【STM32】定时器输出比较模式详解
STM32 定时器 – 输出比较模式(Output Compare)
🧭 输出比较模式概述
STM32 的定时器支持输出比较(Output Compare, OC)功能,用于在定时器计数达到指定值时触发某种动作(如设置电平、翻转电平、输出PWM等)。
输出比较模式的本质是:当 CNT(计数器)计数值与 CCRx(比较寄存器)相等时,输出控制器根据配置执行相应动作。
常用的输出比较模式包括:
模式名称 | 描述 |
---|---|
冻结(Frozen) | 不做任何操作(默认) |
主动电平设置 | 设置输出为高电平 |
主动电平清除 | 设置输出为低电平 |
电平翻转 | 翻转输出引脚电平 |
强制高电平 | 强制输出高电平 |
强制低电平 | 强制输出低电平 |
PWM模式1 | CNT < CCRx时输出有效电平,反之无效电平 |
PWM模式2 | CNT < CCRx时输出无效电平,反之有效电平 |
⚠️ 注意:"有效/无效电平"取决于
CCxP
(输出极性)设置。
🔧 PWM 模式详解(PWM Mode 1 / 2)
✅ 工作原理
以 PWM 模式 1 为例:
CNT < CCRx
时输出有效电平;CNT >= CCRx
时输出为无效电平;📐 占空比计算
占空比(%) = CCRx / ARR × 100%
例如 ARR=999,CCRx=499,PWM频率=定时器更新频率,输出占空比为 50%。
📥 相关寄存器
寄存器 | 说明 |
---|---|
TIMx->ARR | 自动重装载寄存器,控制 PWM 周期 |
TIMx->CCR1~4 | 比较寄存器,控制 PWM 占空比 |
TIMx->CCMRx | 设置输出比较模式(PWM模式等) |
TIMx->CCER | 控制输出使能与极性 |
TIMx->CR1 | 启动计数器(CEN位) |
🧠 影子寄存器机制
ARPE
(自动重载预装载使能)控制 ARR 是否使用影子寄存器。可以通过软件触发一次更新事件使寄存器值立即生效:
TIMx->EGR |= TIM_EGR_UG;
🧰 CUBEMX 配置方法
-
打开定时器,选择
PWM Generation CHx
模式; -
在
Configuration
中: - 设置 Prescaler(预分频器)和 Counter Period(ARR值)决定 PWM 频率;
- 设置 Pulse 值(即 CCRx)决定占空比;
-
使能通道输出(TIMx->CCER 的 CCxE 位);
-
启用自动重载缓冲(ARPE);
-
生成代码后使用以下代码启用:
HAL_TIM_PWM_Start(&htimx, TIM_CHANNEL_x);
- 更改占空比:
__HAL_TIM_SET_COMPARE(&htimx, TIM_CHANNEL_x, new_ccr);
📝 简略介绍其他输出比较模式
模式名称 | 使用场景 / 原理 |
---|---|
Frozen | 默认无操作,用于禁用通道 |
Active | CNT == CCRx 时输出引脚置为高电平 |
Inactive | CNT == CCRx 时输出引脚置为低电平 |
Toggle | CNT == CCRx 时翻转输出电平(适用于输出方波) |
Force High | 不受 CNT 控制,直接将引脚设置为高电平 |
Force Low | 不受 CNT 控制,直接将引脚设置为低电平 |
可通过设置 TIMx->CCMRx
寄存器中的 OCxM
位字段选择这些模式。
📚 示例代码片段(PWM模式)
// 初始化 PWM 通道
HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1);
// 修改占空比
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 750); // 设置占空比为 75%
✅ 总结
作者:hallo-ooo