定时器与 PWM 学习笔记
文章目录STM32 定时器与 PWM 学习笔记一、定时器分类STM32F103C8T6 定时器资源系统时钟树要点三个重要概念定时时间计算公式二、定时器中断配置流程步骤代码模板三、PWM脉冲宽度调制工作原理PWM 模式PWM 配置步骤PWM 代码模板实时修改占空比通道与引脚对应关系F103C8T6 常用四、典型应用场景1. LED 呼吸灯2. 舵机控制3. 直流电机调速五、重要注意事项六、小结STM32 定时器与 PWM 学习笔记基于 B站 江科大自化协 STM32 教程整理一、定时器分类STM32F103C8T6 定时器资源类型数量位数功能高级定时器 (TIM1)116位PWM 互补输出、死区控制、刹车功能通用定时器 (TIM2/3/4)316位定时、PWM、输入捕获、输出比较、编码器基本定时器 (TIM6/7)216位仅定时功能无外部 I/O系统时钟树要点系统时钟 SYSCLK 72MHz外部 8MHz 晶振 → PLL 倍频APB2 总线72MHzTIM1 挂载在 APB2APB1 总线36MHz但挂载在 APB1 上的定时器TIM2/3/4/6/7时钟 36MHz × 2 72MHz预分频器倍频三个重要概念概念缩写作用预分频器PSC对时钟分频决定计数频率自动重装载值ARR决定计数周期计数器CNT当前计数值定时时间计算公式T ( P S C 1 ) × ( A R R 1 ) T I M CLK T \frac{(PSC 1) \times (ARR 1)}{TIM_{\text{CLK}}}TTIMCLK​(PSC1)×(ARR1)​例如TIM_CLK 72MHzPSC 7199ARR 9999 → T 1s二、定时器中断配置流程步骤开启定时器时钟RCC_APB1PeriphClockCmd或RCC_APB2PeriphClockCmd配置时基单元TIM_TimeBaseInit使能更新中断TIM_ITConfig配置 NVICNVIC_PriorityGroupConfigNVIC_Init使能定时器TIM_Cmd代码模板voidTimer_Init(void){RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;TIM_TimeBaseStructure.TIM_Prescaler7199;// PSCTIM_TimeBaseStructure.TIM_Period9999;// ARRTIM_TimeBaseStructure.TIM_CounterModeTIM_CounterMode_Up;TIM_TimeBaseStructure.TIM_ClockDivisionTIM_CKD_DIV1;TIM_TimeBaseStructure.TIM_RepetitionCounter0;TIM_TimeBaseInit(TIM2,TIM_TimeBaseStructure);TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);NVIC_InitTypeDef NVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannelTIM2_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority0;NVIC_InitStructure.NVIC_IRQChannelSubPriority0;NVIC_InitStructure.NVIC_IRQChannelCmdENABLE;NVIC_Init(NVIC_InitStructure);TIM_Cmd(TIM2,ENABLE);}voidTIM2_IRQHandler(void){if(TIM_GetITStatus(TIM2,TIM_IT_Update)SET){TIM_ClearITPendingBit(TIM2,TIM_IT_Update);// 在这里写定时触发的操作}}三、PWM脉冲宽度调制工作原理通过改变占空比Duty Cycle来控制模拟量输出频率由 ARR 决定f P W M T I M C L K ( P S C 1 ) × ( A R R 1 ) f_{PWM} \frac{TIM_{CLK}}{(PSC 1) \times (ARR 1)}fPWM​(PSC1)×(ARR1)TIMCLK​​占空比由 CCR捕获/比较寄存器决定D u t y C C R A R R 1 Duty \frac{CCR}{ARR 1}DutyARR1CCR​分辨率由 ARR 的位数决定如 ARR 999分辨率为 0.1%PWM 模式模式行为极性PWM 模式 1CNT CCR 时为有效电平向上计数PWM 模式 2CNT CCR 时为有效电平向上计数PWM 配置步骤开启 GPIO 时钟和复用功能RCC_APB2PeriphClockCmd AFIO配置 GPIO 为复用推挽输出GPIO_Init设置GPIO_Mode_AF_PP开启定时器时钟配置时基单元TIM_TimeBaseInit配置输出比较单元TIM_OCInit使能定时器TIM_CmdPWM 代码模板voidPWM_Init(void){// 1. GPIO 时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE);// 2. GPIO 配置以 PA0 → TIM2_CH1 为例GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_PinGPIO_Pin_0;GPIO_InitStructure.GPIO_ModeGPIO_Mode_AF_PP;// 复用推挽输出GPIO_InitStructure.GPIO_SpeedGPIO_Speed_50MHz;GPIO_Init(GPIOA,GPIO_InitStructure);// 3. 定时器时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);// 4. 时基单元TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;TIM_TimeBaseStructure.TIM_Prescaler71;// 72MHz / 72 1MHzTIM_TimeBaseStructure.TIM_Period999;// 1kHz PWMTIM_TimeBaseStructure.TIM_CounterModeTIM_CounterMode_Up;TIM_TimeBaseStructure.TIM_ClockDivisionTIM_CKD_DIV1;TIM_TimeBaseInit(TIM2,TIM_TimeBaseStructure);// 5. 输出比较配置TIM_OCInitTypeDef TIM_OCInitStructure;TIM_OCInitStructure.TIM_OCModeTIM_OCMode_PWM1;TIM_OCInitStructure.TIM_OCPolarityTIM_OCPolarity_High;TIM_OCInitStructure.TIM_OutputStateTIM_OutputState_Enable;TIM_OCInitStructure.TIM_Pulse0;// 初始占空比 0%TIM_OC1Init(TIM2,TIM_OCInitStructure);// 6. 使能TIM_Cmd(TIM2,ENABLE);}实时修改占空比voidPWM_SetCompare1(uint16_tCompare){// 注意库函数 TIM_SetCompare1 没有检查参数上限// 如果传入值 ARR会一直输出高电平100% 占空比TIM_SetCompare1(TIM2,Compare);}通道与引脚对应关系F103C8T6 常用定时器通道 1通道 2通道 3通道 4TIM1PA8PA9PA10PA11TIM2PA0PA1PA2PA3TIM3PA6PA7PB0PB1TIM4PB6PB7PB8PB9四、典型应用场景1. LED 呼吸灯// 在主循环中渐变改变 CCRuint8_tdir0;uint16_tpwm_val0;while(1){PWM_SetCompare1(pwm_val);if(dir0)pwm_val;elsepwm_val--;if(pwm_val999)dir1;if(pwm_val0)dir0;Delay_ms(1);// 控制呼吸速度}2. 舵机控制脉宽角度0.5ms0°1.0ms45°1.5ms90°2.0ms135°2.5ms180°设置 PWM 频率 50Hz周期 20msARR 19999PSC 71// SG90 舵机常用配置50Hz// ARR 20000-1, PSC 72-1// 0°: CCR 500// 90°: CCR 1500// 180°: CCR 25003. 直流电机调速使用 L298N 等驱动模块通过 PWM 占空比控制电机转速// 0~100% 占空比对应 0~ARRPWM_SetCompare1((uint16_t)(speed/100.0*ARR));五、重要注意事项TIM_SetCompare 参数范围库函数不检查传入值是否 ≤ ARR超出会导致持续高电平而非 100% 占空比重映射部分引脚存在默认复用功能冲突时需要通过 AFIO 重映射到备用引脚如GPIO_PinRemapConfig高级定时器 TIM1 需要额外使能TIM_CtrlPWMOutputs(TIM1, ENABLE)才能使 PWM 输出PSC 和 ARR 是 16 位寄存器最大值为 65535影子寄存器PSC 和 ARR 有影子寄存器更新事件发生时才会真正生效可设置TIM_ARRPreloadConfig控制更新时机时钟分割 (CKD)用于数字滤波器不是定时器时钟的分频配置死区时才起作用六、小结要实现配置要点定时中断时基单元 NVICPWM 输出时基单元 OC 通道 AF_PP 引脚占空比调节TIM_SetCompareX(TIMx, val)输入捕获测量外部信号频率/脉宽编码器模式电机速度/位置采集核心记忆口诀时钟-引脚-时基-通道 四步走PSC 决定单位时间ARR 决定周期CCR 决定占空比。整理时间2026-07-27