要使用带有PDMA(直接内存访问)的NUC1262微控制器控制ARGB Gen 1 LED灯,需遵循以下步骤。ARGB Gen 1使用单线归零码协议(每个比特位通过不同占空比表示),核心是精确生成时序信号:
1. 硬件准备
- 连接电路:
ARGB数据线 → NUC1262的PWM输出引脚(如PWM0_CH0)。
- 电源:确保LED和NUC1262共地,ARGB的5V电源稳定(避免电压波动)。
2. 时序协议分析(关键)
ARGB Gen 1协议要求每个比特位周期为 1.25μs:
- 逻辑 '0':高电平
0.4μs + 低电平 0.85μs
- 逻辑 '1':高电平
0.8μs + 低电平 0.45μs
- 复位信号:低电平持续 >50μs(帧结束标志)。
3. NUC1262配置步骤
步骤1: PWM初始化
配置PWM生成基础周期(1.25μs):
// 假设系统时钟 = 48 MHz
PWM_ConfigOutputChannel(PWM0, 0, 800000, 0); // 800kHz = 1.25μs/周期
PWM_SET_CNR(PWM0, 0, 125); // 周期值 = 125 (1.25μs * 48MHz = 60, 近似调整)
PWM_EnableOutput(PWM0, 1 << 0); // 启用PWM0_CH0
PWM_Start(PWM0, 1 << 0);
步骤2: 计算占空比值
根据协议计算占空比:
#define DUTY_LOGIC_0 32 // 0.4μs / 1.25μs * 125 ≈ 40 -> 调整至实际值
#define DUTY_LOGIC_1 80 // 0.8μs / 1.25μs * 125 ≈ 80
#define DUTY_RESET 0 // 低电平(复位信号)
步骤3: 构建PDMA数据缓冲区
将LED颜色数据转换为PWM占空比值序列:
uint16_t pdma_buffer[24 * NUM_LEDS + 40]; // 每个LED 24位 + 40位复位码
void fill_buffer(uint32_t color, uint16_t *buf_pos) {
uint8_t g = (color >> 16) & 0xFF; // ARGB一般为GRB顺序
uint8_t r = (color >> 8) & 0xFF;
uint8_t b = color & 0xFF;
uint32_t grb = (g << 16) | (r << 8) | b;
for (int i = 23; i >= 0; i--) { // MSB First
*buf_pos++ = (grb & (1 << i)) ? DUTY_LOGIC_1 : DUTY_LOGIC_0;
}
}
// 填充所有LED数据
uint16_t *ptr = pdma_buffer;
for (int i = 0; i < NUM_LEDS; i++) {
fill_buffer(led_colors[i], ptr);
ptr += 24;
}
// 添加复位信号
for (int i = 0; i < 40; i++) *ptr++ = DUTY_RESET;
步骤4: PDMA配置
设置PDMA自动传输数据到PWM占空比寄存器:
PDMA_Open(1 << 0); // 启用通道0
PDMA_SetTransferMode(0,
PWM0->PDMACTL |= (1 << 0); // 触发源 = PWM0
PDMA_WIDTH_16, // 16位数据
pdma_buffer, // 源地址
(uint32_t)&PWM0->CMPDAT0, // 目标地址 (PWM占空比寄存器)
DATA_LENGTH, // 传输数据量
PDMA_SAR_INC, // 源地址自增
PDMA_DAR_FIXED // 目标地址固定
);
PDMA_EnableInt(0, PDMA_IER_TEIEN_Msk); // 启用传输完成中断
NVIC_EnableIRQ(PDMA_IRQn);
步骤5: 中断处理
传输完成后关闭PWM:
void PDMA_IRQHandler(void) {
if (PDMA_GET_TD_FLAG(0)) {
PDMA_CLR_TD_FLAG(0);
PWM_Stop(PWM0, 1 << 0); // 帧发送完成
}
}
4. 启动传输
PWM_EnablePDMA(PWM0, 0, PWM_DMA_CMDAT_DONE); // 允许PWM触发PDMA
PDMA_Trigger(0); // 启动PDMA传输
注意事项
- 时序精度:调整
DUTY_LOGIC_0/1 确保示波器测量符合协议(误差<±150ns)。
- 复位信号:复位码长度必须 >50μs(建议60μs)。
- 内存对齐:PDMA缓冲区需32字节对齐(使用
__attribute__((aligned(32))))。
- 颜色顺序:ARGB通常为 GRB 顺序,非RGB。
- 电气隔离:长线缆添加缓冲电路(如74HCT245)。
通过PDMA+PWM的组合,NUC1262可实现无CPU干预的ARGB控制,适用于实时性要求高的场景。调试时建议先控制单颗LED验证时序,再扩展至灯带。