CH587_ARGB模块使用

  • 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颜色固定不变的情况
posted @ 2026-09-28 15:15  J_02346  阅读(11)  评论(0)    收藏  举报