当前位置: 首页 > news >正文

ESP32S3:参考官方提供的led_strip组件使用 SPI + DMA 方式驱动WS2812 RGB灯的实现思路 (实现各个平台移植使用该方式)

目录

    • 引言
    • 使用SPI + DMA 方式实现思路分析
      • 1. 查看WS2812的datasheet手册
      • 2. 根据官方的led_strip组件的方式,自己手把手实现一遍
      • 3.完整的程序(实现霓虹灯效果)

引言

  参考官方提供的led_strip组件使用 SPI + DMA 方式驱动WS2812 RGB灯的实现思路,只有明白实现的思路,方能将其移植到各个平台使用),至于官方提供的led_strip组件我就不在此分析了,大家可以通过终端输入 idf.py add-dependency "espressif/led_strip^2.0.0" 命令下载该组件源码。

使用SPI + DMA 方式实现思路分析

1. 查看WS2812的datasheet手册

  通过手册,了解如何驱动ws2812 RGB灯模块的。下面是我从手册中截取的内容:
在这里插入图片描述
划红线提到,ws2812支持多个级联,每个ws2812会截取24bit数据,其他数据会往下发送给下一级的ws2812,如此类推。这种情况datasheet手册中有提到,如下图所示:
在这里插入图片描述
而datasheet中提到关于每个bit数据0码和1码的时序波形要求,如下图所示:
在这里插入图片描述

2. 根据官方的led_strip组件的方式,自己手把手实现一遍

  首先需要知道,官方提供的led_strip组件使用的SPI频率为2.5MHz,也是每个bit占用的时间是400ns=0.4us,而led_strip组件是使用3个SPI的bit数据表示一个ws2812的bit数据的,也就是说led_strip组件发送一个ws2812的bit数据的时间是3个SPI bit的时间(3x0.4us=1.2us),可以看出led_strip组件发送的一个ws2812的bit数据的时间并不满足>=1.25us,其实大家不要太在意这个,使用3个SPI bit表示一个ws2812的bit数据是经过大量测试验证,是可行、可靠的。如果大家觉得担心,是可以用一个字节的SPI数据来表示一个ws2812的bit数据的,那么8 x (spi clock) >= 1.25 , 也就是spi clock >=0.156us SPI时钟频率带6.4MHz才可行。
  废话不多说,下面是我使用官方提供的led_strip组件使用的SPI频率为2.5MHz方式画的发送一个GRB数据的时序波形图:
在这里插入图片描述
  通过我提供的时序波形图,大家也应该对使用2.5MHz,3个SPI表示一个ws2812的bit数据有清晰的认识了,ws2812的1码通过SPI发送3个bit数据110表示,而ws2812的0码通过SPI发送3个bit数据100表示;也可知道一个ws2812的GRB数据有三个字节,每个字节表示一种颜色,而一种也是需要3字节的SPI数据去实现。那么怎么将这3字节的数据转成将要发送的SPI数据呢?实现代码如下:
在这里插入图片描述
上图的程序已经有很详细的注解了,这里就不再讲解了。

3.完整的程序(实现霓虹灯效果)

