WS2812 DMA 传输问题

#define PIXEL_NUM       256

#define END_LED_NUM     (PIXEL_NUM-1)

#define PIXEL_COLUMN 16

#define PIXEL_ROW     16

#define BRINGNESS       64


#define NUM             (24*PIXEL_NUM + 300)        // Reset 280us / 1.25us = 224

#define WS1             37

#define WS0             18



__attribute__((aligned(4))) uint32_t WS281xBuf[NUM];


void WS2812B_Init(void)

{


    GPIOB_ModeCfg(GPIO_Pin_11, GPIO_ModeOut_PP_5mA);


    GPIOPinRemap(ENABLE, RB_PIN_TMR2);


    PRINT("TMR2 DMA PWM\n");


    TMR2_PWMCycleCfg(75); // 周期 1.25us


    ARGB_FillRGB(0,0,0);

  //  WS281X_ALL_LED(0); //缓冲区清零


    TMR2_DMACfg(ENABLE,(uint16_t)(uint32_t)&WS281xBuf[0],(uint16_t)(uint32_t)&WS281xBuf[NUM], Mode_LOOP);


    TMR2_PWMInit(High_Level, PWM_Times_1);


    TMR2_ClearITFlag(TMR1_2_IT_DMA_END);


//    PFIC_EnableIRQ(TMR2_IRQn);

//

//    TMR2_ITCfg(ENABLE, TMR1_2_IT_DMA_END);



}

网上找的例程驱动256 颗WS2812 灯珠,显示正常。所需的字节是(24*PIXEL_NUM + 300)*4 =25776 ,内存浪费严重。请教下如何精简?修改uint32_t WS281xBuf[NUM] 数组为uint16_t 类型,灯不亮了

是因为DMA缓存区地址必须4字节对齐吗?有没有更好的建议呢,驱动256颗灯内存就不够用了。 


DMA缓存地址必须4字节对齐,这是手册中标注的硬性要求。

不用TMR的PWM功能,改用SPI模拟波形,可以节省ram。您可以留个邮箱,给您发demo。


个人信息保护,已隐藏  谢谢,用的芯片是CH582M。另外请教一下,将所有数据分批用DMA发送到PWM,这样能否实现


只有CH573做的SPI协议的WS2812灯驱,已发送至邮箱。
没有试过TMR方式分批发。读flash、memcpy到ram中,需要一定的时间开销,如果中途命令断了,灯效要从灯带头开始刷新了。


麻烦也发一份例程给我 谢谢  个人信息保护,已隐藏

因为我SPI被其他设备使用了 我自己用模拟的方式点亮了ws2812b 但是会出现灯闪烁其他颜色的问题

是否用PWM可以解决这个问题 有PWM例程吗?



个人信息保护,已隐藏麻烦发送一份


已发送至邮箱,请查收。
CH573的ram资源有限,在应对灯珠数量较多的灯带时建议使用SPI;若灯珠数量不多,用定时器+DMA产生PWM的方式也是可以驱动的。“灯闪烁其他颜色”最好是抓个波形分析,检查哪一段波形有偏差。


SPI模拟波形 WS2812 个人信息保护,已隐藏 麻烦发送一份


已发送至邮箱,请查收。


spi+dma上电的时候第一个灯颜色异常是什么情况


查看SPI发送的数据,抓取波形,并判断跟灯的颜色是否对应的上。

可以看下初始化的电平是否跟灯控颜色波形一致。


只有登录才能回复,可以选择微信账号登录