新闻详情

定时器+DMA驱动WS2812B

 二维码
发表时间:2022-03-30 10:13
文章附图

WS2812B的驱动信息


 


从WS2812的数据手册中,可以看出其使用单总线级联的方式进行通信,一组数据包括所有灯珠的显示信息,每组数据之间通过RESET分隔。在同一组数据中,数据每过1个灯珠,减少24位,也就是说每个灯珠都读取收到的前24位数据,作为自己的显示信息,其它的数据接着往下传递,直到遇到RESET信号,然后重新读取24为的数据。

对于每位数据是0还是1,则是通过占空比进行判断的。在这里我选取1.25us为1位数据的周期,300ns的高电平作为T0H,625ns的高电平作为T0L 。

WS2812B的驱动思路

现在需要做的就是不断的改变定时器PWM的占空比,以实现数据的发送。每发送1位数据就要改变一次占空比的值,如果使用中断的方式,那么进入中断的频率就会很高,所以使用DMA的方式是比较合适的。

我这里选择的方式是,使用定时器的更新事件触发DMA的数据传输,DMA使用循环模式一直发送,这样编程比较简单,不需要关注何时发送数据,只需要关注如何修改内存中的数据就行。

对于RESET的发送,从图中可以看出RESET信号是持续280us以上的低电平,那么就可以用高电平占空比为0的PWM信号代替,也就是说224个以1.25us为周期占空比为0的PWM就可以作为RESET信号了。

对外设的设置

外设的设置包括3个部分:IO、DMA和定时器。

IO设置

我使用的是PB4,其AF1的复用功能为TIMER2_CH0 。

  •     rcu_periph_clock_enable(RCU_GPIOB);


  •     gpio_af_set(GPIOB, GPIO_AF_1, GPIO_PIN_4);

  •     gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_4);

  •     gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_4);

DMA的设置

DMA和STM32F1系列不同,GD32L23x中的DMA的通道不再是和外设对应起来的,而是通过复用器去与外设连接,这样每一个通道都可以对应所有的外设,使用起来更加的灵活。

DMA的请求用的是TIMER2的更新事件

  • DMA_REQUEST_TIMER2_UP

,注意这个事件需要和TIMER设置里的事件对应起来,否则无法触发DMA。


DMA设置为循环模式

  • dma_circulation_enable(DMA_CH0);


  • void dma_config(void)

  • {

  •     dma_parameter_struct dma_data_parameter;

  •     rcu_periph_clock_enable(RCU_DMA);

  •     dma_deinit(DMA_CH0);


  •     dma_data_parameter.periph_addr   = (uint32_t)TIMER2_CH0CV;

  •     dma_data_parameter.periph_inc   = DMA_PERIPH_INCREASE_DISABLE;

  •     dma_data_parameter.memory_addr   = (uint32_t)(&buffer);

  •     dma_data_parameter.memory_inc   = DMA_MEMORY_INCREASE_ENABLE;

  •     dma_data_parameter.periph_width = DMA_PERIPHERAL_WIDTH_16BIT;

  •     dma_data_parameter.memory_width = DMA_MEMORY_WIDTH_16BIT;

  •     dma_data_parameter.direction    = DMA_MEMORY_TO_PERIPHERAL;

  •     dma_data_parameter.number       = SIZE_OF_BUFFER;

  •     dma_data_parameter.priority     = DMA_PRIORITY_HIGH;

  •     dma_data_parameter.request      = DMA_REQUEST_TIMER2_UP;

  •     dma_init(DMA_CH0, &dma_data_parameter);

  •     dma_circulation_enable(DMA_CH0);


  •     dma_channel_enable(DMA_CH0);

  • }

TIMER2的设置

定时器的设置包含三部分:

  1. 时基单元

  2. 输出模式

  3. DMA事件设置

时基单元配置为1.25us的周期。输出模式使用的是PWM0的模式,同时使能TIMER2的

  • TIMER_DMA_UPD

