stm32和ws2812B相对较好的方案。SPI和UART

2019-12-09 19:12发布

最近看不少人玩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个字节更少。个位有什么看法。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
36条回答
20061002838
2019-12-11 06:50
gmyu 发表于 2018-8-16 18:41
请问,查表返回的一个32bit常量放到8位数组buffer里面,那种方法最快?谢谢!  ...

指针,强制类型转换
  1. void WS2812b_Display(void)
  2. {
  3.     register  unsigned long i;
  4.     register  unsigned char temp = 0;

  5.     register  unsigned short const *pSrc;
  6.     register  unsigned short  *pDrc;

  7.     register unsigned short b1, b2, b3;

  8.     pDrc = (unsigned short *)spi_SendBuf;

  9.     for (i = 0; i < 48; i++)//轮询像素缓存区
  10.     {
  11.         temp = ws2812b_PixBuf[i] >> 4;

  12.         pSrc = (unsigned short const *)LUTbl[temp];

  13.         b1 = *pSrc++;
  14.         b2 = *pSrc++;
  15.         b3 = *pSrc++;

  16.         *pDrc++ = b1;
  17.         *pDrc++ = b2;
  18.         *pDrc++ = b3;

  19.         temp = ws2812b_PixBuf[i] & 0x0F;

  20.         pSrc = (unsigned short const *)LUTbl[temp];

  21.         b1 = *pSrc++;
  22.         b2 = *pSrc++;
  23.         b3 = *pSrc++;

  24.         *pDrc++ = b1;
  25.         *pDrc++ = b2;
  26.         *pDrc++ = b3;

  27.     }
  28. #if 0     
  29.     DMA_Cmd(DMA1_Channel3, DISABLE);
  30.     DMA_ClearFlag(DMA1_FLAG_TC3);
  31.     DMA1_Channel3->CNDTR = SENDLENGTH;
  32.     DMA_Cmd(DMA1_Channel3, ENABLE);
  33. #endif   
  34. }
复制代码

一周热门 更多>