今天看到一位同学在群里面的留言,要我写一个长串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接口)。
反复测试了几次,效果还不错。
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
dma
+关注
关注
3文章
582浏览量
106277 -
GPIO
+关注
关注
16文章
1333浏览量
56458 -
SPI通信
+关注
关注
0文章
41浏览量
12011 -
WS2812
+关注
关注
0文章
35浏览量
7209 -
stm32cubemx
+关注
关注
5文章
290浏览量
17485
发布评论请先 登录
相关推荐
热点推荐
【瑞萨RA6E2地奇星开发板试用】点亮 WS2812 全彩点阵屏
通过单总线方式控制,只需一个 IO 口,就可以点亮数千个灯珠。
这里使用 RA6E2 点亮 WS2812
发表于 12-27 03:28
如何用ATtiny85控制WS2812灯珠
文章目录前言一、硬件1.引入库二、软件1.引入库总结前言之前就答应过大家要把ATtiny85芯片玩出更多花样。用ATtiny85控制WS2812灯珠,我们可以玩出花来,甚至做成点阵屏幕都可以。这一
发表于 12-10 07:12
Arduino控制WS2812灯带的方法
形与一个5050LED灯珠相同,每个元件即为一个像素点。像素点内部包含了智能数字接口数据锁存信号整形放大电路,还包括有高精度的内部振荡器和可编程电流控制部分,有效保证了像素点的颜色高度一致。1)FastLED库FastLED 是一款功能强大、简单易用的控制
发表于 01-12 08:08
【BPI-Pico-RP2040 开发板】+WS2812彩灯效果制作
MAXIMUM_NUM_NEOPIXELS 7”时,使用7个灯珠的WS2812灯带,则其显示效果如图9至图11所示。图9点亮绿色LED图1
发表于 03-22 12:48
如何进行WS2812的面板灯制作详细资料合集免费下载
本文档的主要内容详细介绍的是如何进行WS2812的面板灯制作详细资料合集免费下载包括了:DMX512转WS2812 面板灯程序,STC8系列单片机技术参考手册,
发表于 05-29 17:36
•167次下载
STM32F103C8T6+PWM+DMA驱动 WS2812灯带
#STM32+PWM+DMA驱动 WS2812灯带#文章目录1.理论:2代码:理论:使用STM32F103C8T6驱动WS2812灯带,每个灯
发表于 12-27 19:29
•229次下载
论如何使用WS2812以及类似灯珠
WS2812 LED灯珠,这是一种非常流行的可寻址RGB LED。每个WS2812 LED内部集成了控制电路,因此可以通过一个数据输入线来单独控制每一个LED的颜色和亮度。这种特
多个WS2812灯珠的点亮实验
评论