当前位置: 首页> 科技> IT业 > 基于STM32的HAL库的WS2812幻彩灯驱动程序

基于STM32的HAL库的WS2812幻彩灯驱动程序

时间:2025/7/23 11:37:57来源:https://blog.csdn.net/jacklood/article/details/140335398 浏览次数:1次

1、WS2812幻彩灯带有三条接线,5V、GND和控制信号线,利用单片机的SPI引脚可以发出不同频率协议的脉冲即可实现对幻彩灯带的各个灯珠的颜色和亮灭的控制。

2、幻彩灯带驱动代码如下:

(1)ws2812.c

#include "ws2812.h"
#include "spi.h"
#include "dma.h"// 常用的颜色
const RGBColor_TypeDef RED      = {30 ,0  ,  0};
const RGBColor_TypeDef GREEN    = {0  , 30,  0};
const RGBColor_TypeDef BLUE     = {0  ,  0, 30};
const RGBColor_TypeDef YELLOW   = { 30, 30,  0};
const RGBColor_TypeDef MAGENTA  = { 30,  0, 30};
const RGBColor_TypeDef BLACK    = {  0,  0,  0};
const RGBColor_TypeDef WHITE    = { 30, 30, 30};//模拟bit码:0xC0 为 0,0xF8 为 1
const uint8_t code[]={0xC0,0xF8};
//灯颜色缓存区
RGBColor_TypeDef RGB_DAT[RGB_NUM];//SPI底层发送接口,一次发24个字节,相当于1个灯
extern DMA_HandleTypeDef hdma_spi3_tx;
static void SPI_Send(uint8_t *SPI_RGB_BUFFER)
{/* 判断上次DMA有没有传输完成 */while(HAL_DMA_GetState(&hdma_spi3_tx) != HAL_DMA_STATE_READY);/* 发送一个(24bit)的 RGB 数据到 2812 */HAL_SPI_Transmit_DMA(&hspi3,SPI_RGB_BUFFER,24);  
}
//颜色设置函数,传入 ID 和 颜色,进而设置缓存区
void RGB_Set_Color(uint8_t LedId, RGBColor_TypeDef Color)  
{if(LedId < RGB_NUM){RGB_DAT[LedId].G = Color.G;RGB_DAT[LedId].R = Color.R;RGB_DAT[LedId].B = Color.B;}
}
//刷新函数,将颜色缓存区刷新到WS2812,输入参数是指定的刷新长度
void RGB_Reflash(uint8_t reflash_num)
{static uint8_t RGB_BUFFER[24]={0};uint8_t dat_b,dat_r,dat_g;//将数组颜色转化为 24 个要发送的字节数据if(reflash_num>0 && reflash_num<=RGB_NUM){for(int i=0;i<reflash_num;i++){dat_g = RGB_DAT[i].G;dat_r = RGB_DAT[i].R;dat_b = RGB_DAT[i].B;for(int j=0;j<8;j++){RGB_BUFFER[7-j] =code[dat_g & 0x01];RGB_BUFFER[15-j]=code[dat_r & 0x01];RGB_BUFFER[23-j]=code[dat_b & 0x01];dat_g >>=1;dat_r >>=1;dat_b >>=1;}SPI_Send(RGB_BUFFER);}}
}
//复位函数
void RGB_RST(void)
{uint8_t dat[100] = {0};/* 判断上次DMA有没有传输完成 */while(HAL_DMA_GetState(&hdma_spi3_tx) != HAL_DMA_STATE_READY);/* RGB RESET */HAL_SPI_Transmit_DMA(&hspi3,dat,100); HAL_Delay(10);
}//常用颜色的点亮测试函数
void RGB_RED(uint16_t RGB_LEN)
{uint8_t i;for(i=0;i<RGB_LEN;i++)  RGB_Set_Color(i,RED);RGB_Reflash(RGB_LEN);
}
void RGB_GREEN(uint16_t RGB_LEN)
{uint8_t i;for(i=0;i<RGB_LEN;i++)  RGB_Set_Color(i,GREEN);RGB_Reflash(RGB_LEN);
}
void RGB_BLUE(uint16_t RGB_LEN)
{uint8_t i;for(i=0;i<RGB_LEN;i++)  RGB_Set_Color(i,BLUE);RGB_Reflash(RGB_LEN);
}
void RGB_YELLOW(uint16_t RGB_LEN)
{uint8_t i;for(i=0;i<RGB_LEN;i++)  RGB_Set_Color(i,YELLOW);RGB_Reflash(RGB_LEN);
}
void RGB_MAGENTA(uint16_t RGB_LEN)
{uint8_t i;for(i=0;i<RGB_LEN;i++)  RGB_Set_Color(i,MAGENTA);RGB_Reflash(RGB_LEN);
}
void RGB_BLACK(uint16_t RGB_LEN)
{uint8_t i;for(i=0;i<RGB_LEN;i++)  RGB_Set_Color(i,BLACK);RGB_Reflash(RGB_LEN);
}
void RGB_WHITE(uint16_t RGB_LEN)
{uint8_t i;for(i=0;i<RGB_LEN;i++)  RGB_Set_Color(i,WHITE);RGB_Reflash(RGB_LEN);
}

(2)ws2812.h

#ifndef __WS2812_H
#define __WS2812_H#include "main.h"typedef struct				//颜色结构体
{uint8_t R;uint8_t G;uint8_t B;
}RGBColor_TypeDef;#define RGB_NUM    60	// RGB数量// 复位函数
void RGB_RST(void);
// 颜色设置函数
void RGB_Set_Color(uint8_t LedId, RGBColor_TypeDef Color);
// RGB 刷新函数
void RGB_Reflash(uint8_t reflash_num);// 各种颜色测试
void RGB_RED(uint16_t RGB_LEN);		//红
void RGB_GREEN(uint16_t RGB_LEN);		//绿
void RGB_BLUE(uint16_t RGB_LEN);		//蓝
void RGB_YELLOW(uint16_t RGB_LEN);		//黄
void RGB_MAGENTA(uint16_t RGB_LEN);	//紫
void RGB_BLACK(uint16_t RGB_LEN);		//黑
void RGB_WHITE(uint16_t RGB_LEN);		//白#endif /* __WS2812_H */

 (3)main函数中的调用

 while (1){RGB_WHITE(60);HAL_Delay(100);RGB_YELLOW(59);HAL_Delay(100);RGB_BLUE(58);HAL_Delay(100);	RGB_GREEN(57);HAL_Delay(100);RGB_RED(56);HAL_Delay(100);	/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}

需要注意的是,还需要cubeMX开启DMA和SPI,并在while循环之前调用

  MX_SPI3_Init();  MX_DMA_Init();(但这两句为自动生成,只要开启DMA和SPI就行)

关键字:基于STM32的HAL库的WS2812幻彩灯驱动程序

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: