WS2812B是市面上非常常用的RGB幻彩LED,WS2812B特性如下: 驱动WS2812B常用的方式有SPI、PWM、GPIO模拟PWM等方式。由于WS2812B对时序要求比较严格且时间精度较高(纳秒级),这3种方式各有各的缺点,SPI占用管脚多,PWM每个周期的控制比较困难,GPIO模拟PWM时序容易被干扰。因此,需要使用响应快,效率高的方式解决上述问题。然而,DMA就是解决上述问题的很好办法,DMA不需要CU干预即可执行指定的操作。所以,我在WB415上使用的是PWM+DMA实现了对WS2812B的精准控制,高效的实现了WS2812B各种显示效果。 接下来我们看看具体的实现方法 因为tmr5的时钟为144M,所以800K对应的周期值为180,而WS2812B对应的0和1码对应占空比的值分别为如下 输出频率为800K时,对应0码的高电平为350ns,0码的低电平为900ns 接下来我们看一下灯珠初始化函数,理解一下WS2812B的数据格式 每个灯珠的数据由24bit组成,分为8bitG; 8bit R; 8bit B.所以函数内有2个循环,一个循环为灯珠数,一个循环为bit数。在初始化时为熄灭状态,所以,所有的bit均需要复值为0码。这样操作完,显示状态的数组就配置完了。接下来我们再来看一下PWM输出控制的函数 在中断模式下会涉及到DMA传输完中断和定时器溢出中断,相关说明如下: 至此,使用PWM+DMA控制WS2812B的基本操作就完成了,至于显示效果的函数,请到源码文件内查看,在此就不再多说了,我会附上源码,有需要的可以自己看一下。
|