DMA请求。


  • void timer_config(void)

  • {

  •     timer_oc_parameter_struct timer_ocinitpara;

  •     timer_parameter_struct timer_initpara;

  •     timer_ic_parameter_struct timer_icinitpara;


  •     rcu_periph_clock_enable(RCU_TIMER2);


  •     timer_deinit(TIMER2);

  •     timer_struct_para_init(&timer_initpara);

  •     timer_initpara.prescaler        = 0;

  •     timer_initpara.alignedmode      = TIMER_COUNTER_EDGE;

  •     timer_initpara.counterdirection = TIMER_COUNTER_UP;

  •     timer_initpara.period           = 79;

  •     timer_initpara.clockdivision    = TIMER_CKDIV_DIV1;

  •     timer_init(TIMER2, &timer_initpara);

  •     timer_channel_output_struct_para_init(&timer_ocinitpara);


  •     timer_ocinitpara.outputstate    = TIMER_CCX_ENABLE;

  •     timer_ocinitpara.ocpolarity     = TIMER_OC_POLARITY_HIGH;

  •     timer_channel_output_config(TIMER2, TIMER_CH_0, &timer_ocinitpara);

  •     timer_channel_output_pulse_value_config(TIMER2, TIMER_CH_0, 0);

  •     timer_channel_output_mode_config(TIMER2, TIMER_CH_0, TIMER_OC_MODE_PWM0);


  •     timer_dma_enable(TIMER2, TIMER_DMA_UPD);


  •     timer_auto_reload_shadow_enable(TIMER2);

  • }


驱动代码

驱动代码包括了两大部分:

  1. 使能定时器

  2. 将颜色数据放入内存中

使能定时器

注意不要直接使能定时器,而是要先产生1次更新事件,然后再使能定时器。因为这样才能将内存中的第一个数据放入到定时器的中。

  •     timer_event_software_generate(TIMER2,TIMER_EVENT_SRC_UPG);

  •     timer_enable(TIMER2);

将颜色数据放入内存中

需要做的工作有2个:

  1. 将颜色的数据转化成定时器比较值寄存器中的数据

  2. 转化数据格式:常用的颜色数据是RGB数据,而WS2812中颜色的存放顺序是GRB。

  • #define T1H_COUNT   40//对于WS2812输出位1时,PWM的计数值

  • #define T0H_COUNT   15//对于WS2812输出位0时,PWM的计数值

  • void change_color_to_bit(uint32_t rgb_color,uint16_t* bit)

  • {

  • uint32_t temp = rgb_color;

  • int i;

  • uint16_t temp_bit;

  • for(i=0;i<24;i++){

  • if(temp & 0x00000001){

  • bit[23-i] = T1H_COUNT;

  • }else{

  • bit[23-i] = T0H_COUNT ;

  • }

  • temp = temp>>1;

  • }

  • for(i=0;i<8;i++){

  • temp_bit = bit;

  • bit = bit[8+i];

  • bit[8+i] = temp_bit;

  • }

  • }

上面的代码将颜色数据转化成比较值寄存器中的值。

效果展示

直接拍摄的效果不太好,用一张白纸遮着的效果要好一些。



