1. 项目概述
呼吸灯效果在嵌入式开发中是个经典案例,也是PWM应用的典型场景。最近在野火STM32 HAL库课程中,我系统梳理了TIM定时器的PWM输出功能实现方式。不同于简单的GPIO控制,PWM呼吸灯需要精确的占空比调节和定时器配置,这里把我的实操笔记整理成完整的技术方案。
这个方案基于STM32F103系列芯片,使用HAL库开发,通过TIM3的通道1输出PWM信号驱动LED。相比寄存器版本,HAL库的封装让配置过程更简洁,但也隐藏了一些关键细节。我会从硬件电路设计到软件参数计算,完整呈现呼吸灯的实现过程,特别说明那些容易踩坑的配置项。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 硬件设计与原理分析
2.1 电路连接方案
LED驱动电路采用最简设计:
- 正极通过220Ω限流电阻接PA6(TIM3_CH1)
- 负极直接接地
- 开发板已内置上拉电阻,无需额外电路
注意:部分开发板的LED控制引脚可能复用为其他功能,务必确认原理图中PA6未被占用。我曾遇到过因引脚冲突导致PWM输出异常的情况。
2.2 PWM调光原理
呼吸灯本质是PWM占空比的周期性变化:
- 周期固定(如1kHz)
- 占空比从0%渐变到100%,再返回0%
- 人眼因视觉暂留效应看到亮度平滑变化
关键参数关系:
code复制亮度 = (导通时间 / 总周期时间) × 100%
= (Pulse / ARR) × 100%
3. HAL库定时器配置详解
3.1 CubeMX基础配置
- 在Pinout中启用TIM3,设置Channel1为PWM模式
- Clock Configuration确认APB1 Timer Clocks为72MHz
- Parameter Settings配置:
- Prescaler: 71 (72MHz/(71+1)=1MHz)
- Counter Mode: Up
- Counter Period(ARR): 999 (1MHz/(999+1)=1kHz)
- Pulse: 初始值500(50%占空比)
- CH Polarity: High
实测发现:Prescaler和ARR的值必须减1,这是STM32定时器的设计特性,新手容易忽略。
