⚙️ 一、输出模式总览
STM32定时器的输出比较模式通过比较计数器(CNT)与捕获/比较寄存器(CCRx)的值,控制输出引脚(OCx)的电平状态。六种模式定义如下:
模式宏 | 触发动作(CNT = CCRx时) | 输出波形特点 | 典型应用 |
---|---|---|---|
TIM_OCMode_Timing | 无动作(引脚冻结) | 保持原电平 | 纯定时中断 |
TIM_OCMode_Active | 强制输出高电平(有效电平) | 单次高脉冲 | 单脉冲生成 |
TIM_OCMode_Inactive | 强制输出低电平(无效电平) | 单次低脉冲 | 单脉冲生成 |
TIM_OCMode_Toggle | 电平翻转 | 周期为 2×ARR 的方波(占空比50%) | 方波时钟源 |
TIM_OCMode_PWM1 | 自动生成PWM(见下文详述) | 占空比可调(0%-100%) | 电机/LED控制 |
TIM_OCMode_PWM2 | 自动生成PWM(极性相反) | 占空比可调(0%-100%) | 电机/LED控制 |
🔧 二、各模式详解
1. 冻结模式 (TIM_OCMode_Timing
)
- 工作原理:CNT与CCRx匹配时不改变引脚状态,仅触发中断或DMA请求。
- 应用场景:精确计时任务(如周期性传感器采样),无需物理输出。
2. 单次动作模式 (TIM_OCMode_Active
/Inactive
)
- 工作流程:
Active
:匹配时引脚置高,保持至下次重载或手动修改。Inactive
:匹配时引脚置低,行为同上。
- 特点:仅触发一次电平变化,需手动重置计数器才能再次触发。
- 应用场景:生成单脉冲信号(如步进电机单步驱动)。
3. 翻转模式 (TIM_OCMode_Toggle
)
- 工作流程:每次CNT=CCRx时,引脚电平翻转一次。
- 输出波形:
- 周期 =
2 × (ARR + 1) / CK_CNT
- 固定50%占空比(例如CCRx设为ARR的一半)。
- 周期 =
- 应用场景:生成方波时钟(如驱动无源蜂鸣器)。
4. PWM模式 (PWM1
/PWM2
)
核心区别:
模式 向上计数行为 向下计数行为 PWM1
CNT < CCRx → 高电平;
CNT ≥ CCRx → 低电平
CNT > CCRx → 低电平;
CNT ≤ CCRx → 高电平
PWM2
CNT < CCRx → 低电平;
CNT ≥ CCRx → 高电平
CNT > CCRx → 高电平;
CNT ≤ CCRx → 低电平
注:有效电平由
TIM_OCPolarity
进一步配置。参数计算:
- 频率 =
CK_PSC / (PSC + 1) / (ARR + 1)
- 占空比 =
CCRx / (ARR + 1)
(PWM1模式)。
- 频率 =
高级功能:
- 互补输出(高级定时器TIM1/TIM8):可生成带死区的互补PWM,用于H桥驱动。
- 预装载寄存器:通过
TIM_OCxPreloadConfig()
使能,避免占空比更新时的毛刺。
⚡ 三、PWM模式的配置示例(STM32F103)
以TIM1通道1生成PWM1波形为例:
// 1. 初始化GPIO(PA8为TIM1_CH1)
GPIO_InitTypeDef GPIO_InitStruct = {.GPIO_Pin = GPIO_Pin_8,.GPIO_Mode = GPIO_Mode_AF_PP, // 复用推挽输出.GPIO_Speed = GPIO_Speed_50MHz
};
GPIO_Init(GPIOA, &GPIO_InitStruct);// 2. 配置时基单元(72MHz时钟,1kHz PWM)
TIM_TimeBaseInitTypeDef TIM_TimeBase = {.TIM_Period = 720 - 1, // ARR = 719 → 周期720.TIM_Prescaler = 0, // PSC = 0 → 无分频.TIM_CounterMode = TIM_CounterMode_Up
};
TIM_TimeBaseInit(TIM1, &TIM_TimeBase);// 3. 配置PWM模式(占空比50%)
TIM_OCInitTypeDef TIM_OCInit = {.TIM_OCMode = TIM_OCMode_PWM1, // PWM模式1.TIM_OutputState = TIM_OutputState_Enable,.TIM_Pulse = 360, // CCRx = 360 (50%占空比).TIM_OCPolarity = TIM_OCPolarity_High // 高电平有效
};
TIM_OC1Init(TIM1, &TIM_OCInit);// 4. 使能高级定时器主输出
TIM_CtrlPWMOutputs(TIM1, ENABLE); // 必需!否则无输出[5](@ref)
TIM_Cmd(TIM1, ENABLE); // 启动定时器
⚠️ 四、模式选择与常见问题
模式选择建议:
- 电机控制/调光 → PWM1/PWM2
- 精确时间中断 → Timing
- 简单方波 → Toggle
- 单脉冲指令 → Active/Inactive 。
关键注意事项:
- PWM无输出:检查高级定时器的
MOE
位(TIM_CtrlPWMOutputs()
)。 - 占空比异常:确保CCRx ≤ ARR,否则PWM不生效。
- 电平极性混淆:
PWM1
+High
与PWM2
+Low
等效,需结合外设需求选择。
- PWM无输出:检查高级定时器的
💎 总结
STM32定时器的输出模式覆盖了从基础定时到复杂PWM生成的各类场景:
- 冻结/单次模式适用于事件驱动型任务;
- 翻转模式提供简单方波;
- PWM模式(占主导地位)通过硬件自动生成可调占空比信号,结合互补输出和死区插入,可满足电机驱动、电源转换等工业级需求。
配置时需严格匹配时基参数(ARR/PSC)与极性设置,并善用预装载功能确保波形稳定性。