国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

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

    文章

    4968

    瀏覽量

    73960
  • esp32s2
    +關注

    關注

    1

    文章

    1

    瀏覽量

    588
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

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

    AD35-S3是深圳市啟明云端有限公司推出的基于ESP32-S3-WROOM-1的新一代桌寵,有豐富的外設接口外,適用于AIoT領域的多種應用場景,例如喚醒詞檢測和語音命令識別、智能家居、智能家電
    的頭像 發表于 02-26 18:05 ?105次閱讀
    【<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 ?1037次閱讀
    <b class='flag-5'>ESP32-S2-MINI-2</b>:高性能、高集成度的物聯網Wi-Fi模組解析

    樂鑫科技ESP32-S3開發板+超聲波霧化,給智能魚缸整點美學氛圍

    我們為什么要給智能魚缸弄上霧化?美學氛圍當然是方面,但更重要的功能是局部加濕,為水面植物與周圍空氣提供柔和濕度。因此我們特意推出本期內容:用樂鑫科技ESP32-S3開發板和超聲波霧化模塊讓水面形成
    的頭像 發表于 12-08 18:04 ?617次閱讀
    樂鑫科技<b class='flag-5'>ESP32-S</b>3開發板+超聲波霧化,給智能魚缸整點美學氛圍

    VSCode + ESP-IDF環境下給ESP32-S3項目添加頭文件

    VSCode + ESP-IDF環境下給ESP32-S3項目添加頭文件
    的頭像 發表于 11-28 07:27 ?2313次閱讀

    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 ?809次閱讀
    低成本開源!用樂鑫科技<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 ?1940次閱讀
    快速上手!帶你用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 ?4329次閱讀
    <b class='flag-5'>ESP32</b> I<b class='flag-5'>2S</b>音頻總線學習筆記(二):I<b class='flag-5'>2S</b>讀取INMP441音頻數據

    樂鑫科技ESP32-S3開發板配單色LED,竟能玩出這么多花樣!代碼開源,速來白嫖!

    從閃爍到呼吸,從流水到追逐,文掌握所有LED特效技巧本文將帶領大家從零開始,使用ESP32-S3開發板實現多種單色LED效果控制。無論你是剛入門的小白,還是有定經驗的開發者,都能輕松復刻這些炫酷
    的頭像 發表于 10-23 18:02 ?2198次閱讀
    樂鑫科技<b class='flag-5'>ESP32-S</b>3開發板配單色LED,竟能玩出這么多花樣!<b class='flag-5'>代碼</b>開源,速來白嫖!

    ESP32-S3的MicroPython開發環境搭建

    本文通過搭建Thonny IDE開發環境,了解了如何給ESP32-S3燒錄MircoPython固件和MircoPython應用程序。
    的頭像 發表于 09-11 16:02 ?1629次閱讀
    <b class='flag-5'>ESP32-S</b>3的MicroPython開發環境搭建

    文讀懂WAV音頻文件格式

    本文主要為后面ESP32 I2S音頻系列文章做鋪墊,所以本篇將介紹WAV音頻文件格式,并通過C代碼生成一段1S的正弦波WAV音頻寫入到SD卡
    的頭像 發表于 08-25 17:49 ?5061次閱讀
    <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 ?929次閱讀
    啟明云端<b class='flag-5'>ESP32-S</b>3 2.8寸串口屏到手了?如何上手?看這篇!

    ESP32-P4 C5開發板燒錄小智全流程!速看!

    沒錯,你沒有看錯!我們帶著WT99P4C5-S1開發板燒錄小智全流程走來了!開發板搭載樂鑫科技ESP32-P4和ESP32-C5芯片,代碼完全開源,支持靈活二次開發。什么?文字教程不好
    的頭像 發表于 07-04 18:03 ?2295次閱讀
    <b class='flag-5'>ESP32</b>-P4 C5開發板燒錄小智全流程!速看!

    ESP32-S3開發板燒錄小智AI系統全流程指南

    在AI語音交互領域不斷發展的今天,開發者們對于功能強大、開源靈活的開發板需求日益增長。今天,我們就來詳細了解ESP32AgentDevKit燒錄小智的全流程,這款搭載樂鑫科技ESP32-S3芯片
    的頭像 發表于 06-16 18:01 ?8173次閱讀
    <b class='flag-5'>ESP32-S</b>3開發板燒錄小智AI系統全流程指南