本帖最后由 通宵敲代码 于 2018-5-6 23:34 编辑
上节我们重点介绍了一下WS2812B,
这种内部集成驱动芯片的RGB灯珠,
并通过对驱动信号通信速率的详细计算,
重点说明了STM32等一众单片机通过I/O翻转方式,
控制这种灯珠的困难之处,这篇我们就介绍一下,
如何用最常见的方式来实现STM32对WS2812的控制。
常用STM32的都知道,STM32有8个定时器,
其中TIM1跟TIM8是高级定时器,TIM2345是通用定时器,
TIM67是基本定时器,当然还有个滴答定时器,
其中TIM123458都可以独立控制输出PWM波形,
TIM1跟TIM8还可以输出两组互补PWM波形,
这个功能在电机驱动中十分常用。
STM32定时器的PWM输出功能,
是通过CNT与CCR寄存器的数值比,
直接控制对应引脚输出高低电平的,
也就是说只要我们愿意,可以用定时器直接输出36MHz的方波,
当然波形可能就不那么好看了,
不过用来驱动我们800kbps的WS2812,可以说是绰绰有余了,
但是还有一个问题,通常情况下,
我们的WS2812不会仅仅是一个或者几个LED串联,
如果串联的LED较多的话,又会面临驱动信号的稳定性问题,
毕竟我们要不断地改变定时器CCR的数值,
来控制对应的I/O发送信号0还是信号1,
而项目中我们的单片机又不可能只是用来控制LED,
这时候我们的DMA功能就派上用场了。
这也就是我们今天要介绍的最容易想到的一种方法DMA+PWM,