在查阅STM32F103参考手册时,许多开发者对如何正确配置定时器以实现PWM输出模式感到困惑。常见问题是:当使用通用定时器(如TIM2-TIM5)配置PWM时,应如何设置捕获/比较寄存器(CCR)、自动重载寄存器(ARR)以及输出比较模式?特别是,在选择PWM模式1与模式2时,其有效电平差异容易导致输出波形不符合预期。此外,极性设置(CCxP)与时钟使能、GPIO复用功能配置的顺序也常被忽略,导致无PWM信号输出。如何根据手册中的寄存器定义和时序图,正确完成从时钟使能到占空比调节的完整配置流程?
1条回答 默认 最新
IT小魔王 2025-10-27 09:33关注STM32F103通用定时器PWM输出配置详解
1. 基础概念:PWM与定时器工作原理
PWM(脉宽调制)是一种通过调节占空比来控制平均电压的技术,广泛应用于电机驱动、LED调光等场景。在STM32F103中,通用定时器如TIM2-TIM5支持多种PWM模式。
核心寄存器包括:
- ARR(Auto-Reload Register):决定PWM周期
- CCR(Capture/Compare Register):决定占空比
- CCMRx(Capture/Compare Mode Register):设置输出比较模式
- CCER(Capture/Compare Enable Register):使能通道并设置极性
定时器基于内部时钟(经PSC预分频后)递增计数,当计数值等于CCR时触发动作,达到ARR后重置。
2. PWM模式选择:模式1 vs 模式2
模式 计数器 < CCR 计数器 ≥ CCR 典型应用场景 PWM Mode 1 有效电平(高) 无效电平(低) 正向PWM输出 PWM Mode 2 无效电平(低) 有效电平(高) 互补或反相需求 若误选模式2,原本期望高占空比输出长时间高电平,实际却变为短时间高电平,导致波形反转。
3. 配置流程:从时钟使能到信号输出
- 开启APB1或APB2总线时钟(RCC)
- 配置GPIO为复用推挽输出模式
- 设置TIMx的PSC、ARR以确定频率
- 配置CCMRx寄存器选择PWM模式
- 设置CCER寄存器启用通道及极性(CCxP)
- 启动定时器(CR1寄存器)
- 动态修改CCR值调节占空比
4. 寄存器级配置示例(以TIM3_CH1为例)
// RCC使能 RCC->APB1ENR |= RCC_APB1ENR_TIM3EN; RCC->APB2ENR |= RCC_APB2ENR_IOPAEN; // GPIOA.6 复用推挽输出 GPIOA->CRL &= ~GPIO_CRL_MODE6; GPIOA->CRL |= GPIO_CRL_MODE6_1; // 2MHz GPIOA->CRL &= ~GPIO_CRL_CNF6; GPIOA->CRL |= GPIO_CRL_CNF6_1; // 复用推挽 // TIM3基本配置 TIM3->PSC = 71; // 72MHz / (71+1) = 1MHz TIM3->ARR = 999; // 周期1ms → 1kHz TIM3->CCR1 = 250; // 占空比25% // PWM模式1,OC1M[2:0]=110 TIM3->CCMR1 |= TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1; TIM3->CCMR1 &= ~TIM_CCMR1_OC1M_0; TIM3->CCMR1 |= TIM_CCMR1_OC1PE; // 使能预装载 // 使能通道1,非反相输出 TIM3->CCER |= TIM_CCER_CC1E; // 启动定时器 TIM3->CR1 |= TIM_CR1_CEN;5. 极性与时序关键点分析
极性由CCER中的CCxP位控制:
- CCxP=0:正常极性(CCR匹配时按模式翻转)
- CCxP=1:反向极性(高低电平反转)
常见错误是先启动定时器再配置GPIO,导致无信号输出。正确顺序必须是:
graph TD A[RCC时钟使能] --> B[GPIO复用配置] B --> C[TIM参数设置:PSC/ARR] C --> D[CCMRx设PWM模式] D --> E[CCER使能+极性] E --> F[启动CR1.CEN] F --> G[动态调节CCR]6. 动态占空比调节与调试技巧
运行时可通过更新CCR寄存器实现平滑调光或调速:
void set_pwm_duty(TIM_TypeDef* TIMx, uint32_t channel, uint32_t duty) { uint32_t arr = TIMx->ARR; uint32_t ccr = (arr * duty) / 100; // 百分比输入 switch(channel) { case 1: TIMx->CCR1 = ccr; break; case 2: TIMx->CCR2 = ccr; break; // 其他通道... } }建议使用逻辑分析仪验证波形,并结合STM32参考手册第14章时序图核对边沿行为。
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报