最新文章
2025-03-19
2025-03-19
2025-03-19
2025-03-18
2025-03-19
2025-03-18
2025-03-18
2025-03-18
2025-03-18
2025-03-18
随机文章
LED光源的种类很多,不同的LED灯,内部结构所用的灯珠也会有细微差别。今天,小编为大家全面、系统地科普一下LED灯珠的常见类型,供大家参考使用。LED光源可以分为两大类:芯片类光源和替换类光源。芯片类光源1引脚插入型(DIP)这种LED灯珠是结构最简单的发光二极管,因为灯珠下面有两根形似“脚”的细丝,可以直接穿接在电路板上,所以称之为引脚插入式的灯珠。使用特点:它的安全性好、性能稳定,在低...
日前,富采投控旗下晶电与錼创科技全资子公司錼创显示宣布合作,将由錼创显示协助其建置6英寸Micro LED生产线。目前Micro LED大型显示器是前驱产品,尽管仍有技术与成本问题待克服,不过TrendForce集邦咨询同步看好Micro LED运用于头戴式的AR穿透式智慧眼镜、穿戴式的智慧手表以及车用的智慧驾驶座舱及透明显示产品的发展,有望刺激Micro LED高阶应用产品的诞生,预估至2...
  LED电子显示屏很重要的组成部分就有LED单元板,如果单元板有问题,会直影响LED显示屏的整体质量!所以,如何辨别LED单元板的好坏是LED显示屏商家关心的问题,下面整理了一些检测LED单元板的常见方法。  一、材质  1. LED单元板板材  有些LED单元板厂家为了低价竞争,采用廉价的阻燃纸质板或者是单面纤维板作为LED灯的PCB线路板。因为全玻纤PCB板很贵。刚开始看不出差别,一般...
  8月17日,福建泉州市2022年重大项目视频连线开工活动在晋江举行。据悉,晋江市此次共22个项目集中开工,总投资965.5亿元,涵盖光电显示等多个领域。  此次集中开工活动中,位于高端制造产业园的MiniLED封装产业项目作为安溪县的代表性重大项目,向全市展示开工场面。    图片来源:安溪县融媒体中心  据悉,安溪县MiniLED封装产业项目总投资11.67亿元,年度计划投资1.5亿元...
  1:幻彩灯珠简介  1.1 幻彩内置IC灯珠的特点  幻彩内置IC灯泡主要有两个部分:一个是LED,另一个是IC晶体管。LED部分负责产生光,而IC晶体管则负责控制LED的亮度和颜色。通常情况下,一个幻彩内置IC灯泡包含三个不同颜色的LED:红、 绿、 和 蓝 (RGB) 。 控制晶体 管开关的电流大小,来调整 LED的亮度。而通过不同比例地控制三个 LED的亮度,可以得到不同颜色的光。...
  led灯在我们的生活中使用极广,同时在使用led灯时还会出现一些故障,如只发弱光,甚至是不亮了。面对这些情况应该怎么办?  一、led灯只发弱光怎么回事  电源参数主要注意两个,一个是瓦数,一个是电源输出电压(也就是灯板上的输入DC电压)。  也可能是灯的驱动电源损坏了,若是独立电源,可买个相同规格的更换,若是一体的,建议整灯更换。  还有可能是led灯泡的问题,也可以再买个灯泡看看。 ...
  led灯是现代生活中再常见不过的灯具,人们选择led灯时会考虑其使用寿命,更需要注意保养。究竟led灯怎么保养?  一、led灯的使用寿命多少  正常来说,led灯的使用寿命差不多都是能够达到4万小时到5万小时的,这个跟led灯的品牌和性能是有很大的关系的,像大品牌的led灯各方面还是比较有保障的,使用寿命久,而且质量也是非常不错的,不容易出现问题。  现在led灯的应用还是非常广泛的,...
  led灯不亮怎么回事  led灯是我们生活中再常见不过的灯具,led灯在使用过程中容易出现不亮的情况,究竟是怎么回事?不亮的话怎么修理呢  一、led灯不亮怎么回事  1、led灯条的焊接点有虚焊现象,运输过程中的震动造成焊点脱落而导致灯带不亮。  2、焊锡质量不好,led灯条在弯折的过程中焊点容易产生脆裂、脱落现象。  3、安装时弯折角度过大,造成led灯条焊点与铜箔分离而导致不亮。 ...
  对于led灯人们都并不陌生,甚至我们生活中大部分灯具都是led灯,led灯在使用过程中可能会出现一些问题,如不亮或者变弱的问题   一、led灯不亮怎么办  1、关掉开关,在折叠梯子的帮助下,拆掉led吸顶灯的外壳,并检查灯管是否出现发黑发暗的地方。如果有,很有可能是灯管已经损坏了。必须更换了,这种LED灯管在五金商店里面可以买到,建议选择知名品牌。  2、如果灯管还是完好的,那么应该试...

关于天成    产品中心    新闻资讯    技术支持    人力资源    联系方式

联系我们

----------------------------------------------

销售热线:181 2996 9297

电话:4008-320-328 /   0755-29573979   

传真:0755-29573533

邮件:tczm@tczmled.com   邮编:518000

地址::深圳市光明区凤凰街道长凤路263号天成高新园

邮箱:jiangeng@tczmled.com   (投诉与合作)


(关注我们)
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________

友情链接:天成高科集团   TCWIN led超声波光源LED灯带 |   泰兴减速机‍ | led幻彩灯珠‍ ‍‍ | 波峰焊‍ |   滚针轴承|   高温退火炉   |   试验筛 |   螺旋叶片 |   青岛电缆桥架‍‍ | N80石油套管‍   | 玻璃钢冷却塔‍ | 西安装修公司

登录
登录
其他账号登录:
我的资料
留言
回到顶部