找回密码
 立即注册
查看: 813|回复: 7

无法使用双BUF缓冲 驱动ws2812

[复制链接]
已绑定手机

1

主题

3

回帖

37

积分

新手上路

积分
37
发表于 2024-12-4 10:33:21 | 显示全部楼层 |阅读模式
使用梁工的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;
                }

回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:510
  • 最近打卡:2025-06-28 11:31:25
已绑定手机

14

主题

1322

回帖

3416

积分

论坛元老

积分
3416
发表于 2024-12-4 11:13:53 | 显示全部楼层
不知道switch会不会比for高效?

点评

这个场景的话,当然是switch比else if更高效, 先解决浅水区的羁绊再考虑深水区的事似乎也不算太迟  详情 回复 发表于 2024-12-14 10:38
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:480
  • 最近打卡:2025-06-28 00:00:59
已绑定手机

80

主题

5214

回帖

9305

积分

超级版主

DebugLab

积分
9305
发表于 2024-12-4 11:17:35 | 显示全部楼层
一个灯珠3字节应该是200*24=4800吧
2K edata+6K xdata不够用?

截图202412041117056990.jpg


DebugLab
回复 支持 反对

使用道具 举报 送花

已绑定手机

1

主题

3

回帖

37

积分

新手上路

积分
37
发表于 2024-12-4 11:40:01 | 显示全部楼层

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

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:90
  • 最近打卡:2025-06-28 15:37:18

5

主题

50

回帖

733

积分

高级会员

积分
733
发表于 2024-12-4 11:49:53 | 显示全部楼层

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

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

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

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:204
  • 最近打卡:2025-06-28 17:34:38

2

主题

74

回帖

620

积分

高级会员

积分
620
发表于 2024-12-8 23:58:42 | 显示全部楼层

打卡学习

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:346
  • 最近打卡:2025-06-27 11:51:00
已绑定手机

16

主题

311

回帖

1395

积分

金牌会员

积分
1395
发表于 2024-12-14 09:59:41 | 显示全部楼层
数量应该 不是问题,900个,512个的光立方都可以轻松驱动,可以把你驱动的WS2812的子程序都贴出来看看,看看有没什么好办法
AI8051U, 灯光控制板, PWM-DMA 直接驱动 WS2812
https://www.stcaimcu.com/forum.php?mod=viewthread&tid=10860
(出处: 国芯技术交流网站)
专注LED灯控,25年LED从业经验,因为专注所以专业,欢迎大家沟通交流!
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:471
  • 最近打卡:2025-06-28 02:07:15
已绑定手机

38

主题

2243

回帖

2773

积分

荣誉版主

积分
2773
发表于 2024-12-14 10:38:11 | 显示全部楼层
21cns*** 发表于 2024-12-4 11:13
不知道switch会不会比for高效?

这个场景的话,当然是switch比else if更高效,
先解决浅水区的羁绊再考虑深水区的事似乎也不算太迟
睁开眼睛做场梦~~~
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-6-28 21:44 , Processed in 0.246341 second(s), 99 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表