STM32F103 驱动 WS281x 灯珠的三种方式详解(普通 IO / SPI+DMA / PWM+DMA)
WS281x(常见型号 WS2812B / SK6812)是一种集成了 LED 与驱动芯片的智能 RGB 灯珠,通过 单总线协议 完成颜色控制。该协议虽然只有一个数据线,但对 时序要求非常严格,这也是驱动时常被认为“麻烦”的原因。
本文总结在 STM32F103 平台驱动 WS281x 的 三种常用方式:
- 普通 IO 模拟时序
- SPI + DMA 模拟控制波形
- PWM + DMA 调占空比输出
并结合项目实践,给出 Example 示例工程,用于串口/CAN 控制 LED。
源码分享
由于平台诸多限制,链接无法直接分享并容易失效。源码可在下方链接中直接下载。免费开源
https://blog.csdn.net/weixin_52908342/article/details/154457659
1. WS281x 通信时序简介
WS281x 的控制信号为 单线时序编码,数据格式为:
G R B
每个颜色 8bit,共 24bit
关键点在于 高电平时间长度代表 0 / 1:
| 码值 | 高电平时间 | 低电平时间 | 周期 |
|---|---|---|---|
| 0 | T0H ≈ 0.35 μs | T0L ≈ 0.8 μs | 1.25 μs |
| 1 | T1H ≈ 0.7 μs | T1L ≈ 0.6 μs | 1.25 μs |
且一帧数据输出结束后需 >50 μs 的低电平复位时间。

2. 普通 IO 模拟时序(Bit-Banging)
原理
直接通过 GPIO_SetBits() / GPIO_ResetBits() + NOP 延时 模拟高低电平。
优点
- 实现简单
- 无需额外外设资源
缺点
- CPU 占用高
- 中断、调度会破坏时序
- LED 数量增加后容易失稳
适用场景
- 灯珠少、逻辑简单的项目,例如测试样例、小装饰。
3. SPI + DMA 模拟时序
原理
利用 SPI 的固定时钟来生成近似 WS281x 的波形。
每一位 WS281x 数据需要映射为 8bit SPI 数据:
| WS281x 位值 | SPI 输出(示例) | HEX |
|---|---|---|
| 0 | 11100000 |
0xE0 |
| 1 | 11111000 |
0xF8 |
SPI 时钟设置为 SPI 分频后 ≈ 2.4MHz(可根据波形微调)。
优点
- CPU 不参与传输
- 输出波形稳定,不受中断影响
- 适合大量灯珠
缺点
- 不同 MCU / Freq 下需要重新计算 SPI 时钟与编码
- 数据量比原始像素数据 膨胀 8 倍
使用流程
RGB 数据 → 按位编码成 SPI buffer → SPI DMA 发送 → 结束后延时复位
4. PWM + DMA 调占空比方式(推荐)
原理
配置 PWM 输出频率 = 800kHz(即 1.25 μs 周期),通过改变 CCR 占空比 来控制高电平长度:
| WS281x 位值 | 占空比 | 示例 CCR 值(TIM_ARR=100) |
|---|---|---|
| 0 | ~33% | 33 |
| 1 | ~66% | 66 |
DMA 负责自动把所有 CCR 数据 依次写入定时器。
优点(最优解)
- 波形精确、稳定性高
- 数据量较小
- 适合 大规模灯带
缺点
- 依赖定时器资源
- 需要正确处理 DMA 传输完成中断避免显示异常
5. Example 示例工程说明
在项目的 Example 文件夹中提供两个完整实例:
| 示例 | 通信方式 | 说明 |
|---|---|---|
| Example 1 | 串口控制 LED | 通过串口命令控制 LED 颜色与模式 |
| Example 2 | CAN 回环控制 LED | 使用串口发送 → CAN 回环接收 → 控制 LED |
第二个例子用于 单机调试,无需两块板子,即可验证 CAN 驱动 LED 是否正常。
总结
| 驱动方式 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 普通 IO | 简单直接 | 时序不稳定 / CPU 占用高 | 简单灯光,调试用 |
| SPI+DMA | 波形稳定 / CPU 低占用 | 数据膨胀 / SPI 时钟需精调 | 中等数量灯带 |
| PWM+DMA | 最稳定 / 最通用 / 扩展性强 | 需要定时器资源 | 大批量灯带 / 正式项目 |
在实际商业项目中,优先推荐 PWM+DMA 驱动方案。
本篇文章分别介绍了在 STM32F103 平台上驱动 WS281x 灯珠的三种常见方式:普通 IO 模拟时序、SPI+DMA 编码输出以及 PWM+DMA 调占空比方式。其中,普通 IO 方法实现简单但时序稳定性差,更适用于测试验证;SPI+DMA 可以显著降低 CPU 占用,输出波形稳定,但需要进行数据膨胀编码;而 PWM+DMA 方案可以在硬件层面精准控制高电平宽度,具备最优秀的时序稳定性和扩展能力,是实际工程中最推荐的方案。配合 DMA 自动传输,可轻松驱动大量灯珠而不占用 CPU 资源。实际项目中应根据资源占用、灯珠数量以及系统实时性要求选择合适的实现方式,并根据示例工程进行灵活应用与拓展。