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

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就行)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/44407.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【利用GroundingDINO裁剪分类任务的数据集】及文本提示检测图像任意目标(Grounding DINO) 的使用

文章目录 背景1.Grounding DINO安装2.裁剪指定目标的脚本 背景 在处理公开数据集ImageNet-21k的时候发现里面有很多的数据有问题&#xff0c;比如&#xff0c;数据目标有很多背景&#xff0c;且部分类别有其他种类的图片。针对数据目标有很多背景&#xff0c;公开数据集ImageNe…

【数据库】Redis主从复制、哨兵模式、集群

目录 一、Redis的主从复制 1.1 主从复制的架构 1.2 主从复制的作用 1.3 注意事项 1.4 主从复制用到的命令 1.5 主从复制流程 1.6 主从复制实现 1.7 结束主从复制 1.8 主从复制优化配置 二、哨兵模式 2.1 哨兵模式原理 2.2 哨兵的三个定时任务 2.3 哨兵的结构 2.4 哨…

ArkUI开发学习随机——B站视频简介页面,美团购买界面

案例一&#xff1a;B站视频简介页面 代码&#xff1a; build() {Column(){Column(){Stack(){Image($r("app.media.genimpact")).width(200).height(125).borderRadius({topLeft:5,topRight:5})Row(){Image($r("app.media.bz_play")).height(24).fillColor…

【人工智能】Transformers之Pipeline(概述):30w+大模型极简应用

​​​​​​​ 目录 一、引言 二、pipeline库 2.1 概述 2.2 使用task实例化pipeline对象 2.2.1 基于task实例化“自动语音识别” 2.2.2 task列表 2.2.3 task默认模型 2.3 使用model实例化pipeline对象 2.3.1 基于model实例化“自动语音识别” 2.3.2 查看model与task…

如何通过Java操作Redis?——Jedis!

简介 在redis命令行客户端中操作redis是否可行&#xff1f;可行&#xff0c;但不方便且不是主流的方式。最终还是要通过Java代码来操作~ Redis的底层通信是遵守RESP协议的&#xff0c;一些第三方的库就实现了这些协议&#xff0c;然后封装好API&#xff0c;程序猿通过封装好的…

IEC62056标准体系简介-4.IEC62056-53 COSEM应用层

为在通信介质中传输COSEM对象模型&#xff0c;IEC62056参照OSI参考模型&#xff0c;制定了简化的三层通信模型&#xff0c;包括应用层、数据链路层&#xff08;或中间协议层&#xff09;和物理层&#xff0c;如图6所示。COSEM应用层完成对COSEM对象的属性和方法的访问&#xff…

01MFC建立单个文件类型——画线

文章目录 选择模式初始化文件作用解析各初始化文件解析类导向创建鼠标按键按下抬起操作函数添加一个变量记录起始位置注意事项代码实现效果图虚实/颜色线选择模式 初始化文件作用解析 运行: 各初始化文件解析 MFC(Microsoft Foundation Classes)是一个C++类库,用于在Win…

昇思25天学习打卡营第16天|基于MindSpore通过GPT实现情感分类

今天的这个代码几乎没有任何解释&#xff0c;结合之前GPT生成文本摘要的代码。 大概记录一下 import numpy as np # 导入NumPy库def process_dataset(dataset, tokenizer, max_seq_len512, batch_size4, shuffleFalse): # 判断当前设备是否为Ascend&#xff0c;如果是ascen的…

防御课综合实验

实验拓扑&#xff1a; 实验要求&#xff1a; 1、DMZ区内的服务器&#xff0c;办公区仅能在办公时间内&#xff08;9点到18点&#xff09;可以访问&#xff0c;生产区的设备全天可以访问 2、生产区不允许访问互联网&#xff0c;办公区和游客区允许访问互联网 3、办公区设备10…

二叉平衡树(左单旋,右单旋,左右双旋、右左双旋)

一、AVL树&#xff08;二叉平衡树&#xff1a;高度平衡的二叉搜索树&#xff09; 0、二叉平衡树 左右子树高度差不超过1的二叉搜索树。 public class AVLTree{static class AVLTreeNode {public TreeNode left null; // 节点的左孩子public TreeNode right null; // 节点的…

