STM32103 PWM+DMA驱动WS2812B 寄存器版

最近项目上用到WS2812B的LED光源,主控芯片为STM32F103,经过一翻折腾,顺利点亮光源,现分享与大家,仅供参考!

程序没有用ST库,直接操作寄存器完成,如有什么问题,欢迎大家留言交流。

WS2812B的控制原理我这不多说,大家可以搜下,我们直接开始代码的实现。


程序中我们定义两个一维数组,一个是用来存放LED灯RGB的值,存放顺序如下(这个数组可以定义成二维数码)

另外一个数组用来存放前面数组转换成定时器的PWM值,DMA就是直接读取这些数据发送给定时器。其中第一和最后一个数据固定为0,意义就是为了让发送数据开始前和结束后一直是低电平,在整个程序运行过程中,我的定时器一直是在工作的,没有关闭。

PWM输出引脚我用的是定时器3的通道4(TIM3_CH4),触发的DMA的通道3

程序代码如下:

#ifndef __WS281x_H__
#define __WS281x_H__
 
#define TIMER_PERIOD    (60)  //定时器的自动重载值,控制PWM波形的周期
#define WS281x_0        (19)  //0码对应的比较值
#define WS281x_1        (38)  //1码对应的比较值
 
#define LED_NUM         (4)   //LED灯的数量
 
#define LEN_LED_BIT     (LED_NUM * 24 + 2)//加2:第一个和最后一个数据为0,使其输出为低电平
 
 
void WS281xInit(void);
void WS281xSend(void);
void SetRGBData(uint16_t NumLed,uint8_t ValG,uint8_t ValR,uint8_t ValB);
 
#endif // __WS281x_H__
阅读全文