0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

一段ESP32S2代码

丙丁先生的自学旅程 来源:丙丁先生的自学旅程 作者:丙丁先生的自学旅 2025-11-11 07:25 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

/*

* SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD

*

* SPDX-License-Identifier: Apache-2.0

*/


#include "esp_check.h"

#include "led_strip_rmt_encoder.h"


static const char *TAG = "led_rmt_encoder";


typedef struct {

rmt_encoder_t base;

rmt_encoder_t *bytes_encoder;

rmt_encoder_t *copy_encoder;

int state;

rmt_symbol_word_t reset_code;

} rmt_led_strip_encoder_t;


static size_t rmt_encode_led_strip(rmt_encoder_t *encoder, rmt_channel_handle_t channel, const void *primary_data, size_t data_size, rmt_encode_state_t *ret_state)

{

rmt_led_strip_encoder_t *led_encoder = __containerof(encoder, rmt_led_strip_encoder_t, base);

rmt_encoder_handle_t bytes_encoder = led_encoder->bytes_encoder;

rmt_encoder_handle_t copy_encoder = led_encoder->copy_encoder;

rmt_encode_state_t session_state = 0;

rmt_encode_state_t state = 0;

size_t encoded_symbols = 0;

switch (led_encoder->state) {

case 0: // send RGB data

encoded_symbols += bytes_encoder->encode(bytes_encoder, channel, primary_data, data_size, &session_state);

if (session_state & RMT_ENCODING_COMPLETE) {

led_encoder->state = 1; // switch to next state when current encoding session finished

}

if (session_state & RMT_ENCODING_MEM_FULL) {

state |= RMT_ENCODING_MEM_FULL;

goto out; // yield if there's no free space for encoding artifacts

}

// fall-through

case 1: // send reset code

encoded_symbols += copy_encoder->encode(copy_encoder, channel, &led_encoder->reset_code,

sizeof(led_encoder->reset_code), &session_state);

if (session_state & RMT_ENCODING_COMPLETE) {

led_encoder->state = 0; // back to the initial encoding session

state |= RMT_ENCODING_COMPLETE;

}

if (session_state & RMT_ENCODING_MEM_FULL) {

state |= RMT_ENCODING_MEM_FULL;

goto out; // yield if there's no free space for encoding artifacts

}

}

out:

*ret_state = state;

return encoded_symbols;

}


static esp_err_t rmt_del_led_strip_encoder(rmt_encoder_t *encoder)

{

rmt_led_strip_encoder_t *led_encoder = __containerof(encoder, rmt_led_strip_encoder_t, base);

rmt_del_encoder(led_encoder->bytes_encoder);

rmt_del_encoder(led_encoder->copy_encoder);

free(led_encoder);

return ESP_OK;

}


static esp_err_t rmt_led_strip_encoder_reset(rmt_encoder_t *encoder)

{

rmt_led_strip_encoder_t *led_encoder = __containerof(encoder, rmt_led_strip_encoder_t, base);

rmt_encoder_reset(led_encoder->bytes_encoder);

rmt_encoder_reset(led_encoder->copy_encoder);

led_encoder->state = 0;

return ESP_OK;

}


esp_err_t rmt_new_led_strip_encoder(const led_strip_encoder_config_t *config, rmt_encoder_handle_t *ret_encoder)

