查看: 163|回复: 0

[原创] 基于 MCXN947 SCTimer + eDMA 实现 WS2812 RGB LED 驱动

[复制链接]

该用户从未签到

789

主题

6451

帖子

0

超级版主

Rank: 8Rank: 8

积分
29488
最后登录
2026-11-10
发表于 2026-10-9 15:51:23 | 显示全部楼层 |阅读模式
本帖最后由 小恩GG 于 2026-10-9 15:53 编辑

1. MCXN947简介

MCXN947 是 NXP MCX N 系列高性能 MCU 的代表器件,采用 Arm® Cortex®-M33 双核架构,主频最高可达 150MHz,集成丰富的连接和控制外设,适用于工业控制、人机界面(HMI)、智能家居、边缘 AI、楼宇自动化和电机控制等应用场景。

除了常见的 UART、SPI、I2C、ADC、FlexCAN 等外设之外,MCXN947 还集成了许多高性能模块,例如:

eDMA
SCTimer
LCD 控制器
USB High Speed
Ethernet
CAN FD
I3C
Smart DMA

其中,SCTimer 是 MCXN947 非常有特色的一款定时器外设。与传统 PWM 定时器不同,SCTimer 内部采用 Event-State 架构,可以灵活实现:

高精度 PWM
多路波形输出
硬件状态机
DMA 触发
协议时序生成

对于 WS2812、DShot、红外遥控编码等严格时序协议,SCTimer 往往能够提供比普通定时器更加灵活和高效的解决方案。

本文将介绍如何使用 MCXN947 的 SCTimer 与 eDMA 协同工作,实现一个完全硬件驱动的 WS2812 RGB LED 控制方案。

2. 项目背景

WS2812(WS2812B)是一种集成驱动控制芯片的智能 RGB LED,其数据传输采用单线串行协议。

每颗 LED 共需要接收:
  1. 24bit



  2. G7~G0

  3. R7~R0

  4. B7~B0
复制代码
数据接收完成后自动锁存,并将剩余数据继续传递给下一级 LED,因此只需一根数据线即可驱动大量 RGB 灯珠。

由于 WS2812 对脉冲宽度要求严格,因此 MCU 实现通常采用以下几种方式:

GPIO Bit-Bang
Timer + Interrupt
SPI 模拟
Timer + DMA

对于较长灯带或者实时性要求较高的系统,前两种方案会占用大量 CPU 资源。

因此本文采用:


SCTimer + eDMA

实现完全硬件驱动的 WS2812 控制方案。

特点:

无 Bit 中断
无软件延时
CPU 零参与传输
时序精确稳定
可驱动大量 LED

3. 为什么选择 SCTimer,而不是 FlexPWM、CTIMER 或 SPI?

在 MCXN947 上,实现 WS2812 驱动其实有多种选择。

SPI方案

很多 MCU 使用 SPI 模拟 WS2812。

例如:

1bit WS2812

编码为

100 = 0
110 = 1


然后利用 SPI 输出。

优点:

实现简单

缺点:

数据量膨胀 3 倍以上
需要额外编码缓存
频率匹配困难
灵活性较差

对于较长灯带:

Plain Text
100 LEDs

2400bits
↓

7200bits SPI数据

内存占用明显增加。

CTIMER方案

CTIMER 可以产生 PWM 波形。

但是:


每个 Bit
都需要更新 Match

通常需要:

CTIMER + DMA

或者:

CTIMER + Interrupt

实现复杂度较高。

此外,CTIMER 没有 SCTimer 那样灵活的 Event 机制。

FlexPWM方案

FlexPWM 是电机控制场景常用的 PWM 模块。

虽然能够实现 WS2812 驱动,但存在以下问题:

配置复杂
与电机控制资源冲突
DMA 更新链路复杂

对于仅需要输出单线数据协议的应用来说有些“大材小用”。

SCTimer方案

SCTimer 恰好具备实现 WS2812 的所有优势:

Match/MatchRel 双缓冲

DMA 更新:

Plain Text
MATCHREL