/*#######################################################################################################*/
/*                      start   使用ESP32S3 SPI的API函数做的WS2812 LED灯带驱动程序)                      */
/*#######################################################################################################*/
/*** @file spi_ws2812.c* @brief 使用SPI控制WS2812 LED的ESP32-S3优化实现* @note 基于ESP-IDF v5.1 开发,硬件平台:ESP32-S3*/
#include "driver/spi_master.h"
#include "soc/spi_periph.h"
#include "hal/spi_hal.h"
#include "driver/gpio.h"
#include "esp_log.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"/* 宏定义 ----------------------------------------------------------------*/
//   #define TAG "WS2812"                                // 日志标签
#define STRIP_LED_GPIO_PIN       48                 // WS2812数据引脚(必须支持SPI MOSI功能)
#define STRIP_LED_NUMBERS        1                  // LED数量
#define SPI_HOST                 SPI2_HOST          // 使用的SPI控制器(ESP32-S3 SPI2支持高速传输)
#define SPI_CLOCK_SPEED_HZ       (2.5 * 1000 * 1000)// SPI时钟频率(需匹配WS2812时序要求)
#define SPI_DMA_CHANNEL          SPI_DMA_CH_AUTO    // 自动选择DMA通道
#define SPI_TRANS_QUEUE_SIZE     4                  // SPI传输队列深度
#define BYTES_PER_PIXEL          3                  // 每个像素的字节数(GRB格式)
#define BITS_PER_COLOR_BIT       3                  // 每个颜色位对应的SPI数据位数/* 全局变量 --------------------------------------------------------------*/
static uint8_t *pixel_buf = NULL;                   // LED数据缓冲区(DMA要求内存对齐)
static spi_device_handle_t spi_device;              // SPI设备句柄/* 函数声明 --------------------------------------------------------------*/
static void ws2812_encode_color(uint8_t color, uint8_t *buffer);/*** @brief SPI控制器初始化* @note 配置SPI总线参

相关文章:

ESP32S3:参考官方提供的led_strip组件使用 SPI + DMA 方式驱动WS2812 RGB灯的实现思路 (实现各个平台移植使用该方式)

目录 引言使用SPI + DMA 方式实现思路分析1. 查看WS2812的datasheet手册2. 根据官方的led_strip组件的方式,自己手把手实现一遍3.完整的程序(实现霓虹灯效果)引言 参考官方提供的led_strip组件使用 SPI + DMA 方式驱动WS2812 RGB灯的实现思路,只有明白实现的思路,方能将其…...

Http模块及练习

### 作业 1. 静态文件服务器 js const http await import(http) const fs await import(fs) const proc ((req,res)>{ let file ./public${req.url} let FilePath file.replace(favicon.ico,"") // 检查文件是否存在 if (!fs.existsSync(FilePa…...

计算机视觉行业洞察--影像行业系列第一期

计算机视觉行业产业链的上下游构成相对清晰,从基础技术研发到具体应用场景的多个环节相对成熟。 以下是我结合VisionChina经历和行业龙头企业对计算机视觉行业产业链上下游的拆解总结。 上下游总结 上游产业链分为软硬件两类,视觉的硬件主要指芯片、…...

C语言番外篇(3)------------>break、continue

看到我的封面图的时候,部分读者可能认为这和编程有什么关系呢? 实际上这个三个人指的是本篇文章有三个部分组成。 在之前的博客中我们提及到了while循环和for循环,在这里面我们学习了它们的基本语法。今天我们要提及的是关于while循环和for…...

【NLP 31、预训练模型的发展过程】

人的行为,究竟是人所带来的思维方式不同还是与机器一样,刻在脑海里的公式呢? 只是因为不同的人公式不同,所以人的行为才不同,可这又真的是人引以为傲的意识吗? 人脑只是相当于一个大型、驳杂的处理器&#…...

sqlclchery面对复杂的sql语句怎么办

面对复杂的SQL语句时,可以采取以下步骤来简化和解决问题: 理解需求 明确查询的目标,确保清楚需要获取哪些数据。 分解查询 将复杂查询拆分为多个简单部分,逐步构建最终结果。 使用注释 添加注释,解释每个部分的逻辑&…...

C++/JavaScript ⭐算法OJ⭐下一个排列

题目描述 31. Next Permutation A permutation of an array of integers is an arrangement of its members into a sequence or linear order. For example, for arr [1,2,3], the following are all the permutations of arr: [1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1]…...

《Mycat核心技术》第17章:实现MySQL的读写分离

作者:冰河 星球:http://m6z.cn/6aeFbs 博客:https://binghe.gitcode.host 文章汇总:https://binghe.gitcode.host/md/all/all.html 星球项目地址:https://binghe.gitcode.host/md/zsxq/introduce.html 沉淀&#xff0c…...

Windows 11 使用容器(Docker Podman)

文章目录 背景1、相关网站1.1、WSL1.2、Docker1.3、Podman 2、环境3、安装部署3.1、安装 WSL3.2、Docker3.2.1、Docker Desktop3.2.1.1、安装3.2.1.2、拉取镜像3.2.1.3、启动容器 3.3、Podman3.3.1、安装3.3.2、使用3.3.3、异常处理 总结 背景 Windows 系统中使用容器&#xf…...

代码审计入门学习之sql注入

路由规则 入口文件&#xff1a;index.php <?php // ---------------------------------------------------------------------- // | wuzhicms [ 五指互联网站内容管理系统 ] // | Copyright (c) 2014-2015 http://www.wuzhicms.com All rights reserved. // | Licensed …...

2024信息技术、信息安全、网络安全、数据安全等国家标准合集共125份。

2024信息技术、信息安全、网络安全、数据安全等国家标准合集&#xff0c;共125份。 一、2024信息技术标准&#xff08;54份&#xff09; GB_T 17966-2024 信息技术 微处理器系统 浮点运算.pdf GB_T 17969.8-2024 信息技术 对象标识符登记机构操作规程 第8部分&#xff1a;通用…...

element ui的select选择框

我们首先先试一下&#xff0c;这个东西怎么玩的 <el-select v-model"select" change"changeSelect"><el-option value"香蕉"></el-option><el-option value"菠萝"></el-option><el-option value&quo…...

文档检索服务平台

文档检索服务平台是基于Elasticsearch的全文检索&#xff0c;包含数据采集、数据清洗、数据转换、数据检索等模块。 项目地址&#xff1a;Github、国内Gitee 演示地址&#xff1a;http://silianpan.cn/gdss/ 以下是演示角色和账号&#xff08;密码同账号&#xff09;&#xf…...

使用FastAPI进行可视化部署

文章目录 一、FastAPI介绍二、环境配置三、示例代码1.app.py代码如下2.websocket_handler.py 代码如下3.运行app4.遇到的问题与解决 一、FastAPI介绍 FastAPI是一个高性能的Python Web框架&#xff0c;它基于Starlette并利用了 Python类型提示的优势。它可以帮助我们快速构建具…...

设计模式 之 工厂模式(简单工厂模式、工厂方法模式、抽象工厂模式)(C++)

文章目录 C 工厂模式引言一、简单工厂模式概念实现步骤示例代码优缺点 二、工厂方法模式概念实现步骤示例代码优缺点 三、抽象工厂模式概念实现步骤示例代码优缺点 C 工厂模式 引言 在 C 编程中&#xff0c;对象的创建是一个常见且基础的操作。然而&#xff0c;当项目规模逐渐…...

3、Kubernetes 集群部署 Prometheus 和 Grafana

Kubernetes 集群部署 Prometheus 和 Grafana node-exporter 安装Prometheus 安装和配置Prometheus 配置热加载Grafana 安装部署Grafana 配置 实验环境 控制节点/master01 192.168.110.10 工作节点/node01 192.168.110.20 工作节点/node02 192.168.110.30 node-exporter 安装 #…...

【C语言】第八期——指针

目录 1 初始指针 2 获取变量的地址 3 定义指针变量、取地址、取值 3.1 定义指针变量 3.2 取地址、取值 4 对指针变量进行读写操作 5 指针变量作为函数参数 6 数组与指针 6.1 指针元素指向数组 6.2 指针加减运算&#xff08;了解&#xff09; 6.2.1 指针加减具体数字…...

如何在 Mac 上安装并配置 JDK 环境变量

如何在Mac上安装并配置JDK环境变量 在开发过程中&#xff0c;许多应用和框架都需要使用Java&#xff0c;尤其是使用Java开发的应用程序。如果你是Mac用户&#xff0c;以下是安装并配置JDK环境变量的步骤&#xff0c;确保你能顺利运行Java程序。 步骤 1&#xff1a;下载JDK 访…...

【git-hub项目:YOLOs-CPP】本地实现05:项目移植

ok&#xff0c;经过前3个博客&#xff0c;我们实现了项目的跑通。 但是&#xff0c;通常情况下&#xff0c;我们的项目都是需要在其他电脑上也跑通&#xff0c;才对。 然而&#xff0c;经过测试&#xff0c;目前出现了2 个bug。 项目一键下载【⬇️⬇️⬇️】&#xff1a; 精…...

LeetCode 热题 100 206. 反转链表

LeetCode 热题 100 | 206. 反转链表 大家好&#xff0c;今天我们来解决一道经典的算法题——反转链表。这道题在 LeetCode 上被标记为简单难度&#xff0c;要求我们将一个单链表反转&#xff0c;并返回反转后的链表。下面我将详细讲解解题思路&#xff0c;并附上 Python 代码实…...

Oracle查询表空间大小

1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...

无法与IP建立连接,未能下载VSCode服务器

如题&#xff0c;在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈&#xff0c;发现是VSCode版本自动更新惹的祸&#xff01;&#xff01;&#xff01; 在VSCode的帮助->关于这里发现前几天VSCode自动更新了&#xff0c;我的版本号变成了1.100.3 才导致了远程连接出…...

大语言模型如何处理长文本?常用文本分割技术详解

为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

《通信之道——从微积分到 5G》读书总结

第1章 绪 论 1.1 这是一本什么样的书 通信技术&#xff0c;说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号&#xff08;调制&#xff09; 把信息从信号中抽取出来&am…...

基于Docker Compose部署Java微服务项目

一. 创建根项目 根项目&#xff08;父项目&#xff09;主要用于依赖管理 一些需要注意的点&#xff1a; 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件&#xff0c;否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

EtherNet/IP转DeviceNet协议网关详解

一&#xff0c;设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络&#xff0c;本网关连接到EtherNet/IP总线中做为从站使用&#xff0c;连接到DeviceNet总线中做为从站使用。 在自动…...

【python异步多线程】异步多线程爬虫代码示例

claude生成的python多线程、异步代码示例&#xff0c;模拟20个网页的爬取&#xff0c;每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程&#xff1a;允许程序同时执行多个任务&#xff0c;提高IO密集型任务&#xff08;如网络请求&#xff09;的效率…...

自然语言处理——Transformer

自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效&#xff0c;它能挖掘数据中的时序信息以及语义信息&#xff0c;但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN&#xff0c;但是…...

浅谈不同二分算法的查找情况

二分算法原理比较简单&#xff0c;但是实际的算法模板却有很多&#xff0c;这一切都源于二分查找问题中的复杂情况和二分算法的边界处理&#xff0c;以下是博主对一些二分算法查找的情况分析。 需要说明的是&#xff0c;以下二分算法都是基于有序序列为升序有序的情况&#xf…...

C++八股 —— 单例模式

文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全&#xff08;Thread Safety&#xff09; 线程安全是指在多线程环境下&#xff0c;某个函数、类或代码片段能够被多个线程同时调用时&#xff0c;仍能保证数据的一致性和逻辑的正确性&#xf…...