{

esp_err_t ret = ESP_OK;

rmt_led_strip_encoder_t *led_encoder = NULL;

ESP_GOTO_ON_FALSE(config && ret_encoder, ESP_ERR_INVALID_ARG, err, TAG, "invalid argument");

ESP_GOTO_ON_FALSE(config->led_model < LED_MODEL_INVALID, ESP_ERR_INVALID_ARG, err, TAG, "invalid led model");

led_encoder = calloc(1, sizeof(rmt_led_strip_encoder_t));

ESP_GOTO_ON_FALSE(led_encoder, ESP_ERR_NO_MEM, err, TAG, "no mem for led strip encoder");

led_encoder->base.encode = rmt_encode_led_strip;

led_encoder->base.del = rmt_del_led_strip_encoder;

led_encoder->base.reset = rmt_led_strip_encoder_reset;

rmt_bytes_encoder_config_t bytes_encoder_config;

uint32_t reset_ticks = config->resolution / 1000000 * 280 / 2; // reset code duration defaults to 280us to accomodate WS2812B-V5

if (config->led_model == LED_MODEL_SK6812) {

bytes_encoder_config = (rmt_bytes_encoder_config_t) {

.bit0 = {

.level0 = 1,

.duration0 = 0.3 * config->resolution / 1000000, // T0H=0.3us

.level1 = 0,

.duration1 = 0.9 * config->resolution / 1000000, // T0L=0.9us

},

.bit1 = {

.level0 = 1,

.duration0 = 0.6 * config->resolution / 1000000, // T1H=0.6us

.level1 = 0,

.duration1 = 0.6 * config->resolution / 1000000, // T1L=0.6us

},

.flags.msb_first = 1 // SK6812 transfer bit order: G7...G0R7...R0B7...B0(W7...W0)

};

} else if (config->led_model == LED_MODEL_WS2812) {

// different led strip might have its own timing requirements, following parameter is for WS2812

bytes_encoder_config = (rmt_bytes_encoder_config_t) {

.bit0 = {

.level0 = 1,

.duration0 = 0.3 * config->resolution / 1000000, // T0H=0.3us

.level1 = 0,

.duration1 = 0.9 * config->resolution / 1000000, // T0L=0.9us

},

.bit1 = {

.level0 = 1,

.duration0 = 0.9 * config->resolution / 1000000, // T1H=0.9us

.level1 = 0,

.duration1 = 0.3 * config->resolution / 1000000, // T1L=0.3us

},

.flags.msb_first = 1 // WS2812 transfer bit order: G7...G0R7...R0B7...B0

};

} else if (config->led_model == LED_MODEL_WS2811) {

// different led strip might have its own timing requirements, following parameter is for WS2811

bytes_encoder_config = (rmt_bytes_encoder_config_t) {

.bit0 = {

.level0 = 1,

.duration0 = 0.5 * config->resolution / 1000000., // T0H=0.5us

.level1 = 0,

.duration1 = 2.0 * config->resolution / 1000000., // T0L=2.0us

},

.bit1 = {

.level0 = 1,

.duration0 = 1.2 * config->resolution / 1000000., // T1H=1.2us

.level1 = 0,

.duration1 = 1.3 * config->resolution / 1000000., // T1L=1.3us

},

.flags.msb_first = 1

};

reset_ticks = config->resolution / 1000000 * 50 / 2; // divide by 2... signal is sent twice

} else {

assert(false);

}

ESP_GOTO_ON_ERROR(rmt_new_bytes_encoder(&bytes_encoder_config, &led_encoder->bytes_encoder), err, TAG, "create bytes encoder failed");

rmt_copy_encoder_config_t copy_encoder_config = {};

ESP_GOTO_ON_ERROR(rmt_new_copy_encoder(©_encoder_config, &led_encoder->copy_encoder), err, TAG, "create copy encoder failed");


led_encoder->reset_code = (rmt_symbol_word_t) {

.level0 = 0,

.duration0 = reset_ticks,

.level1 = 0,

.duration1 = reset_ticks,

};

*ret_encoder = &led_encoder->base;

return ESP_OK;

err:

if (led_encoder) {

if (led_encoder->bytes_encoder) {

rmt_del_encoder(led_encoder->bytes_encoder);

}

if (led_encoder->copy_encoder) {

rmt_del_encoder(led_encoder->copy_encoder);

}

free(led_encoder);

}

return ret;

}



