91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

一段ESP32S2代碼

丙丁先生的自學(xué)旅程 ? 來(lái)源:丙丁先生的自學(xué)旅程 ? 作者:丙丁先生的自學(xué)旅 ? 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;

}



審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4968

    瀏覽量

    74009
  • esp32s2
    +關(guān)注

    關(guān)注

    1

    文章

    1

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

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

    AD35-S3是深圳市啟明云端有限公司推出的基于ESP32-S3-WROOM-1的新一代桌寵,有豐富的外設(shè)接口外,適用于AIoT領(lǐng)域的多種應(yīng)用場(chǎng)景,例如喚醒詞檢測(cè)和語(yǔ)音命令識(shí)別、智能家居、智能家電
    的頭像 發(fā)表于 02-26 18:05 ?124次閱讀
    【<b class='flag-5'>ESP32-S</b>3系列】AD35-<b class='flag-5'>S</b>3(AI紅色桌寵)上手指南

    ESP32-S2-MINI-2:高性能、高集成度的物聯(lián)網(wǎng)Wi-Fi模組解析

    ESP32-S2-MINI-2款緊湊的2.4 GHz Wi-Fi(802.11 b/g/n)模塊,內(nèi)置ESP32-S2 系列芯片(版本v1.0),搭載Xtensa單核32位LX7微控制器。該模塊
    的頭像 發(fā)表于 02-04 17:43 ?1057次閱讀
    <b class='flag-5'>ESP32-S2-MINI-2</b>:高性能、高集成度的物聯(lián)網(wǎng)Wi-Fi模組解析

    樂(lè)鑫科技ESP32-S3開(kāi)發(fā)板+超聲波霧化,給智能魚(yú)缸整點(diǎn)美學(xué)氛圍

    我們?yōu)槭裁匆o智能魚(yú)缸弄上霧化?美學(xué)氛圍當(dāng)然是方面,但更重要的功能是局部加濕,為水面植物與周?chē)諝馓峁┤岷蜐穸?。因此我們特意推出本期?nèi)容:用樂(lè)鑫科技ESP32-S3開(kāi)發(fā)板和超聲波霧化模塊讓水面形成
    的頭像 發(fā)表于 12-08 18:04 ?636次閱讀
    樂(lè)鑫科技<b class='flag-5'>ESP32-S</b>3開(kāi)發(fā)板+超聲波霧化,給智能魚(yú)缸整點(diǎn)美學(xué)氛圍

    VSCode + ESP-IDF環(huán)境下給ESP32-S3項(xiàng)目添加頭文件

    VSCode + ESP-IDF環(huán)境下給ESP32-S3項(xiàng)目添加頭文件
    的頭像 發(fā)表于 11-28 07:27 ?2386次閱讀

    ESP32S工具鏈

    Xtensa LX6 ESP32、ESP32-S2 xtensa-esp-elf 早期ESP32的基礎(chǔ)架構(gòu) 2. 對(duì)你的影響 你正在開(kāi)發(fā)
    發(fā)表于 11-26 07:33

    #ESP32S3野牛小智

    ESP32
    丙丁先生
    發(fā)布于 :2025年11月25日 08:34:06

    低成本開(kāi)源!用樂(lè)鑫科技ESP32-S3開(kāi)發(fā)板輕松驅(qū)動(dòng)無(wú)刷電機(jī),保姆級(jí)教程來(lái)了!

    想用ESP32-S3開(kāi)發(fā)板驅(qū)動(dòng)無(wú)刷電機(jī)卻不知從何下手?本教程將手把手教你完成從硬件連接到軟件編程的全流程,無(wú)論你是新手還是有定經(jīng)驗(yàn)的開(kāi)發(fā)者,都能輕松掌握!本教程代碼已全部開(kāi)源!后臺(tái)私信關(guān)鍵詞
    的頭像 發(fā)表于 11-06 18:03 ?838次閱讀
    低成本開(kāi)源!用樂(lè)鑫科技<b class='flag-5'>ESP32-S</b>3開(kāi)發(fā)板輕松驅(qū)動(dòng)無(wú)刷電機(jī),保姆級(jí)教程來(lái)了!

    快速上手!帶你用LVGL工具完成樂(lè)鑫科技ESP32-S3 2.8寸串口屏UI開(kāi)發(fā)!代碼完全開(kāi)源!

    酷炫的LVGL界面效果!本教程代碼全部開(kāi)源!后臺(tái)私信關(guān)鍵詞“S3-2.8寸屏LVGL開(kāi)發(fā)“自動(dòng)獲取ESP32-S32.8寸串口屏LVGL開(kāi)發(fā)源代碼百度網(wǎng)盤(pán)鏈接!串
    的頭像 發(fā)表于 10-30 18:04 ?1976次閱讀
    快速上手!帶你用LVGL工具完成樂(lè)鑫科技<b class='flag-5'>ESP32-S</b>3 2.8寸串口屏UI開(kāi)發(fā)!<b class='flag-5'>代碼</b>完全開(kāi)源!

    ESP32 I2S音頻總線(xiàn)學(xué)習(xí)筆記(二):I2S讀取INMP441音頻數(shù)據(jù)

    在這上篇文章中,我們介紹了ESP32 I2S音頻總線(xiàn)的相關(guān)知識(shí),簡(jiǎn)要了解了什么是I2S總線(xiàn)、它的通信格式,以及相關(guān)的底層API函數(shù),這篇文章將介紹
    的頭像 發(fā)表于 10-23 19:55 ?4380次閱讀
    <b class='flag-5'>ESP32</b> I<b class='flag-5'>2S</b>音頻總線(xiàn)學(xué)習(xí)筆記(二):I<b class='flag-5'>2S</b>讀取INMP441音頻數(shù)據(jù)

    樂(lè)鑫科技ESP32-S3開(kāi)發(fā)板配單色LED,竟能玩出這么多花樣!代碼開(kāi)源,速來(lái)白嫖!

    從閃爍到呼吸,從流水到追逐,文掌握所有LED特效技巧本文將帶領(lǐng)大家從零開(kāi)始,使用ESP32-S3開(kāi)發(fā)板實(shí)現(xiàn)多種單色LED效果控制。無(wú)論你是剛?cè)腴T(mén)的小白,還是有定經(jīng)驗(yàn)的開(kāi)發(fā)者,都能輕松復(fù)刻這些炫酷
    的頭像 發(fā)表于 10-23 18:02 ?2217次閱讀
    樂(lè)鑫科技<b class='flag-5'>ESP32-S</b>3開(kāi)發(fā)板配單色LED,竟能玩出這么多花樣!<b class='flag-5'>代碼</b>開(kāi)源,速來(lái)白嫖!

    ESP32-S3的MicroPython開(kāi)發(fā)環(huán)境搭建

    本文通過(guò)搭建Thonny IDE開(kāi)發(fā)環(huán)境,了解了如何給ESP32-S3燒錄MircoPython固件和MircoPython應(yīng)用程序。
    的頭像 發(fā)表于 09-11 16:02 ?1657次閱讀
    <b class='flag-5'>ESP32-S</b>3的MicroPython開(kāi)發(fā)環(huán)境搭建

    文讀懂WAV音頻文件格式

    本文主要為后面ESP32 I2S音頻系列文章做鋪墊,所以本篇將介紹WAV音頻文件格式,并通過(guò)C代碼生成一段1S的正弦波WAV音頻寫(xiě)入到SD卡
    的頭像 發(fā)表于 08-25 17:49 ?5124次閱讀
    <b class='flag-5'>一</b>文讀懂WAV音頻文件格式

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

    【場(chǎng)外插播】ESP32-S32.8寸串口屏、MX1.25-7P線(xiàn)、MX1.25-8P線(xiàn)我們都帶來(lái)了,開(kāi)箱展示如下【競(jìng)猜繼續(xù)】ESP32-S32.8寸串口屏到手還不知道如何上手點(diǎn)屏?不要擔(dān)心,我們的上手指南來(lái)了!
    的頭像 發(fā)表于 07-07 18:04 ?944次閱讀
    啟明云端<b class='flag-5'>ESP32-S</b>3 2.8寸串口屏到手了?如何上手?看這篇!

    ESP32-P4 C5開(kāi)發(fā)板燒錄小智全流程!速看!

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

    ESP32-S3開(kāi)發(fā)板燒錄小智AI系統(tǒng)全流程指南

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