欢迎光临散文网 会员登陆 & 注册

11-多个WS2812灯珠的点亮

2023-03-06 11:05 作者:O老师讲32  | 我要投稿

今天看到一位同学在群里面的留言,要我写一个长串WS2812点亮的程序,因为时间不多,于是简单地写了一个,该程序使用DMA+SPI2来发送数据,使用的是环芯智能科技的开发板(淘宝店铺:环芯智能实验室),灯珠是淘宝买的,一共12颗。下面分享一下:

一、STM32CubeMX的设置

这里的设置主要是SPI模块的设置,我们采用SPI模块来发送颜色数据。其设置如下:

1.设置SPI的通信参数,如图1所示

图1  SPI2的参数设置

2.SPI2的DMA的设置,如图2所示

图2 SPI2的DMA的设置

关于这些设置,我们在SPI接口和DMA中都已经给出了详细的解释,所以这里就不再啰嗦了。

二、主函数的内容

int main(void)

{

  /* USER CODE BEGIN 1 */

       uint32_t col[12] = {0xff,0x00ff00,0xff0000,0xffffff,0xfff, \

                       0xfff0,0xfff000,0xffffff,0xff0000,0xf00,\

                       0x0f0,0xfff0};

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */

  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */

  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */

  MX_GPIO_Init();

  MX_DMA_Init();

  MX_SPI2_Init();

  /* USER CODE BEGIN 2 */

       WS2812_ShowMany_GRB(col, sizeof(col));

  /* USER CODE END 2 */

  /* Infinite loop */

  /* USER CODE BEGIN WHILE */

  while (1)

  {

    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */

  }

  /* USER CODE END 3 */

}

 

主函数中实际上只有两条语句是自己实现,其他都由CubeMX生成。一条是定义12个灯珠的颜色数组,一个是调用显示多个灯珠的函数。

三、WS2812模块的内容

首先来看ws2812.c的内容,如下所示

#include "ws2812.h"

 

#define LED_NUM           12u          //灯的数量

#define RESET_WORD  350u                  //复位长度

#define SPI_DATALEN (RESET_WORD + 24u*LED_NUM)

 

extern SPI_HandleTypeDef hspi2;

uint8_t buf[SPI_DATALEN] = {0};

/******************************************************/

void WS2812_ShowMany_GRB(uint32_t grb[], uint8_t num)

{

       uint16_t i = 0, j = 0;

       for(i = 0; i < num; i++ )

       {

              for(j = 0; j < 24u; j ++)

              {

                     if(grb[i] & (1<<(23u -j)))

                            buf[RESET_WORD + i*24u+j] = CODE_1;

                     else

                            buf[RESET_WORD + i*24u+j] = CODE_0;

              }            

       }     

       HAL_SPI_Transmit_DMA(&hspi2, buf, sizeof(buf));

}

/******************************************************/

在ws2812.c中,我们实现一个转换颜色数据并通过DMA发到到目标灯串的函数。

 

ws2812.h的内容如下:

#ifndef _WS2812_H

#define _WS2812_H

 

#include "main.h"

 

#define CODE_1 0XFC

#define CODE_0 0XC0

 

void WS2812_ShowMany_GRB(uint32_t grb[], uint8_t num);

#endif

四、实验结果

最终的结果如图3所示。

图3 实验结果

五、电路连接

整个电路连接图如图4所示。

图4 电路连接图

3根线中,一根是5V,一根是地,还有一根是PB15(SPI2的MOSI接口)。

 

反复测试了几次,貌似正确。

更多信息可以关注公众号:   O老师讲32 

或者直接扫码添加


11-多个WS2812灯珠的点亮的评论 (共 条)

分享到微博请遵守国家法律