硬件自动装载:

MATCH

无需停止计数器。

Event机制
Plain Text
Event0:
产生周期

Event1:
产生占空比
触发DMA

逻辑天然匹配 WS2812 协议。

输出控制

支持:

SET
CLEAR
TOGGLE

所有边沿均可通过硬件控制。

DMA联动

直接支持:

Event → DMA Request

无需 CPU 参与。

因此对于 MCXN947 而言:

Plain Text
SCTimer + eDMA

可以说是实现 WS2812 最优雅、CPU占用最低、扩展性最好的方案。

4. 系统架构

整体数据流如下:
          RGB Color Buffer
                  │
                  ▼
         WS2812_PrepareBits()
                  │
                  ▼
           g_bitValues[]
         (53 或 135 Tick)
                  │
                  ▼
                eDMA
                  │
                  ▼
        SCT0->MATCHREL[]
                  │
                  ▼
              SCTimer
       ┌────────────┐
       │ Event0 周期控制   │
       │ Event1 占空比控制│
       └────────────┘
                  │
                  ▼
               OUT4
                  │
                  ▼

               WS2812


整个发送过程中:
CPU
  ↓
负责编码

DMA
  ↓
负责传输

SCTimer
  ↓
负责输出波形

5. WS2812时序设计

本例中:

  1. #define WS2812_BIT_PERIOD   188U
  2. #define WS2812_T0H           53U
  3. #define WS2812_T1H          135U
复制代码


SCTimer 时钟:
  1. 150MHz
复制代码
单个 Tick:
  1. 6.67ns
复制代码
Bit周期
  1. 188 × 6.67ns

  2. ≈ 1.253us

  3. ≈ 798kHz
复制代码


逻辑0

  1. 53 × 6.67ns

  2. ≈ 353ns
复制代码
逻辑1
  1. 135 × 6.67ns

  2. ≈ 900ns
复制代码
对应关系:
  1. 0

  2. ┌───┐
  3. │       │
  4. └───┴──────────

  5. 353ns

  6. 1

  7. ┌────────┐
  8. │                  │
  9. └────────┴───

  10. 900ns
复制代码


6. SCTimer Event设计

整个方案仅使用两个 Event。

Event0:周期事件

功能:

  1. Counter Limit
  2. +
  3. 输出置高
复制代码


代码如下:
  1. 1.25us 周期
  2. ``
复制代码
  1. SCTIMER_CreateAndScheduleEvent(
  2.     SCT0,
  3.     kSCTIMER_MatchEventOnly,
  4.     WS2812_BIT_PERIOD - 1U,
  5.     ...
  6. );
复制代码
产生:

  1. 1.25us 周期
  2. ``
复制代码


Event1:占空比事件

功能:

  1. 输出拉低
  2. +
  3. 触发DMA
复制代码
代码:
  1. SCTIMER_SetupOutputClearAction()

  2. SCTIMER_SetupDmaTriggerAction()
复制代码


对应:
  1. 53 Tick
  2. 或
  3. 135 Tick
复制代码


7. MATCHREL双缓冲机制

这是本文最核心的技术点。

