在线时间2300 小时
UID3253523
注册时间2016-3-21
NXP金币3646
该用户从未签到
超级版主
 
- 积分
- 29488
- 最后登录
- 2026-11-10
|
本帖最后由 小恩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 共需要接收:
数据接收完成后自动锁存,并将剩余数据继续传递给下一级 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时序设计
本例中:
- #define WS2812_BIT_PERIOD 188U
- #define WS2812_T0H 53U
- #define WS2812_T1H 135U
复制代码
SCTimer 时钟:
单个 Tick:
Bit周期
- 188 × 6.67ns
- ≈ 1.253us
- ≈ 798kHz
复制代码
逻辑0
逻辑1
对应关系:
- 0
- ┌───┐
- │ │
- └───┴──────────
- 353ns
- 1
- ┌────────┐
- │ │
- └────────┴───
- 900ns
复制代码
6. SCTimer Event设计
整个方案仅使用两个 Event。
Event0:周期事件
功能:
代码如下:
- SCTIMER_CreateAndScheduleEvent(
- SCT0,
- kSCTIMER_MatchEventOnly,
- WS2812_BIT_PERIOD - 1U,
- ...
- );
复制代码 产生:
Event1:占空比事件
功能:
代码:
- SCTIMER_SetupOutputClearAction()
- SCTIMER_SetupDmaTriggerAction()
复制代码
对应:
7. MATCHREL双缓冲机制
这是本文最核心的技术点。
SCTimer内部包含:
两个寄存器。
发送当前Bit时:
控制当前波形。
DMA同时更新:
当下一周期开始:
形成流水线:
- 当前Bit输出
- ↓
- DMA准备下一Bit
- ↓
- 自动切换
- ↓
- 输出下一Bit
复制代码 无需CPU参与。
8. 数据编码过程
LED颜色数据存放于:
格式:
发送前调用:
生成:
例如:
编码后
其中:
直接作为 MATCHREL 更新值。
9. eDMA配置
DMA数据流向:
- g_bitValues[]
- │
- ▼
- SCT0->MATCHREL[]
复制代码
配置特点:
Source
读取颜色编码数据。
Destination
始终写入:
每次DMA传输
对应一个占空比值。
10. 为什么DMA从Bit1开始
代码:
而非:
原因是:
Bit0由CPU预装载:
随后:
- Bit0输出
- ↓
- DMA准备Bit1
- ↓
- Bit1输出
- ↓
- DMA准备Bit2
复制代码
形成连续流水线。
11. 数据发送流程
整体流程:
- PrepareBits()
- │
- 装载Bit0
- │
- 启动DMA
- │
- 启动SCTimer
- │
- Bit0
- │
- DMA→Bit1
- │
- Bit1
- │
- DMA→Bit2
- │
- ...
- │
- DMA完成
- │
- 输出保持Low
- │
- Reset Pulse
复制代码
整个过程中:
仅依赖:
硬件完成传输。
12. DMA完成处理
DMA Major Loop 完成后进入回调:
主要工作:
即:
开始进入 Reset 阶段。
13. Reset Pulse实现
WS2812要求:
本方案采用简单延时:
产生约:
低电平保持时间。
确保 LED 正常锁存。
14. 实验效果
通过逻辑分析仪抓取波形可以观察到:
Bit0
Bit1
周期
与 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 的一种非常优雅且高效的实现方式。
|
|