BUG无边 发表于 2024-12-4 10:33:21

无法使用双BUF缓冲 驱动ws2812

使用梁工的SPIDMA程序点亮2812过程中由于我的程序中变量使用比较多,使用的灯珠200多颗,光DMA缓冲区就要200*12=2400的内存,内存不够用所以准备改用双BUF缓冲,一个发送之后装载另一个,理想很丰满结果很打脸,调试过程发现装填速度根本跟不上发送速度。我用的是G8K64 用30M跑用梁工程序装填一个字节竟然需要7us,改进了一下算法还是需要3us ,又把频率调到最高45M,装一个字节仍然需要2us,还是超过发送一个字节的速度,依然无法使用下面是装填程序和改良后的求助梁工有什么好的方法加快使用双BUF??
for(i=0, j=0; i<x; i++)//
                {
                        LD = 0;       
                        dat = *(sp);
                        sp++;
                        for(k=0; k<4; k++)
                        {
                                temp=dat & 0xC0;
                                if(temp==0)
                                  *spibuf=0x88;
                                else if(temp==0x80)
                                  *spibuf= 0xC8;
                                else if(temp==0x40)
                                  *spibuf= 0x8C;
                                else
                                  *spibuf= 0xCC;                       
//                                if(dat & 0x80)        *spibuf= 0xC0;        //数据1
//                                else                        *spibuf= 0x80;        //数据0
//                                if(dat & 0x40)        *spibuf |= 0x0C;        //数据1
//                                else                        *spibuf |= 0x08;        //数据0
                               
                                dat <<= 2;
                                spibuf++;
                                j++;
                        }
               LD = 1;
                }

21cnsound 发表于 2024-12-4 11:13:53

不知道switch会不会比for高效?

DebugLab 发表于 2024-12-4 11:17:35

一个灯珠3字节应该是200*24=4800吧
2K edata+6K xdata不够用?




BUG无边 发表于 2024-12-4 11:40:01

我这项目不光点灯还有很多json和CAN数据处理所以内存吃紧,看好这颗芯片的原因是有双CAN外设但是终究还是51的运算能力太弱:cahan:

rm543 发表于 2024-12-4 11:49:53

把for里面的++改成--,对0判断,不要对数值判断,会提高判断速度。

如果需要更快,把固定次数的for循环全部展开,不需要判断是最快的。

然后还可以把temp的数值改成直接写入SPI的数值,取消判断,再提高速度。

STC企鹅 发表于 2024-12-8 23:58:42

<p>打卡学习</p>

VECENT_LIN 发表于 2024-12-14 09:59:41

数量应该 不是问题,900个,512个的光立方都可以轻松驱动,可以把你驱动的WS2812的子程序都贴出来看看,看看有没什么好办法
AI8051U, 灯光控制板, PWM-DMA 直接驱动 WS2812
https://www.stcaimcu.com/forum.php?mod=viewthread&tid=10860
(出处: 国芯技术交流网站)

晓飛飛 发表于 2024-12-14 10:38:11

21cnsound 发表于 2024-12-4 11:13
不知道switch会不会比for高效?

这个场景的话,当然是switch比else if更高效,
先解决浅水区的羁绊再考虑深水区的事似乎也不算太迟
页: [1]
查看完整版本: 无法使用双BUF缓冲 驱动ws2812