SCTimer内部包含:

  1. MATCH
  2. MATCHREL
  3. `
复制代码
两个寄存器。

发送当前Bit时:

  1. MATCH
复制代码
控制当前波形。

DMA同时更新:

  1. MATCHREL
复制代码
当下一周期开始:
  1. MATCHREL
  2.       ↓
  3. 自动装载
  4.       ↓
  5. MATCH
复制代码
形成流水线:
  1. 当前Bit输出
  2.       ↓
  3. DMA准备下一Bit
  4.       ↓
  5. 自动切换
  6.       ↓
  7. 输出下一Bit
复制代码
无需CPU参与。

8. 数据编码过程

LED颜色数据存放于:

  1. g_ledData[][]
复制代码
格式:
  1. GRB
复制代码
发送前调用:
  1. WS2812_PrepareBits();
复制代码
生成:
  1. g_bitValues[]
复制代码
例如:
  1. RGB:

  2. 00 FF 00
复制代码
编码后
  1. 53
  2. 53
  3. 53
  4. 135
  5. 135
  6. ...
复制代码
其中:
  1. 53  -> 表示0

  2. 135 -> 表示1
复制代码
直接作为 MATCHREL 更新值。

9. eDMA配置

DMA数据流向:

  1. g_bitValues[]
  2.       │
  3.       ▼
  4. SCT0->MATCHREL[]
复制代码


配置特点:

Source

  1. 递增
复制代码
读取颜色编码数据。

Destination

  1. 固定地址
复制代码
始终写入:
  1. MATCHREL
复制代码


每次DMA传输
  1. 2Byte
复制代码
对应一个占空比值。

10. 为什么DMA从Bit1开始

代码:

  1. &g_bitValues[1]
复制代码



而非:

  1. &g_bitValues[0]
复制代码



原因是:

Bit0由CPU预装载:


  1. MATCH
  2. MATCHREL
  3. ``
复制代码



随后:


  1. Bit0输出
  2. ↓
  3. DMA准备Bit1
  4. ↓
  5. Bit1输出
  6. ↓
  7. DMA准备Bit2
复制代码



形成连续流水线。


11. 数据发送流程

整体流程:

  1. PrepareBits()

  2.       │

  3. 装载Bit0

  4.       │

  5. 启动DMA

  6.       │

  7. 启动SCTimer

  8.       │

  9. Bit0

  10.       │

  11. DMA→Bit1

  12.       │

  13. Bit1

  14.       │

  15. DMA→Bit2

  16.       │

  17. ...

  18.       │

  19. DMA完成

  20.       │

  21. 输出保持Low

  22.       │

  23. Reset Pulse
复制代码


整个过程中:

  1. 无中断参与发送
  2. 无CPU修改占空比
复制代码


仅依赖:

  1. SCTimer + DMA
复制代码



硬件完成传输。

12. DMA完成处理

DMA Major Loop 完成后进入回调:


  1. WS2812_DmaCallback()
复制代码
主要工作:

  1. 关闭Event0 SET输出
复制代码


即:
  1. 最后一个Bit完成
  2.         ↓
  3. 输出保持Low
复制代码


开始进入 Reset 阶段。

13. Reset Pulse实现

WS2812要求:


  1. Low > 50us
复制代码
本方案采用简单延时:

  1. for(...)
  2. {
  3.     __NOP();
  4. }
  5. ``
复制代码
产生约:
  1. 320us
复制代码
低电平保持时间。

确保 LED 正常锁存。


14. 实验效果

通过逻辑分析仪抓取波形可以观察到:

Bit0


  1. 353ns High
  2. 900ns Low
复制代码
Bit1
  1. 900ns High
  2. 353ns Low
复制代码


周期
  1. 1.25us
复制代码


与 WS2812 标准时序一致。

整个传输过程中 CPU 不参与任何 Bit 级别操作。

15. 总结

本文基于 MCXN947 的 SCTimer 和 eDMA 实现了一种高性能 WS2812 驱动方案。

其核心思想为:

SCTimer Event0 产生固定周期;
SCTimer Event1 产生占空比并触发 DMA;
eDMA 实时更新 MATCHREL;
MATCHREL 自动装载到 MATCH;
全部数据发送均由硬件完成。

相比传统 GPIO 模拟、中断驱动和 SPI 编码方案,该方法具有:

✅ 时序精度高
✅ CPU占用极低
✅ 扩展性能好
✅ 更适合长灯带应用
✅ 充分发挥 MCXN947 SCTimer 特性

对于需要 RGB 灯效、状态指示灯、人机界面和智能照明等应用的开发者而言,SCTimer + eDMA 无疑是 MCXN947 平台上驱动 WS2812 的一种非常优雅且高效的实现方式。



回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /4 下一条

Archiver|手机版|小黑屋|恩智浦技术社区

GMT+8, 2026-11-11 02:46 , Processed in 0.069918 second(s), 19 queries , Redis On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

快速回复 返回顶部 返回列表