- CH587内置一组可寻址RGB模块(ARGB),可实现单数据线RGB等待时序控制,支持输出0/1高低电平时间和周期的可配置,支持DMA
ARGB介绍-以WS2812为例
- 普通RGB灯通过3路PWM占空比调节RGB三种颜色,ARGB通过单线串行数据,发送“0 码/1 码/RESET 码”
硬件连接
- WS2812采用级联的方式连接,内置信号整形电路,像素点收到信号后经过波形整形再输出
- CH587提供一组接口,通常使用PA9/PB4,PA9和PB4端口需要开启映射
![image]()
数据协议
- 采用单线归零码的通信方式,单线是指只有一根通信线,归零码是指每个码元发送完后,信号必须回到低电平“零”状态,数据一位一位地发送,通常每颗灯 24 位,代表 R/G/B 三个颜色分量。使用单线归零码可以省线、可级联、可单灯寻址、成本低。
- ARGB的1/0编码是通过高低电平保持时间长短来区分的,具体可以查看不同ARGB的手册
![image]()
![image]()
- 数据传输方式
![image]()
- 数据结构
![image]()
ARGB代码示例分析
- ARGB工程代码较简单,主要就是两个函数的配置以及ARGB中断配置
ARGB_Init(ENDIAN_HSB, MODE_DATA, CYCLE_PER_BIT, T1H_CYCLE, T0H_CYCLE, RESET_CYCLE);
void ARGB_Init(ARGB_EndianTypeDef endian, ARGB_ModeTypeDef m, uint16_t T_Bit, uint16_t T_1H, uint16_t T_0H, uint16_t T_Rst)
{
R32_ARGB_DAT_ARR = T_Bit; // 0/1码周期配置
R32_ARGB_CCR = (T_1H << 16) | (T_0H & 0xFFF); // T1H和T0H宽度
R32_ARGB_RST_ARR = T_Rst; // RESET码宽度
R32_ARGB_CTLR = R32_ARGB_CTLR&(~(RB_ARGB_MODE|RB_ARGB_LSB))|(m<<2)|(endian<<3);
}
- ARGB_EndianTypeDef:高/低字节先发送,如0x030000使用低字节发送则为0xc00000
- ARGB_ModeTypeDef:是先发数据后发reset还是先发reset后发数据,大部分的灯带使用MODE_DATA,接收到reset后锁存数据并显示
- T_Bit:0/1码周期配置,1个bit的总周期,单位Tsys
- T_1H/T_0H:数据1/数据0高电平保持时间,单位Tsys;T_Bit必须大于T_1H/T_0H
- T_Rst:RESET保持时间
/*********************************************************************
* @fn ARGB_DMACfg
*
* @brief 配置DMA功能
*
* @param s - 是否打开DMA功能
* @param startAddr - DMA 起始地址,地址必须2字节对齐
* @param endAddr - DMA 结束地址,地址必须2字节对齐
* @param m - 配置DMA模式
*
* @return none
*/
void ARGB_DMACfg(uint8_t s, uint32_t startAddr, uint32_t endAddr, DMAModeTypeDef m)
{
if(s == DISABLE)
{
R32_ARGB_CTLR &= ~RB_ARGB_DMAEN;
}
else
{
R32_ARGB_DMA_BEG = startAddr;
R32_ARGB_DMA_END = endAddr;
R32_ARGB_CTLR1 = R32_ARGB_DMA_END-R32_ARGB_DMA_BEG;
if(m)
{
R32_ARGB_CTLR |= RB_ARGB_DMA_LOOP | RB_ARGB_DMAEN;
}
else
{
R32_ARGB_CTLR &= ~RB_ARGB_DMA_LOOP;
R32_ARGB_CTLR |= RB_ARGB_DMAEN;
}
}
}
- DMA 模式可以配置为单次模式和循环模式,在单次模式时发送一帧就停止,如果要发下一帧需要重新 ARGB_DMACfg()(或重装 BEG/END)再 ARGB_Enable(),否则永远不动,适合每帧都需要修改颜色数据的情形,循环模式则是开启后传输到endaddr后自动回到startaddr继续传输,适合LED颜色固定不变的情况