传送门(忘记附上代码了):(WS2812)RGB的通信及驱动总结(SPI + DMA思路)-CSDN博客

/**
 * @brief 保存rgb的颜色数据
 * @param rgb_r rgb的红色通道
 * @param rgb_g rgb的绿色通道
 * @param rgb_b rgb的蓝色通道
 * @param rgb_num 想要亮哪个rgb
 * @note 
 */
uint16_t * rgb_sendbuf = (uint16_t *)rx_buf;
void rgb_colorful_data_reserve(uint8_t rgb_r, uint8_t rgb_g ,uint8_t rgb_b ,uint8_t rgb_num)
{
    uint8_t rgb_data_buf[3] = {rgb_g, rgb_r, rgb_b};
    uint32_t temp = 0;

    //保存颜色数据
    for (uint8_t i = 0; i < 3; i++)
    {
        for (uint g = 0; g < 8; g++)
        {
            if(rgb_data_buf[i] & (0x1 << g))    //判断每一个bit上是逻辑1  还是  逻辑0
            {
                temp |= (0xc << (4*g));     //发送1100   即高电平 表示逻辑1
            }
            else
            {
                temp |= (0x8 << (4*g));     //发送1000   即低电平 表示逻辑0
            }
        }

        //根据rgb_num, 指定存放temp数据,因为数组是uint16的,分两个数组元素去存
        rgb_sendbuf[6*rgb_num + (0+(2*i))] = (temp >> 16) & 0xffff; 
		rgb_sendbuf[6*rgb_num + (1+(2*i))] = temp & 0xffff;
        
        temp = 0;
    }
}

保存数据temp和存放到数组里面的方法值得记录一下

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