PWM实现LED灯闪烁
STM32 用 PWM 做 1s / 0.5s 闪烁 开关控制最详细教程我直接给你标准、可直接复制、稳定运行的方案用STM32CubeMX HAL库最常用不用复杂寄存器新手也能直接用。核心结论先记牢1秒闪一次PWM 频率 1Hz占空比 50%0.5秒闪一次PWM 频率 2Hz占空比 50%用定时器 PWM 输出实现CPU 完全不参与硬件自动闪可以随时开关 PWM控制灯亮/灭/闪烁一、硬件选择任意 STM32F103/F407/F030 等通用LED 正极 → 电阻 →定时器 PWM 通道引脚LED 负极 → GND例TIM2_CH1 → PA0最常用你也可以换其他定时器通道二、STM32CubeMX 配置一步一步1. 选择定时器比如用TIM2Clock Source 选择Internal ClockChannel 1 选择PWM Generation CH12. 关键参数决定闪烁频率目标产生 1Hz / 2Hz 的超低频 PWMSTM32 定时器公式PWM频率 定时器时钟 / [(PSC1) * (ARR1)]① 实现 1Hz 闪烁1秒一次PSC 7199ARR 9999频率 72M / (7200 * 10000) 1Hz② 实现 0.5Hz 闪烁0.5秒一次PSC 7199ARR 4999频率 72M / (7200 * 5000) 2Hz3. 占空比CCR1 ARR / 2→ 50% 占空比亮50%、灭50%4. 生成代码选择 MDK-ARM 生成工程即可。三、直接可用代码HAL库1. 定义main.c 顶部// PWM句柄CubeMX自动生成externTIM_HandleTypeDef htim2;// 宏定义#definePWM_HANDLEhtim2#definePWM_CHANNELTIM_CHANNEL_12. 启动 PWM硬件自动开始闪烁// 启动 PWM 输出 → LED 开始闪烁HAL_TIM_PWM_Start(PWM_HANDLE,PWM_CHANNEL);3. 停止 PWM → 灯灭// 停止 PWM → LED 熄灭HAL_TIM_PWM_Stop(PWM_HANDLE,PWM_CHANNEL);4. 切换 1s / 0.5s 闪烁切换到 1秒闪烁一次// 停止 PWMHAL_TIM_PWM_Stop(PWM_HANDLE,PWM_CHANNEL);// 设置新频率1Hz__HAL_TIM_SET_PRESCALER(PWM_HANDLE,7199);// PSC__HAL_TIM_SET_AUTORELOAD(PWM_HANDLE,9999);// ARR__HAL_TIM_SET_COMPARE(PWM_HANDLE,PWM_CHANNEL,5000);// 50%占空比// 重新启动HAL_TIM_PWM_Start(PWM_HANDLE,PWM_CHANNEL);切换到 0.5秒闪烁一次HAL_TIM_PWM_Stop(PWM_HANDLE,PWM_CHANNEL);// 设置新频率2Hz__HAL_TIM_SET_PRESCALER(PWM_HANDLE,7199);__HAL_TIM_SET_AUTORELOAD(PWM_HANDLE,4999);__HAL_TIM_SET_COMPARE(PWM_HANDLE,PWM_CHANNEL,2500);HAL_TIM_PWM_Start(PWM_HANDLE,PWM_CHANNEL);四、完整开关控制逻辑你要的功能// 开关状态uint8_tpwm_enable1;// 1开启闪烁 0关闭// 按键控制例子按下按键切换if(KEY_Press()){pwm_enable!pwm_enable;if(pwm_enable){// 开启1s闪烁HAL_TIM_PWM_Start(PWM_HANDLE,PWM_CHANNEL);}else{// 关闭灯灭HAL_TIM_PWM_Stop(PWM_HANDLE,PWM_CHANNEL);}}五、最精简总结直接背1s闪烁 PWM 1Hz0.5s闪烁 PWM 2Hz开启闪烁HAL_TIM_PWM_Start()关闭灯HAL_TIM_PWM_Stop()切换速度 修改 PSC ARR CCR你告诉我 3 个信息我直接给你完整工程代码你用的 STM32 型号如 F103C8T6LED 接在哪个引脚用库还是寄存器我可以直接给你复制就能跑的完整代码三个LED用STM32 PWM独立控制1s闪 / 0.5s闪 / 开关控制完美方案我直接给你3路独立PWM控制3个LED每个灯可以独立设置1秒闪烁独立设置0.5秒闪烁独立开关亮/灭/闪烁互不干扰硬件自动运行不占CPU核心方案用1个定时器 3个通道比如TIM2_CH1、CH2、CH3输出3路独立PWMLED11Hz1秒闪一次LED22Hz0.5秒闪一次LED3可开关、可切换频率完全满足你控制三个LED的需求一、硬件接线通用STM32以最常用TIM2为例所有STM32都能用LED1 → PA0TIM2_CH1LED2 → PA1TIM2_CH2LED3 → PA2TIM2_CH3每个LED串联220Ω电阻再接 GND二、STM32CubeMX 一键配置定时器选择TIM2Clock SourceInternal ClockChannel1 / Channel2 / Channel3 都选PWM Generation CHx关键参数固定直接抄PSC 7199ARR 9999这样基础频率 1Hz1秒闪烁时钟72MHzSTM32F103默认生成MDK-ARM工程三、3路LED控制代码直接复制用1. 声明main.c顶部// 定时器句柄CubeMX自动生成externTIM_HandleTypeDef htim2;// 3路PWM定义#defineLED1_PWM_TIMhtim2#defineLED1_CHANNELTIM_CHANNEL_1#defineLED2_PWM_TIMhtim2#defineLED2_CHANNELTIM_CHANNEL_2#defineLED3_PWM_TIMhtim2#defineLED3_CHANNELTIM_CHANNEL_32. 初始化main函数里// 启动3路PWM默认// LED11秒闪烁 LED20.5秒闪烁 LED3关闭HAL_TIM_PWM_Start(LED1_PWM_TIM,LED1_CHANNEL);LED1_Set_1s_Flash();// LED1 1s闪HAL_TIM_PWM_Start(LED2_PWM_TIM,LED2_CHANNEL);LED2_Set_05s_Flash();// LED2 0.5s闪HAL_TIM_PWM_Stop(LED3_PWM_TIM,LED3_CHANNEL);// LED3 灭四、3个LED独立控制函数核心1. LED11秒闪烁一次voidLED1_Set_1s_Flash(void){// 1Hz 1秒周期__HAL_TIM_SET_PRESCALER(LED1_PWM_TIM,7199);__HAL_TIM_SET_AUTORELOAD(LED1_PWM_TIM,9999);__HAL_TIM_SET_COMPARE(LED1_PWM_TIM,LED1_CHANNEL,5000);// 50%占空比}2. LED20.5秒闪烁一次voidLED2_Set_05s_Flash(void){// 2Hz 0.5秒周期__HAL_TIM_SET_PRESCALER(LED2_PWM_TIM,7199);__HAL_TIM_SET_AUTORELOAD(LED2_PWM_TIM,4999);__HAL_TIM_SET_COMPARE(LED2_PWM_TIM,LED2_CHANNEL,2500);// 50%占空比}3. LED3任意控制开关 频率// LED3 开启 1s闪烁voidLED3_1s_On(void){__HAL_TIM_SET_PRESCALER(LED3_PWM_TIM,7199);__HAL_TIM_SET_AUTORELOAD(LED3_PWM_TIM,9999);__HAL_TIM_SET_COMPARE(LED3_PWM_TIM,LED3_CHANNEL,5000);HAL_TIM_PWM_Start(LED3_PWM_TIM,LED3_CHANNEL);}// LED3 开启 0.5s闪烁voidLED3_05s_On(void){__HAL_TIM_SET_PRESCALER(LED3_PWM_TIM,7199);__HAL_TIM_SET_AUTORELOAD(LED3_PWM_TIM,4999);__HAL_TIM_SET_COMPARE(LED3_PWM_TIM,LED3_CHANNEL,2500);HAL_TIM_PWM_Start(LED3_PWM_TIM,LED3_CHANNEL);}// LED3 关闭灯灭voidLED3_Off(void){HAL_TIM_PWM_Stop(LED3_PWM_TIM,LED3_CHANNEL);}五、独立开关控制你要的功能// 例子循环测试while(1){// LED1固定 1秒闪烁一直运行// LED2固定 0.5秒闪烁一直运行// LED3自己控制LED3_1s_On();// 1s闪烁HAL_Delay(5000);LED3_05s_On();// 0.5s闪烁HAL_Delay(5000);LED3_Off();// 关闭HAL_Delay(3000);}六、最终效果完美满足你LED1永远 1秒 闪烁一次LED2永远 0.5秒 闪烁一次LED3可随时开关、切换1s/0.5s闪烁三路完全独立互不影响硬件PWM自动运行不占用CPU资源七、最简单总结背会就会用3个LED → 用定时器3个PWM通道1s闪烁 1Hz0.5s闪烁 2Hz开启HAL_TIM_PWM_Start()关闭HAL_TIM_PWM_Stop()改频率改PSC、ARR、CCR我可以直接给你完整的main.c代码你复制进去就能跑你只需要告诉我你用的STM32型号如F103C8T6