十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

ESP32-S3开发环境搭建全攻略:从选型到IDF实战,一次搞定

ESP32-S3开发环境搭建全攻略:从选型到IDF实战,一次搞定 每次有人问我ESP32-S3环境怎么搭我都能感觉到屏幕对面那种既兴奋又有点慌的心情。这芯片这两年是真的很火AI加速、八线PSRAM、USB原生支持几十块钱的板子能跑语音唤醒还能带动彩屏UI谁看了不想试试。但真正上手第一步——把环境搭起来——就劝退了不少人。不是这东西有多难而是网上教程太碎了有讲Arduino的有讲PlatformIO的还有直接甩给你一长串命令行让你照着敲就行结果敲完也不知道自己在干什么。这篇东西不搞虚的我把ESP32-S3从选型、路线决策到IDF环境搭建、烧录验证再到大家搜得最多的BLE配网、GC9A01圆屏、麦克风采集一条线讲清楚照着走就行。1. 先搞清楚ESP32-S3是什么再决定要不要搭环境1.1 和经典ESP32、C3、C6相比S3强在哪很多人以为ESP32系列都差不多随便找个教程就能通吃这是个大误区。ESP32-S3不是老ESP32的升级版那么简单它在架构上是有明确分工的。经典ESP32用的是双核Xtensa LX6主打WiFi蓝牙的通用物联网场景而S3换成了双核Xtensa LX7主频最高能到240MHz关键是多了向量指令集和SIMD扩展说白了就是为AI推理和音频处理做了硬件加速。另外S3原生支持USB OTG和USB-Serial-JTAG你插一根USB线既能烧录又能当串口调试这在老ESP32上是没有的。C3呢是RISC-V单核定位低功耗低成本数据吞吐和算力都远不如S3C6比较新加了WiFi 6和802.15.4Thread/Zigbee但S3更偏重算力。如果你要跑LVGL界面、做本地语音唤醒、跑轻量级TinyML模型老老实实选S3别在C3上硬撑如果只是做个温湿度传感器节点那C3反而更合适。方向搞清楚了后面环境搭起来才有意义。1.2 认识ESP32-S3-N16R8这串命名热搜里频繁出现的N16R8其实是乐鑫的模组命名规则N代表Flash容量R代表PSRAM伪静态随机存储器。N16就是16MB FlashR8就是8MB八线PSRAM。市面上常见的还有N8R2、N8R8、N16R2等后缀不同能跑的应用差别很大。N16R8这个配置在当前性价比很高16MB Flash足够放下ESP-IDF的完整固件、字体资源、音频模型8MB PSRAM则解决了S3内部SRAM不够的问题跑LVGL时可以用PSRAM当帧缓冲处理240x240甚至更大的屏都游刃有余。你在搭环境的时候要特别注意SDK默认并不一定启用PSRAM后面我会专门讲这个坑。认准板子上的丝印别稀里糊涂买了N8R2却按N16R8写配置。1.3 什么场景值得选S3什么场景其实用不上S3最适合的几类应用我直接列一下对照自己的需求判断带屏HMI智能家居面板、手表表盘、桌面摆件动画S3的PSRAM带宽足够驱动圆形或方形的LCD加LVGL很顺滑。语音交互配合ESP-SR框架做离线唤醒词、命令词识别S3的双核跑音频前端和识别算法还有余量。边缘AI视觉接OV2640之类的摄像头做图像分类、人脸检测这类轻量推理S3的向量指令就是为这个准备的。原型产品开发管脚多、外设丰富USB原生接口方便调试快速验证想法很合适。反过来如果你的需求就只是定时上报一下传感器数据、控制一下继电器那ESP32-C3就够用了没必要上S3增加成本和功耗。另外如果你手头已经有一套基于经典ESP32的成熟代码也别指望无痛迁移S3的GPIO矩阵、外设驱动和老ESP32有不少差异编译能过不代表跑起来行为一致。2. 搭建前必须定下来的技术路线ESP-IDF、Arduino还是MicroPython2.1 三条路线怎么选搭环境之前第一件事不是下载工具而是选路线。我见过太多人今天跟Arduino教程走到一半明天又看到PlatformIO觉得高端最后卡在为什么我的工程目录跟教程不一样这个问题上。三条主流路线的对比如下路线适合人群开发效率底层可控性对S3新特性的支持ESP-IDF官方框架想做产品、长期深耕、要跑AI/音频/复杂外设中等高最及时Arduino ESP32核心快速验证模块、普通传感器demo、刚入门高低滞后一点但基本够用MicroPython纯原型验证、会Python不想碰C很高极低部分功能不支持实际用下来我的感受是Arduino不是不能用S3的Arduino核心也是基于ESP-IDF封装出来的跑个DHT11、控制个舵机都很轻松。但如果你要同时驱动圆形屏幕、跑BLE配网、再用I2S采集麦克风数据这些功能叠在一起Arduino库之间的版本冲突就能让你抓狂。而ESP-IDF把这些组件统一纳入idf.py的依赖管理体系版本、依赖关系清清楚楚出了问题也知道去哪查。2.2 为什么我推荐新手也走ESP-IDF主线以前我也嫌ESP-IDF学习曲线陡概念又多menuconfig是什么、partition表是什么、DMA是什么新手听到就头大。但现在官方把环境搭建这件事做得已经很自动化了Windows下一键装Python、Git、IDF工具链再用VS Code插件管理整个流程已经不需要手动去配一堆环境变量。与其学一遍Arduino再去理解IDF不如直接一步到位。选择了IDF还有一个隐性好处官方examples目录就是一座金山。wifi_provisioning、i2s_recorder、spi_lcd_touch、tinyusb每个目录就是一份可编译可运行的完整工程。很多S3的新外设功能Arduino那边要等第三方库更新IDF里已经是官方支持的首发状态。2.3 什么情况下可以不用ESP-IDF不是所有人都需要走IDF。比如你手里有一块板子只想先点个灯、读个传感器验证一下硬件有没有坏那Arduino十分钟就能跑完没必要折腾整套IDF。还有如果你纯粹是好奇MicroPython不打算深入底层那用esptool.py刷一个MicroPython固件进去在REPL里写Python代码也挺开心。我的建议是如果未来一年你会碰屏幕、音频、AI其中一个方向直接上IDF如果只是周末玩玩哪个顺手用哪个别在工具选型上内耗。我自己就是先Arduino入门后来项目复杂度上来最终还是回到IDF绕了一圈不如早学。3. Windows下ESP-IDF开发环境的完整搭建过程VS Code插件方式3.1 前置准备Git和Python的版本别选错很多人卡在环境搭建的细节上都是因为基础软件版本不对。先装Git安装过程中的Adjusting your PATH environment保持默认选项确保能在命令行使用git。另外在Git安装界面里有一个Enable symbolic links和一个Enable long paths的选项有条件就勾上尤其是长路径支持能省掉后面很多编译报错。然后是Python。目前ESP-IDF对Python的版本兼容范围大概在3.8到3.12新出的3.13建议先别用。装Python时务必勾选Add Python to PATH否则后面idf.py命令找不到解释器。如果你电脑上有多个Python版本建议给IDF单独用一个环境防止版本混乱。3.2 VS Code Espressif IDF插件安装流程IDE我推荐VS Code不是因为高大上而是因为ESP-IDF的官方插件已经做得很成熟图形界面能省掉大量命令行操作。安装步骤是这样的打开VS Code进入扩展市场搜索Espressif IDF认准espressif官方发布的那个插件安装量最高、图标是乐鑫的Logo。安装完成后VS Code底部状态栏会出现一个ESP-IDF的图标。点击它插件会引导你配置ESP-IDF。关键是选版本。官方插件会提供一个版本下拉框推荐选最新的稳定release版本比如5.3或5.4系列。S3相关的PSRAM、USB、屏幕驱动这些功能在5.x已经很成熟没有必要去追master分支。配置下载服务器的时候插件默认会走Espressif官方分发服务如果网络不太好可以在配置界面选择官方便于国内访问的镜像选项这些都是合法公开的下载源不是旁门左道。不要自己去网上找乱七八糟的加速器。选择安装目录时有一点很关键路径里绝对不能有中文、空格和特殊符号。很多人随手装到C:\Program Files\Espressif表面上没问题但IDF的构建系统对路径空格很敏感后面编译报一堆莫名其妙的错。推荐直接放类似D:\Espressif这样的根目录。配置完成后插件会开始下载工具链、编译器、调试器等组件这个过程视网络情况可能要十几分钟到半小时。期间VS Code下方会显示进度不要中途关掉窗口。下载完以后插件会自动创建Python虚拟环境并安装idf.py所需的Python包。3.3 创建第一个工程用模板而不是从零撸代码安装完IDF之后最快验证环境是否正常的方法不是自己写代码而是直接用官方模板创建一个hello_world工程。在VS Code扩展的Explorer侧边栏找到ESP-IDF Explorer点Create New Project插件会弹出模板选择界面。这里你能看到一大堆S3适配的示例工程先选hello_world模板。选好模板后VS Code会自动打开这个新工程。你会在文件列表里看到几个关键文件CMakeLists.txt顶层构建文件包含PROJECT_NAME和引入idf组件。main/这个目录下是应用代码至少有一个.c文件和一个CMakeLists.txt。sdkconfig当前工程的配置快照相当于整个SDK的设置中心。先别急着改代码看一眼main目录里的hello_world.c内容大致是调用esp_rom_printf或ESP_LOGI打印一些芯片信息。这正好可以用来验证环境。3.4 三步完成编译、烧录、串口监视插件准备好之后整个烧录流程其实已经图形化了。但为了让你理解底层发生了什么我建议至少在命令行里实际操作一次。VS Code的终端会自动进入IDF环境你执行以下命令# 1. 设置目标芯片为esp32s3 idf.py set-target esp32s3 # 2. 编译整个工程 idf.py buildset-target的作用是生成指定芯片对应的sdkconfig和链接脚本。如果你买的是其它带S3后缀的模组这一步不用改选esp32s3即可覆盖所有S3芯片。第一次编译会比较久因为要编译整个SDK组件后面增量编译就快多了。编译完成之后把开发板用USB线连到电脑在设备管理器里确认一下端口号。S3开发板一般会出现两种串口设备一种是USB-SERIAL CH340或CP210x取决于板载USB转串口芯片另一种如果是原生USB接口会显示为USB JTAG/serial debug unit。记住这个COM口号然后烧录# 把COMx换成你自己的端口 idf.py -p COM3 flash monitorflash会通过串口把固件写到Flash里monitor会在烧录完成后自动打开串口监视器。如果你用的是S3开发板自带的USB接口整个过程全自动不需要手动切换下载模式。看到串口里打印出类似Hello world!以及芯片ID、Flash大小等信息环境就算彻底通了。3.5 下载慢、下载失败的常见处理方式这是被问得最多的问题。IDF工具链体积很大首次下载确实有可能因为网络问题中断。官方的处理方式很正规在安装引导里就提供了镜像服务器选项你在插件或ESP-IDF安装工具里选一个离自己近的服务器就行这是完全合规的操作方式。另外下载失败后可以重复执行安装命令工具本身支持断点续传。还有一类问题是防火墙或安全软件拦截了Python和git的联网行为。安装过程中如果遇到下载某个组件一直卡住不动先把安全软件对C:\Espressif或你安装目录的实时防护暂时关掉完成后再开。我自己装的时候还遇到过杀软把esptool.exe当木马删掉的后来加了白名单一路顺畅。4. 烧录与验证让板子真正跑起来4.1 第一个工程代码到底在做什么hello_world工程看起来简单但它包含的信息量很大。app_main函数是应用程序入口S3上电后芯片内部ROM引导程序先启动然后加载二级bootloader再根据分区表决定启动哪个分区里的app。这一整套流程对初学者是黑盒但你要知道串口监视器里如果能看到bootloader的日志说明芯片和Flash的基本链路没问题如果能看到app的日志说明你的编译工具链和环境配置也没问题。我建议在这个阶段做一个简单的扩展在hello_world里加上打印Flash和PSRAM信息的代码。用esp_flash_get_size可以拿到Flash总容量用heap_caps_get_total_size(MALLOC_CAP_SPIRAM)可以确认PSRAM是否被正确初始化。这个动作虽小却能在你真正用到大内存应用之前提前发现PSRAM没启用的隐患。#include stdio.h #include esp_flash.h #include esp_heap_caps.h #include esp_log.h static const char *TAG hw; void app_main(void) { esp_flash_t *flash NULL; uint32_t flash_size 0; esp_flash_get_size(NULL, flash_size); ESP_LOGI(TAG, Flash size: %u MB, flash_size / (1024 * 1024)); size_t psram_size heap_caps_get_total_size(MALLOC_CAP_SPIRAM); ESP_LOGI(TAG, PSRAM size: %u KB, psram_size / 1024); }如果你编译烧录后PSRAM打印出来是0那基本就是SDK默认配置里没开PSRAM这就要用到menuconfig了。4.2 menuconfig是个什么东西怎么用用过Linux内核的人对menuconfig不陌生它就是IDF的图形化配置界面。在工程目录下执行idf.py menuconfig会打开一个蓝底菜单。S3的PSRAM配置路径一般在Component config-ESP32S3-Specific-Support for external, SPI-connected RAM进去之后先Enable然后选择Octal Mode PSRAM、频率80MHz。保存退出后重新编译烧录PSRAM就能被识别了。顺带说一句sdkconfig文件本质就是一个文本配置文件你想手动改也行但新手最好还是走menuconfig因为里面关联的配置项太多了手改容易改出逻辑冲突。而且sdkconfig不要手动提交到代码仓库它跟你的本地路径、版本都有关正确的做法是让工程里的默认sdkconfig.defaults来管理公共配置。4.3 点亮板载灯从点灯理解GPIO和PWM环境跑通之后第一个正经的实验就是点灯。S3开发板上的RGB灯一般是WS2812这类可编程灯珠和普通LED不一样需要严格的时序信号但IDF已经封装好了led_strip组件用起来不复杂。先在工程目录的main/CMakeLists.txt里添加依赖REQUIRES driver esp_driver_spi PRIV_REQUIRES led_strip然后在代码里初始化一个WS2812灯带#include led_strip.h #define BLINK_GPIO 48 // 多数S3 DevKit板载RGB灯接GPIO48 led_strip_handle_t strip; led_strip_config_t strip_config { .strip_gpio_num BLINK_GPIO, .max_leds 1, .led_model LED_MODEL_WS2812, }; led_strip_rmt_config_t rmt_config { .resolution_hz 10 * 1000 * 1000, // 10MHz }; led_strip_new_rmt_device(strip_config, rmt_config, strip); led_strip_set_pixel(strip, 0, 128, 0, 0); // 红色 led_strip_refresh(strip);GPIO48是ESP32-S3-DevKitC板载RGB灯的位置如果你用的是其它品牌的S3板子先查一下原理图别盲抄管脚号。点灯这件事看似简单但它能帮你建立管脚复用的概念——很多S3管脚不是随便接的它们可能已经连了Flash、PSRAM或者板载USB一旦串用就会出各种诡异问题。4.4 手动进入下载模式的方法虽然大多数开发板都有自动下载电路插上USB就能烧录但偶尔会遇到某个板子不支持自动下载或者串口驱动不是CH340/CP2102而需要手动按住按键的情况。这时操作方法是先按住BOOT键不放按一下RESET键然后松开BOOT键。这样芯片就会以下载模式启动此时执行idf.py flash才能进去。如果烧录时一直卡在等待同步或者提示连接超时先检查是不是忘了进下载模式再检查串口线是不是纯充电线。USB数据线这个坑我至少见过五次——看起来一模一样的两根线一根能烧录一根只能充电折腾半小时发现是线的问题真的会让人崩溃。5. 热搜玩法专题BLE配网、GC9A01圆屏、I2S麦克风5.1 BLE配网用手机把WiFi密码交给S3S3支持BLE 5很多带屏幕或没有屏幕的物联网设备都需要一种优雅的上网方式——配网。最原始的方案是串口输入WiFi名字密码太不友好用SmartConfig手机和ESP32在同一WiFi下广播虽然方便但要求手机先连上目标WiFi对于陌生设备不太现实。这时候BLE配网的优势就体现出来了设备开机进入蓝牙广播状态手机App扫描到后直接通过蓝牙把WiFi账号密码发给设备设备收到后连上WiFi整个过程不需要手机预先连接任何热点。IDF里已经集成了wifi_provisioning组件工程示例在examples/provisioning/ble_prov。它默认用的是乐鑫的protocomm协议手机端装一个官方AppEspressif BLE Provisioning就能直接扫到设备并配网。关键是配网成功后SDK会自动把WiFi凭据存储到NVS分区下次开机直接读取自动连接不会要求重新配网。真正配置的时候你只需要关心几点BLE服务UUID是否固定、设备名字是否需要自定义、配网超时后是否进入休眠。代码本身就是标准的初始化流程#include wifi_provisioning/manager.h #include wifi_provisioning/scheme_ble.h void start_ble_provisioning(void) { wifi_prov_mgr_config_t config { .scheme wifi_prov_scheme_ble, .scheme_event_handler WIFI_PROV_SCHEME_BLE_EVENT_HANDLER_FREE_BTDM, }; wifi_prov_mgr_init(config); wifi_prov_mgr_start_provisioning(WIFI_PROV_SECURITY_1, NULL, my_device, wifikey); while (!wifi_prov_mgr_is_wifi_provisioned(NULL)) { vTaskDelay(pdMS_TO_TICKS(1000)); } wifi_prov_mgr_deinit(); }这里我多说一句S3的BLE和WiFi共用同一个射频前端蓝牙配网的时候WiFi要处于非连接状态所以配网状态机和业务逻辑不要设计成同时抢占WiFi否则会出现连上又断的现象。5.2 GC9A01接N16R8点亮圆形屏幕GC9A01是当下火到不行的圆形LCD驱动芯片240x240分辨率做成手表表盘、圆形仪表盘非常漂亮。把GC9A01接到N16R8这种带大PSRAM的S3上属于官方推荐组合——因为LVGL的帧缓冲和图形缓冲完全可以放到PSRAM里不用去挤内部SRAM。接线方面GC9A01和绝大多数SPI屏幕一样用到的信号线有这些屏幕引脚含义建议接到S3的GPIOVCC电源3.3V或5V看模块3.3VGND地GNDSCL / SCLKSPI时钟GPIO12SDA / MOSISPI数据GPIO11RES / RST复位GPIO13DC / RS数据/命令选择GPIO14CS片选GPIO10BLK / BL背光GPIO9PWM控制亮度上面的引脚是常见的SDK配置值实际以你用的板子为准。S3的优势是GPIO矩阵很灵活大部分引脚可以任意映射到任意外设所以接错线也不用慌改一改GPIO_NUM_XX重新编译就行。初始化GC9A01在IDF里也不算复杂官方推荐通过esp_lcd组件来管理SPI屏幕因为它自带DMA传输和帧缓冲管理。关键步骤是这样的先用spi_bus_initialize初始化SPI2总线再通过esp_lcd_panel_io_spi_config_t创建一个panel IO句柄最后用esp_lcd_new_panel_gc9a01创建LCD面板对象。然后调用esp_lcd_panel_reset、esp_lcd_panel_init、esp_lcd_panel_invert_colorGC9A01通常需要反色一次否则颜色不对再配合LVGL的flush回调就能显示内容了。花屏这个问题我要单独拎出来讲。很多人点亮圆屏后第一反应是代码写错了其实一半以上的花屏原因是SPI时钟频率太高、PSRAM未开启导致内存不足、或者DMA descriptor没对齐。先从保守的20MHz的SPI频率开始调试稳定后再逐步往上提不要一上来就拉满80MHz。另外背光引脚不要悬空不亮屏的模块80%都是背光没拉高。5.3 I2S麦克风数据采集从硬件到音频流热搜里esp32-s3麦克风函数代码这个搜索词说明想做语音交互的人很多。实现语音采集最常用的传感器是INMP441一颗I2S接口的MEMS麦克风S3有硬件I2S外设接上就能把模拟声音转成数字音频流。我在实际项目里见到的接线方式很固定INMP441引脚接到S3VDD3.3VGNDGNDSCKGPIO4WS字选择GPIO5SD数据GPIO6L/RGND左声道或3.3V右声道IDF 5.x里I2S的API已经变成了分层结构配置流程比老版本更清晰。先初始化一个i2s_std_config_t设置采样率、位深、通道数然后调用i2s_channel_read读取音频数据到DMA缓冲区。下面这个代码片段能帮你把麦克风数据读出来并打印音量大小#include driver/i2s_std.h #include driver/i2s_types.h #define I2S_SCK 4 #define I2S_WS 5 #define I2S_SD 6 void audio_init(void) { i2s_chan_handle_t rx_chan; i2s_chan_config_t chan_cfg I2S_CHANNEL_DEFAULT_CONFIG(I2S_NUM_0, I2S_ROLE_MASTER); i2s_new_channel(chan_cfg, NULL, rx_chan); i2s_std_config_t std_cfg { .clk_cfg I2S_STD_CLK_DEFAULT_CONFIG(16000), .slot_cfg I2S_STD_PHILIPS_SLOT_DEFAULT_CONFIG(I2S_DATA_BIT_WIDTH_32BIT, I2S_SLOT_MODE_STEREO), .gpio_cfg { .mclk I2S_GPIO_UNUSED, .bclk GPIO_NUM_4, .ws GPIO_NUM_5, .dout GPIO_NUM_UNUSED, .din GPIO_NUM_6, }, }; i2s_channel_init_std_mode(rx_chan, std_cfg); i2s_channel_enable(rx_chan); }采集到原始PCM数据之后可以配合乐鑫的esp-sr组件做唤醒词识别例如默认集成了Hi 乐鑫这个唤醒词也可以离线识别几个常见的语音命令。S3的双核240MHz在保证音频采集的同时还能跑图形界面刷新这也是它比老ESP32更适合做语音助手类产品的原因。6. 我踩过的坑和给新手的配置建议6.1 串口不识别、烧录失败的排查顺序这类问题是环境搭建后的头号劝退因素。我的排查顺序永远是线材 - 驱动 - 端口号 - 手动下载模式。USB线优先换一根确定能传数据的线然后看设备管理器里有没有出现未知设备出现才能谈驱动再检查idf.py flash里写的COM口号和实际是否一致最后考虑是不是开发板没有自动下载电路、需要手动按BOOT。这一套走下来90%的问题能解决。还有一个隐蔽的坑如果你同时接了多块开发板系统会出现多个COM口idf.py -p COM3里写错口会把固件刷到别的板子上。养成习惯烧录前先看一眼设备管理器或者用esptool.py chip_id确认一下当前端口是哪块板。6.2 PSRAM相关的两个大坑PSRAM能让你跑大内存应用但配置不好也会让你反复重启。第一个坑是menuconfig里没有正确选择Octal Mode。N16R8的后缀里R8表示8MB八线PSRAM如果你的S3模组是八线PSRAM却在配置里选成了Quad四线结果是PSRAM初始化失败芯片直接进入boot loop日志在串口监控器里疯狂刷invalid psram config。第二个坑是Flash电压。S3的Flash和PSRAM经常共享同一个供电轨如果硬件的Flash期望1.8V而SDK默认用了3.3V或反过来就会导致随机死机、烧录后第一次能开机第二次开不了。排查这种问题最快的方法是先对比官方开发板的sdkconfig官方板能稳定运行的配置照抄至少不会犯方向性错误。6.3 管脚复用S3不是每个引脚都能随便接S3的GPIO矩阵非常灵活但有一些引脚是隐藏占用的。特别是带内置Flash和PSRAM的模组一些GPIO会复用到底层存储总线上例如部分型号的GPIO26到GPIO32可能与八线PSRAM的D0-D7相关直接拿来当普通GPIO用就会和PSRAM数据打架。实际项目里我一般优先使用GPIO1-GPIO21这些在大多数板子上引出的常用引脚避免动底层存储相关引脚。如果你发现某个GPIO怎么配置都不生效先打开开发板的原理图看看它是不是被其他外设占用了。6.4 给新手的路径规划别急着追求复杂功能我见过太多人第一天搭环境第二天就想跑通LVGLWiFi麦克风结果一个问题叠一个问题最后心态崩了。正常节奏应该是第一周只跑通blink和串口日志理解编译烧录的基本流程第二周试WiFi扫描和BLE的官方示例第三周再上屏幕或者麦克风这类外设。每增加一个外设先跑官方example不要上来就改一处乱写。等你把这些sample都跑过一遍S3的能力边界和代码组织方式也就有感觉了这时候再去实现自己的创意会顺畅得多。另外建议正式建项目的时候把自己的配置沉淀到sdkconfig.defaults文件里这样下次重新clone工程或者换电脑只要执行一次idf.py set-target就能恢复全部分类配置不用再进menuconfig点一遍。这个习惯我在维护多个项目后深有体会。最后再说一个很多人忽略的小细节ESP-IDF的版本升级虽然简单就是改一下插件里的版本号但升级后老的sdkconfig经常会让新版本编译报错。升级前备份工程里的sdkconfig或者干脆删掉让它重新生成再按自己的需求把关键配置重新设置一遍比花一下午排查为啥升级后编译不过要高效得多。这套环境我从S3刚量产那会儿用到现在期间踩过的坑、踩出来的经验差不多都浓缩在以上内容里了希望能让你的第一步走得比我当初稳一点。
返回列表