
文章目錄STM32 定時器與 PWM 學習筆記一、定時器分類STM32F103C8T6 定時器資源系統(tǒng)時鐘樹要點三個重要概念定時時間計算公式二、定時器中斷配置流程步驟代碼模板三、PWM脈沖寬度調(diào)制工作原理PWM 模式PWM 配置步驟PWM 代碼模板實時修改占空比通道與引腳對應關系F103C8T6 常用四、典型應用場景1. LED 呼吸燈2. 舵機控制3. 直流電機調(diào)速五、重要注意事項六、小結STM32 定時器與 PWM 學習筆記基于 B站 江科大自化協(xié) STM32 教程整理一、定時器分類STM32F103C8T6 定時器資源類型數(shù)量位數(shù)功能高級定時器 (TIM1)116位PWM 互補輸出、死區(qū)控制、剎車功能通用定時器 (TIM2/3/4)316位定時、PWM、輸入捕獲、輸出比較、編碼器基本定時器 (TIM6/7)216位僅定時功能無外部 I/O系統(tǒng)時鐘樹要點系統(tǒng)時鐘 SYSCLK 72MHz外部 8MHz 晶振 → PLL 倍頻APB2 總線72MHzTIM1 掛載在 APB2APB1 總線36MHz但掛載在 APB1 上的定時器TIM2/3/4/6/7時鐘 36MHz × 2 72MHz預分頻器倍頻三個重要概念概念縮寫作用預分頻器PSC對時鐘分頻決定計數(shù)頻率自動重裝載值ARR決定計數(shù)周期計數(shù)器CNT當前計數(shù)值定時時間計算公式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);// 在這里寫定時觸發(fā)的操作}}三、PWM脈沖寬度調(diào)制工作原理通過改變占空比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 的位數(shù)決定如 ARR 999分辨率為 0.1%PWM 模式模式行為極性PWM 模式 1CNT CCR 時為有效電平向上計數(shù)PWM 模式 2CNT CCR 時為有效電平向上計數(shù)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){// 注意庫函數(shù) TIM_SetCompare1 沒有檢查參數(shù)上限// 如果傳入值 ARR會一直輸出高電平100% 占空比TIM_SetCompare1(TIM2,Compare);}通道與引腳對應關系F103C8T6 常用定時器通道 1通道 2通道 3通道 4TIM1PA8PA9PA10PA11TIM2PA0PA1PA2PA3TIM3PA6PA7PB0PB1TIM4PB6PB7PB8PB9四、典型應用場景1. LED 呼吸燈// 在主循環(huán)中漸變改變 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. 直流電機調(diào)速使用 L298N 等驅動模塊通過 PWM 占空比控制電機轉速// 0~100% 占空比對應 0~ARRPWM_SetCompare1((uint16_t)(speed/100.0*ARR));五、重要注意事項TIM_SetCompare 參數(shù)范圍庫函數(shù)不檢查傳入值是否 ≤ ARR超出會導致持續(xù)高電平而非 100% 占空比重映射部分引腳存在默認復用功能沖突時需要通過 AFIO 重映射到備用引腳如GPIO_PinRemapConfig高級定時器 TIM1 需要額外使能TIM_CtrlPWMOutputs(TIM1, ENABLE)才能使 PWM 輸出PSC 和 ARR 是 16 位寄存器最大值為 65535影子寄存器PSC 和 ARR 有影子寄存器更新事件發(fā)生時才會真正生效可設置TIM_ARRPreloadConfig控制更新時機時鐘分割 (CKD)用于數(shù)字濾波器不是定時器時鐘的分頻配置死區(qū)時才起作用六、小結要實現(xiàn)配置要點定時中斷時基單元 NVICPWM 輸出時基單元 OC 通道 AF_PP 引腳占空比調(diào)節(jié)TIM_SetCompareX(TIMx, val)輸入捕獲測量外部信號頻率/脈寬編碼器模式電機速度/位置采集核心記憶口訣時鐘-引腳-時基-通道 四步走PSC 決定單位時間ARR 決定周期CCR 決定占空比。整理時間2026-07-27