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 資源。實際項目中應根據資源佔用、燈珠數量以及系統實時性要求選擇合適的實現方式,並根據示例工程進行靈活應用與拓展。