Java 中的异常处理机制是如何工作的?请解释 try-catch-finally 的基本用法?

Java中的异常处理机制是确保程序稳健性的重要组成部分&#xff0c;它允许程序在遇到错误或异常情况时&#xff0c;能够优雅地处理问题&#xff0c;而不是直接崩溃。 这一机制的核心在于使用try-catch-finally结构&#xff0c;以及通过throw和throws关键字来抛出和声明异常。 …

基于Transformer的端到端的目标检测 | 读论文

本文正在参加 人工智能创作者扶持计划 提及到计算机视觉的目标检测&#xff0c;我们一般会最先想到卷积神经网络&#xff08;CNN&#xff09;&#xff0c;因为这算是目标检测领域的开山之作了&#xff0c;在很长的一段时间里人们都折服于卷积神经网络在图像处理领域的优势&…

Vue2.0和Vue3.0的区别?

Vue.js 3.0 相较于 Vue.js 2.0 在多个方面进行了改进和优化&#xff0c;主要包括以下几点&#xff1a; 性能提升&#xff1a; Vue 3.0 使用了新的响应式系统&#xff0c;称为“Proxy-based”&#xff0c;相比于 Vue 2.0 的“Object.defineProperty”&#xff0c;更加高效。 编…

【深度学习基础】安装包报错——MAC M3-MAX芯片安装scikit-learn库报错。

目录 一、问题描述二、解决方法 一、问题描述 首先想安装scikit-learn库在mac终端显示顺利安装完成&#xff0c;但是测试的时候报错如下所示&#xff1a; /opt/anaconda3/envs/dtc/bin/python /Users/chenfaquan/PycharmProjects/TimeSeries/data_create.py Traceback (most…

论文 | REACT: SYNERGIZING REASONING AND ACTING INLANGUAGE MODELS

本文首先认为&#xff0c;到目前为止&#xff0c;LLM 在语言理解方面令人印象深刻&#xff0c;它们已被用来生成 CoT&#xff08;思想链&#xff09;来解决一些问题&#xff0c;它们也被用于执行和计划生成。 尽管这两者是分开研究的&#xff0c;但本文旨在以交错的方式将推理…

JSP入门基础

JSP入门基础 软件开发环境这门课程的复习资料 Web开发技术概述 URL的组成部分 协议、主机DNS名或IP地址和文件名 Tomcat服务器 Tomcat服务器的默认端口号是8080 概念 软件开发环境是围绕着软件开发的一定目标而组织在一起的一组相关软件工具的有机集合 JSP和HTML的区别…

range()用法

range(n)&#xff1a;是Python中的函数&#xff0c;作用是可以生成 [0, n)之间的正数range(a,b) :生成[a,b)之间的正数数字&#xff0c;不包含brange(start, end, step)&#xff1a;生成的数值规则--- [start, end) 步长是 step,默认 1 详见&#xff1a;http://t.csdnimg.cn/7…

科研入门笔记

自学参考&#xff1a; 沐神论文精读系列 如何读论文 通常&#xff0c;一篇论文的结构为&#xff1a; title标题abstract摘要introduction介绍method方法experiments实验conclusion结论 一篇论文可以考虑读1~3遍 第一遍 海选&#xff1a;标题、摘要、结论&#xff0c;选读方…

SPE连接器技术革新汽车制造业

概述 新的SPE标准在汽车制造业中的应用正日益受到重视&#xff0c;它不仅推动了汽车通信技术的革新&#xff0c;还对汽车性能测试方法产生了深远影响。本文将详细探讨SPE标准在汽车制造业中的应用案例分析&#xff0c;以及它对供应链的挑战与机遇。 SPE标准在汽车制造业中的应…

[leetcode]subarray-product-less-than-k 乘积小于K的子数组

. - 力扣&#xff08;LeetCode&#xff09; class Solution { public:int numSubarrayProductLessThanK(vector<int>& nums, int k) {if (k 0) {return 0;}int n nums.size();vector<double> logPrefix(n 1);for (int i 0; i < n; i) {logPrefix[i 1] …