STM32F103 驱动 WS281x 灯珠的三种方式详解(普通 IO / SPI+DMA / PWM+DMA)

102 阅读4分钟

STM32F103 驱动 WS281x 灯珠的三种方式详解(普通 IO / SPI+DMA / PWM+DMA)

WS281x(常见型号 WS2812B / SK6812)是一种集成了 LED 与驱动芯片的智能 RGB 灯珠,通过 单总线协议 完成颜色控制。该协议虽然只有一个数据线,但对 时序要求非常严格,这也是驱动时常被认为“麻烦”的原因。

本文总结在 STM32F103 平台驱动 WS281x 的 三种常用方式

  1. 普通 IO 模拟时序
  2. SPI + DMA 模拟控制波形
  3. PWM + DMA 调占空比输出

并结合项目实践,给出 Example 示例工程,用于串口/CAN 控制 LED。


源码分享

由于平台诸多限制,链接无法直接分享并容易失效。源码可在下方链接中直接下载。免费开源 blog.csdn.net/weixin_5290…

image.png

1. WS281x 通信时序简介

WS281x 的控制信号为 单线时序编码,数据格式为:

G R B
每个颜色 8bit,共 24bit

关键点在于 高电平时间长度代表 0 / 1

码值高电平时间低电平时间周期
0T0H ≈ 0.35 μsT0L ≈ 0.8 μs1.25 μs
1T1H ≈ 0.7 μsT1L ≈ 0.6 μs1.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
0111000000xE0
1111110000xF8

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 2CAN 回环控制 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 资源。实际项目中应根据资源占用、灯珠数量以及系统实时性要求选择合适的实现方式,并根据示例工程进行灵活应用与拓展。