【NUCLEO-C562RE】呼吸灯
本文介绍了 NUCLEO-C562RE 开发板结合 PWM 驱动 LED 实现呼吸灯的项目设计。
项目介绍
NUCLEO-C562RE 开发板结合定时器产生 PWM 信号驱动无源蜂鸣器,实现音乐播放的项目设计。
- 准备工作:模块介绍、硬件连接、环境搭建;
- 工程测试:工程配置、关键代码、编译上传、效果演示。
PWM
PWM(Pulse Width Modulation,脉宽调制)是一种通过快速切换电源开关来控制模拟设备输出的技术。核心思想是改变高低电平在一个周期内的时间比例,即占空比,从而控制 LED 的平均电流和亮度。

单片机通过调节 PWM 的占空比,实现 LED 的亮度变化,模拟 “呼吸” 效果。
呼吸灯需固定 PWM 频率、改变占空比。因此不改变 ARR,固定周期、循环改 CCR。频率大于 1kHz 以实现平滑过渡。
实现方法
通过 STM32CubeMX2 可轻松实现硬件 PWM 输出,实现呼吸灯:
- 定时器(TIM2)生成 PWM 信号,自动控制引脚高低电平;
- 通过修改定时器的比较值(Compare Value)改变占空比,实现LED亮度调节;
- 硬件自动生成 PWM 波,无需 CPU 持续干预,提高系统效率。
硬件连接
根据开发板原理图,板载用户 LED 由 PA5 引脚控制,PA5 对应定时器 2 的频道 1,将该其作为 PWM 信号产生引脚。

接线方式
| NUCLEO-C562RE |
LED |
Note |
| PA5 |
SIG |
PWM Signal |
| GND |
GND |
Ground |
实物图

工程配置
- 打开 STM32CubeMX2 软件,从开发板新建工程;
- 点击左侧工具栏
Open Peripherals 按钮,展开 Timers ,启用 TIM2,配置预分频器,输出 PWM 频率固定 2kHz;

使用标准公式:频率 = f_clk / [(PSC + 1) × (ARR + 1)],即
$$
f{pwm}=\frac{f{clk}}{(PSC+1)×(ARR+1)}.
$$
计算步骤:
- Prescaler :143 + 1 = 144
- Period:499 + 1 = 500
- Total Divisor:144 × 500 = 72,000
- Final Result:144,000,000 / 72,000 = 2,000 Hz(2 kHz)
固定 PSC=0、占空比 50%,则:
$$
ARR=\frac{f{clk}}{f{pwm}}−1, \qquad CCR=\frac{ARR+1}{2}.
$$
使能 PWM 后,ARR 和 CCR 可通过程序更改,进而改变 音调 和 音量 。
- 设置通道,启用 CH1,输出模式,比较模式设置为 PWM mode 1,脉冲为 0,使能通道1,使能 GPIO 引脚;



导入 IDE
- 打开 STM32CubeIDE 软件,依次选择
File - Import ,选择 STM32 CMake Project ,选择目标工程文件所在路径;
- 配置工具链,选择主控芯片型号
STM32C562RETx ;
- 待导入完成,点击工具栏 小锤子 按钮,编译工程,无报错。
- 或使用 VS Code 软件打开目标文件夹,编译工程。

流程图

工程代码
打开 main.c 文件,添加如下代码
#include "main.h"
#define STEP_DELAY 5U // 每级占空比停留 5ms
#define STEPS 100U // 渐变级数
static void pwm_set_duty(uint32_t duty)
{
hal_tim_handle_t *htim = mx_tim2_gethandle();
TIM_TypeDef *tim = (TIM_TypeDef *)htim->instance;
uint32_t arr = LL_TIM_GetAutoReload(tim);
uint32_t ccr = (arr + 1U) * duty / STEPS;
if (duty >= STEPS)
{
ccr = arr + 1U;
}
LL_TIM_OC_SetCompareCH1(tim, ccr);
}
int main(void)
{
if (mx_system_init() != SYSTEM_OK)
{
return (-1);
}
else
{
hal_tim_handle_t *htim = mx_tim2_gethandle();
/* 启动 PWM 输出 */
HAL_TIM_OC_StartChannel(htim, HAL_TIM_CHANNEL_1);
HAL_TIM_Start(htim);
while (1) {
/* 渐亮 */
for (uint32_t d = 0; d <= STEPS; d++)
{
pwm_set_duty(d);
HAL_Delay(STEP_DELAY);
}
/* 渐暗 */
for (uint32_t d = STEPS; d > 0; d--)
{
pwm_set_duty(d);
HAL_Delay(STEP_DELAY);
}
}
}
} /* end main */
保存代码。
编译上传
- 点击 VS Code 左侧菜单栏的
调试运行 按钮,创建 launch.json 调试文件,选择 STLINK,默认配置保存;

- 点击运行按钮,自动编译工程并进入调试状态,点击条状悬浮窗的运行按钮,开始运行程序;

效果演示
运行程序,板载用户 LED 亮度循环渐变。

总结
本文介绍了 NUCLEO-C562RE 开发板结合 PWM 驱动 LED 实现呼吸灯的项目设计,为相关项目的快速开发和应用设计提供了参考。 |