最近看不少人玩ws2812b。我搜了一下找到个比较好的。
这个程序是spi+dma的,我修改了下在F030F4上面跑着挺好。大概的意思是E表示1。8表示0。一个字节处理两位。
我想了一下UART+DMA,没有时间做。如果用UART,设置到2.4M,每个位400nS(spec.: 250-550), 反转一下,每三位处理一个bit,高高低表示1(800+400),低低高表示0(800+400)。 这样start+76位,543,210,总共一个字节处理3个位,停止位因为反转了就是低电平,间隔时间不足50uS,应该没影响。
如此,每24/3=8个字节处理一个灯,比SPI的12个字节更少。个位有什么看法。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
请问,查表返回的一个32bit常量放到8位数组buffer里面,那种方法最快?谢谢!
指针,强制类型转换
- void WS2812b_Display(void)
- {
- register unsigned long i;
- register unsigned char temp = 0;
- register unsigned short const *pSrc;
- register unsigned short *pDrc;
- register unsigned short b1, b2, b3;
- pDrc = (unsigned short *)spi_SendBuf;
- for (i = 0; i < 48; i++)//轮询像素缓存区
- {
- temp = ws2812b_PixBuf[i] >> 4;
- pSrc = (unsigned short const *)LUTbl[temp];
- b1 = *pSrc++;
- b2 = *pSrc++;
- b3 = *pSrc++;
- *pDrc++ = b1;
- *pDrc++ = b2;
- *pDrc++ = b3;
- temp = ws2812b_PixBuf[i] & 0x0F;
- pSrc = (unsigned short const *)LUTbl[temp];
- b1 = *pSrc++;
- b2 = *pSrc++;
- b3 = *pSrc++;
- *pDrc++ = b1;
- *pDrc++ = b2;
- *pDrc++ = b3;
- }
- #if 0
- DMA_Cmd(DMA1_Channel3, DISABLE);
- DMA_ClearFlag(DMA1_FLAG_TC3);
- DMA1_Channel3->CNDTR = SENDLENGTH;
- DMA_Cmd(DMA1_Channel3, ENABLE);
- #endif
- }
复制代码对C++不熟悉,高手可以移植这个到stm32就好了,我在arduino下运行很炫,53种模式,可扩展性很强,如果用systick处理里面的step,延时也不消耗cpu资源了。
100灯也就100*24就可以了,我用了5K多主要是我没省着用,还用了HSB颜 {MOD}空间转换保存每一个灯的参数。
是哦,一时没想起来。
一周热门 更多>