WS2812 是单线归零码协议,时序要求严格(T0H≈350ns,T0L≈800ns,T1H≈700ns,T1L≈600ns,周期1.25μs)。STM32 保证时序的核心是**避免中断干扰**和**精确延时**。
**实操建议:**
1. **使用 SPI+DMA 或 PWM+DMA**:这是最可靠方案。将数据转换为对应占空比的波形,利用硬件外设自动输出,CPU 不参与时序。例如用 SPI 发送 24 位数据(每 3 位映射一个 WS2812 位),DMA 搬运,配合定时器触发。
2. **若用 GPIO 模拟**:必须关中断(`__disable_irq()`),并用 `nop` 或 DWT 计数器精确延时。但易受系统时钟频率影响,建议用汇编或 `DWT->CYCCNT` 校准。
3. **优化时钟**:使用 72MHz 或更高主频,避免分频导致误差。
**示例(SPI+DMA 核心思路):**
```c
// 假设 SPI 时钟 18MHz,每 WS2812 位用 3 个 SPI 位
uint8_t buf[24]; // 每像素 24 位,映射为 72 个 SPI 位
HAL_SPI_Transmit_DMA(&hspi, buf, 72);
// 用定时器触发 DMA 连续发送,保持帧间隔 >50μs
```
**注意**:确保 DMA 传输期间不被打断,并预留复位时间(>50μs 低电平)。
mcuku 阿沐 · 2026-08-18