审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 代码
    +关注

    关注

    30

    文章

    4978

    浏览量

    74446
  • esp32s2
    +关注

    关注

    1

    文章

    1

    浏览量

    678
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    ESP32/ESP8266开发板单向对多ESP-NOW无线通信

    通过ESP-NOW无线通信协议实现ESP32开发板向多个ESP32/ESP 8266开发板发送数据。
    的头像 发表于 03-13 09:23 335次阅读
    <b class='flag-5'>ESP32</b>/<b class='flag-5'>ESP</b>8266开发板单向<b class='flag-5'>一</b>对多<b class='flag-5'>ESP</b>-NOW无线通信

    ESP32-S3系列】AD35-S3(AI红色桌宠)上手指南

    AD35-S3是深圳市启明云端有限公司推出的基于ESP32-S3-WROOM-1的新一代桌宠,有丰富的外设接口外,适用于AIoT领域的多种应用场景,例如唤醒词检测和语音命令识别、智能家居、智能家电
    的头像 发表于 02-26 18:05 435次阅读
    【<b class='flag-5'>ESP32-S</b>3系列】AD35-<b class='flag-5'>S</b>3(AI红色桌宠)上手指南

    ESP32-S2-MINI-2:高性能、高集成度的物联网Wi-Fi模组解析

    ESP32-S2-MINI-2款紧凑的2.4 GHz Wi-Fi(802.11 b/g/n)模块,内置ESP32-S2 系列芯片(版本v1.0),搭载Xtensa单核32位LX7微控制器。该模块
    的头像 发表于 02-04 17:43 1278次阅读
    <b class='flag-5'>ESP32-S2-MINI-2</b>:高性能、高集成度的物联网Wi-Fi模组解析

    乐鑫科技ESP32-S3开发板+超声波雾化,给智能鱼缸整点美学氛围

    我们为什么要给智能鱼缸弄上雾化?美学氛围当然是方面,但更重要的功能是局部加湿,为水面植物与周围空气提供柔和湿度。因此我们特意推出本期内容:用乐鑫科技ESP32-S3开发板和超声波雾化模块让水面形成
    的头像 发表于 12-08 18:04 1001次阅读
    乐鑫科技<b class='flag-5'>ESP32-S</b>3开发板+超声波雾化,给智能鱼缸整点美学氛围

    VSCode + ESP-IDF环境下给ESP32-S3项目添加头文件

    VSCode + ESP-IDF环境下给ESP32-S3项目添加头文件
    的头像 发表于 11-28 07:27 3288次阅读

    ESP32S工具链

    Xtensa LX6 ESP32ESP32-S2 xtensa-esp-elf 早期ESP32的基础架构 2. 对你的影响 你正在开发
    发表于 11-26 07:33

    #ESP32S3野牛小智

    ESP32
    丙丁先生
    发布于 :2025年11月25日 08:34:06

    低成本开源!用乐鑫科技ESP32-S3开发板轻松驱动无刷电机,保姆级教程来了!

    想用ESP32-S3开发板驱动无刷电机却不知从何下手?本教程将手把手教你完成从硬件连接到软件编程的全流程,无论你是新手还是有定经验的开发者,都能轻松掌握!本教程代码已全部开源!后台私信关键词
    的头像 发表于 11-06 18:03 1187次阅读
    低成本开源!用乐鑫科技<b class='flag-5'>ESP32-S</b>3开发板轻松驱动无刷电机,保姆级教程来了!

    快速上手!带你用LVGL工具完成乐鑫科技ESP32-S3 2.8寸串口屏UI开发!代码完全开源!

    酷炫的LVGL界面效果!本教程代码全部开源!后台私信关键词“S3-2.8寸屏LVGL开发“自动获取ESP32-S32.8寸串口屏LVGL开发源代码百度网盘链接!串
    的头像 发表于 10-30 18:04 2473次阅读
    快速上手!带你用LVGL工具完成乐鑫科技<b class='flag-5'>ESP32-S</b>3 2.8寸串口屏UI开发!<b class='flag-5'>代码</b>完全开源!

    ESP32 I2S音频总线学习笔记(二):I2S读取INMP441音频数据

    在这上篇文章中,我们介绍了ESP32 I2S音频总线的相关知识,简要了解了什么是I2S总线、它的通信格式,以及相关的底层API函数,这篇文章将介绍
    的头像 发表于 10-23 19:55 5053次阅读
    <b class='flag-5'>ESP32</b> I<b class='flag-5'>2S</b>音频总线学习笔记(二):I<b class='flag-5'>2S</b>读取INMP441音频数据

    ESP32-S3的MicroPython开发环境搭建

    本文通过搭建Thonny IDE开发环境,了解了如何给ESP32-S3烧录MircoPython固件和MircoPython应用程序。
    的头像 发表于 09-11 16:02 2078次阅读
    <b class='flag-5'>ESP32-S</b>3的MicroPython开发环境搭建

    文读懂WAV音频文件格式

    本文主要为后面ESP32 I2S音频系列文章做铺垫,所以本篇将介绍WAV音频文件格式,并通过C代码生成一段1S的正弦波WAV音频写入到SD卡
    的头像 发表于 08-25 17:49 5569次阅读
    <b class='flag-5'>一</b>文读懂WAV音频文件格式

    启明云端ESP32-S3 2.8寸串口屏到手了?如何上手?看这篇!

    【场外插播】ESP32-S32.8寸串口屏、MX1.25-7P线、MX1.25-8P线我们都带来了,开箱展示如下【竞猜继续】ESP32-S32.8寸串口屏到手还不知道如何上手点屏?不要担心,我们的上手指南来了!
    的头像 发表于 07-07 18:04 1168次阅读
    启明云端<b class='flag-5'>ESP32-S</b>3 2.8寸串口屏到手了?如何上手?看这篇!

    ESP32-P4 C5开发板烧录小智全流程!速看!

    没错,你没有看错!我们带着WT99P4C5-S1开发板烧录小智全流程走来了!开发板搭载乐鑫科技ESP32-P4和ESP32-C5芯片,代码完全开源,支持灵活二次开发。什么?文字教程不好
    的头像 发表于 07-04 18:03 2987次阅读
    <b class='flag-5'>ESP32</b>-P4 C5开发板烧录小智全流程!速看!

    ESP32-S3开发板烧录小智AI系统全流程指南

    在AI语音交互领域不断发展的今天,开发者们对于功能强大、开源灵活的开发板需求日益增长。今天,我们就来详细了解ESP32AgentDevKit烧录小智的全流程,这款搭载乐鑫科技ESP32-S3芯片
    的头像 发表于 06-16 18:01 8995次阅读
    <b class='flag-5'>ESP32-S</b>3开发板烧录小智AI系统全流程指南