
ESP32-S3 这颗芯片刚出来那阵子我其实没太当回事觉得无非就是 ESP32 加了个 USB再塞点 AI 指令进去。真正让我改变看法的是去年做一个离线语音唤醒的小玩意儿ESP32 算力吃紧换到 S3 之后不仅跑得动了还空出一大截余量做别的事。从那以后我手头但凡涉及摄像头、语音、屏幕刷新的项目基本都优先考虑 ESP32-S3 Dev Module 这块板子。这篇文章就把我这些日子用下来的经验、踩过的坑、以及一些不太会在官方文档里写清楚的细节完整地梳理一遍。不管你是刚拿到板子的新手还是从经典 ESP32 迁移过来的老玩家应该都能找到点有用的东西。1. 这块板子到底强在哪核心定位与选型逻辑1.1 从经典 ESP32 到 S3升级点不只是“更快”很多人第一次看到 ESP32-S3 Dev Module会觉得它跟手里的 ESP32 DevKitC 长得差不多引脚排布也类似就下意识以为是个小改款。实际上两者的内核完全不是一回事。经典 ESP32 用的是 Xtensa LX6 双核而 S3 换成了 Xtensa LX7 双核主频从 240MHz 提到了 240MHz看起来一样但 LX7 在向量指令和 DSP 类运算上做了大量增强这才是关键。我举个实际的例子。之前用经典 ESP32 跑一个 240x240 的屏幕做简单图形刷新SPI 刷屏加一些基础运算帧率大概能到 30 出头但一旦叠加稍微复杂点的图形变换帧率就掉得厉害。换到 S3 之后同样的代码逻辑帧率直接翻了一倍多。原因就在于 LX7 的 SIMD 指令能一次处理多个数据图形运算这种天然适合并行化的任务收益非常明显。另一个容易被忽略的点是 S3 的 GPIO 数量。经典 ESP32 可用 GPIO 大概 34 个左右S3 直接给到了 45 个。别小看这多出来的十来个脚做项目的时候经常就是差那么几个引脚要么放弃某个功能要么加个扩展芯片很烦。S3 在这方面宽裕不少尤其是你要同时接屏幕、摄像头、SD 卡、几个传感器的时候引脚够用真的省心。1.2 为什么我推荐 Dev Module 而不是自己画板市面上 ESP32-S3 的模组有好几种比如 ESP32-S3-WROOM-1、WROOM-2还有带不同 Flash 和 PSRAM 配置的版本。对于绝大多数个人项目和小批量验证我强烈建议直接用 Dev Module 开发板而不是一上来就自己画 PCB 打样。理由很实在。第一Dev Module 已经把 USB 转串口、电源管理、复位电路、Boot 按键这些外围都做好了你拿到手插上线就能用。自己画板的话光是 USB 部分和电源部分就够折腾一阵而且第一次打样大概率会有各种小问题时间成本太高。第二Dev Module 的引脚是标准 2.54mm 间距直接插面包板或者杜邦线连接都很方便调试阶段改线也快。第三价格便宜一块带 8MB PSRAM 的 S3 Dev Module 也就几十块钱比你单独买模组加外围元件再打板便宜多了。当然如果你是要做产品或者对体积有严格要求那最终肯定要自己画板。但验证阶段用 Dev Module 把功能跑通确认方案可行之后再迁移到自制板这个路径是最稳妥的。1.3 不同版本怎么挑Flash 和 PSRAM 的取舍ESP32-S3 Dev Module 有好几个版本主要区别在 Flash 大小和有没有 PSRAM。我整理了一个简单的对照表方便你根据自己的需求选版本配置适合场景注意事项4MB Flash 无 PSRAM简单 GPIO 控制、传感器读取、小屏幕跑不了摄像头和大图形缓冲8MB Flash 无 PSRAM中等复杂度项目、WiFi 通信内存吃紧时需精打细算8MB Flash 8MB PSRAM摄像头、语音、LVGL 大屏性价比最高推荐首选16MB Flash 8MB PSRAM需要存大量资源文件价格稍高按需选择我个人的建议是如果你不确定要做什么直接买 8MB Flash 8MB PSRAM 的版本。多花不了几块钱但后面想做摄像头或者跑 LVGL 的时候PSRAM 就是救命稻草。没有 PSRAM 的版本跑摄像头基本没戏因为一帧图像缓冲就要几百 KB内部 SRAM 根本扛不住。注意有些便宜的 S3 板子标称有 PSRAM但实际是 Octal PSRAM需要特定的 Arduino 配置才能启用。买之前最好确认一下板子用的是 Quad 还是 Octal PSRAM配置不对的话 PSRAM 是用不起来的。2. 开发环境搭建从零到点亮第一颗 LED2.1 Arduino IDE 配置的完整流程虽然现在 PlatformIO 和 ESP-IDF 都很流行但 Arduino IDE 依然是上手最快的选择。我下面把完整流程走一遍包括几个容易卡住的地方。第一步下载 Arduino IDE。建议用 2.x 版本界面和功能都比 1.8 好不少。安装完之后打开进入“文件”-“首选项”在“附加开发板管理器网址”里填入 ESP32 的板级支持包地址。这个地址在 Espressif 的官方文档里能查到我这里就不贴具体链接了你搜一下就能找到。第二步打开“工具”-“开发板”-“开发板管理器”搜索“esp32”找到 Espressif Systems 发布的那个包安装。这里有个坑安装过程需要下载几百 MB 的文件网络不好的话很容易失败。我的经验是如果卡住了就多试几次或者换个时间段再装。安装完成后在开发板列表里就能看到“ESP32S3 Dev Module”这个选项了。第三步选择开发板。在“工具”-“开发板”里选“ESP32S3 Dev Module”。选完之后下面会多出一堆配置项这些才是真正需要注意的地方。2.2 关键配置项逐个拆解选完开发板之后工具菜单里会出现很多 S3 特有的配置项。我挑几个最关键的讲一下这些配置错了轻则功能不正常重则直接编译不过。USB CDC On Boot这个选项决定串口输出走哪条路。S3 有两个 USB 接口一个是原生 USB直接接芯片的一个是 UART 转 USB通过 CH340 之类的芯片。如果你用的是原生 USB 口这个选项要设为“Enabled”否则串口监视器看不到输出。如果你用的是板子上那个标着 UART 的口就设为“Disabled”。我一开始就是这里搞错了代码烧进去了但串口一片空白排查了半天。Flash Size根据你板子的实际 Flash 大小选。8MB 的板子就选 8MB。选大了编译会报错选小了浪费空间。PSRAM如果你的板子有 PSRAM这里要选“OPI PSRAM”或者“QSPI PSRAM”取决于你的 PSRAM 类型。选错了的话代码里用 ps_malloc 分配内存会失败。不确定的话可以先选 OPI 试试不行再换 QSPI。Partition Scheme分区方案决定了 Flash 怎么划分给程序、文件系统、OTA 等。默认的“Default 4MB with spiffs”在 8MB 板子上也能用但会浪费空间。如果你要用 LittleFS 或者 FATFS 存文件建议选“8MB with spiffs”或者“16MB Flash”相关的方案。我一般会选带较大 SPIFFS/LittleFS 分区的方案方便存网页文件或者配置文件。Upload Speed烧录速度。默认 921600 一般没问题但如果你的 USB 线质量不好或者板子设计有瑕疵可能会烧录失败。遇到这种情况就降到 115200 试试。2.3 点亮 LED验证环境是否正常配置好之后写个最简单的 Blink 程序验证一下。S3 Dev Module 上一般有一颗板载 LED但不同厂家的板子引脚不一样。常见的是 GPIO 48 或者 GPIO 2。你可以先查一下自己板子的原理图或者直接两个都试试。void setup() { pinMode(48, OUTPUT); } void loop() { digitalWrite(48, HIGH); delay(500); digitalWrite(48, LOW); delay(500); }烧录进去之后如果 LED 开始闪烁说明环境没问题。如果没反应先检查引脚号对不对再检查串口有没有输出。串口能输出但 LED 不亮基本就是引脚号错了。串口也没输出那就是 USB CDC 配置的问题回去检查那个选项。实操心得S3 的板载 LED 有些是 WS2812 类型的 RGB 灯不是普通的 GPIO 控制的 LED。这种灯需要用专门的库来驱动直接 digitalWrite 是不亮的。如果你板子上的 LED 用 Blink 点不亮查一下是不是 RGB 灯。3. 核心功能实战从 GPIO 到摄像头3.1 GPIO 使用要点与引脚避坑S3 的 GPIO 虽然多但并不是所有引脚都能随便用。有几个引脚有特殊功能用之前要心里有数。GPIO 0 是 Boot 模式选择引脚上电时如果被拉低会进入下载模式。如果你把它接了个按钮或者传感器上电时恰好是低电平板子就起不来了。我一般会避开这个脚或者加个上拉电阻确保默认高电平。GPIO 19 和 20 是原生 USB 的 D- 和 D如果你要用原生 USB 功能这两个脚就不能当普通 GPIO 用。但如果你只用 UART 口烧录和通信这两个脚可以释放出来做其他用途。GPIO 43 和 44 是 UART0 的 TX 和 RX也就是默认的串口。如果你要用串口打印调试信息这两个脚要留着。不过 S3 支持引脚矩阵可以把 UART 映射到其他引脚上所以也不是绝对的。剩下的 GPIO 基本都可以自由使用但要注意有些引脚在特定配置下会被占用比如用了 Octal PSRAM 的话会占用 GPIO 33 到 37。这些细节在官方文档里都有用之前扫一眼就行。3.2 用 PSRAM 扩展内存的正确姿势PSRAM 是 S3 的一大卖点但很多人不知道怎么用。默认情况下Arduino 里的 malloc 分配的是内部 SRAM不会自动用到 PSRAM。你需要显式地调用 ps_malloc 来从 PSRAM 分配内存。// 从 PSRAM 分配 100KB 内存 void* buffer ps_malloc(100 * 1024); if (buffer NULL) { Serial.println(PSRAM 分配失败); } else { Serial.println(PSRAM 分配成功); // 使用 buffer free(buffer); }这里有个关键点PSRAM 的访问速度比内部 SRAM 慢所以不是所有数据都适合放 PSRAM。我的经验是大块的图像缓冲、音频缓冲、文件缓存放 PSRAM 很合适但频繁访问的小数据结构还是放内部 SRAM 性能更好。另外PSRAM 的分配和释放要注意碎片问题。如果你反复分配释放不同大小的内存块PSRAM 也会碎片化。对于需要长期使用的缓冲最好一次性分配好不要频繁申请释放。3.3 摄像头模块的接入与调试S3 配合摄像头模块比如 OV2640 或 OV3660可以做很多有意思的东西。接线方面摄像头模块一般需要十几个引脚包括数据线、时钟、同步信号等。S3 Dev Module 的引脚够用但接线要仔细接错一根就可能出不来图像。我一般会先用官方的 CameraWebServer 示例来验证硬件。这个示例会启动一个网页服务器你可以在浏览器里看到摄像头画面。如果画面正常说明硬件接线没问题然后再基于这个改自己的代码。调试摄像头时最常见的问题是画面花屏或者全黑。花屏一般是数据线接触不良或者时钟频率太高可以试着降低 XCLK 频率。全黑的话先检查电源摄像头模块耗电不小USB 口供电不足会导致工作不正常。还有就是镜头盖没摘这个虽然听起来很蠢但我确实干过。注意事项S3 的摄像头接口和经典 ESP32 不完全一样有些在 ESP32 上能用的摄像头例程在 S3 上需要调整引脚定义。不要直接照搬要对照 S3 的引脚图改。3.4 屏幕驱动与 LVGL 的搭配用 S3 驱动 SPI 屏幕跑 LVGL 是很常见的组合。S3 的算力和 PSRAM 让 LVGL 跑起来比较流畅尤其是带 PSRAM 的版本可以把 LVGL 的缓冲放到 PSRAM 里腾出内部 SRAM 做其他事。配置 LVGL 的时候缓冲大小是个关键参数。缓冲太小会闪烁太大又浪费内存。我的经验是对于 240x240 的屏幕分配一个 240x40 的缓冲大约 19KB就能跑得比较流畅了。如果屏幕更大比如 320x480建议缓冲至少 320x80并且放到 PSRAM 里。LVGL 的刷新率还跟 SPI 时钟有关。S3 的 SPI 可以跑到 80MHz但实际能不能稳定运行取决于屏幕模块和接线质量。我一般先从 40MHz 开始稳定之后再往上调。杜邦线连接的话80MHz 基本没戏会有各种花屏和丢数据。要跑高频最好用短一点的排线或者直接焊上去。4. 常见问题排查与避坑经验4.1 烧录失败的那些原因烧录失败是新手最常遇到的问题我总结了几种典型情况和对应的解决办法。现象可能原因解决办法找不到串口USB 线只有供电没有数据换一根带数据传输的 USB 线烧录超时上传速度太快降到 115200 试试一直等待上电板子没进下载模式按住 Boot 再按 Reset然后松开编译报错找不到头文件开发板选错了确认选的是 ESP32S3 Dev Module烧录成功但没反应USB CDC 配置不对检查 USB CDC On Boot 选项其中“找不到串口”这个我遇到过好几次都是 USB 线的问题。有些线只能充电不能传数据外观上完全看不出来。换根线就好了但不知道的话能折腾很久。还有一个情况是板子上的 USB 口有两个一个标 UART 一个标 USB。用 UART 口烧录的话不需要管 USB CDC 配置但串口输出也会走 UART 口。用 USB 口的话就要注意 USB CDC 的配置。我建议新手先用 UART 口少一个变量等熟悉了再用原生 USB。4.2 程序跑飞与重启的排查思路S3 程序跑飞或者不断重启一般有几个原因。最常见的是内存分配失败尤其是用了 PSRAM 但配置不对的时候。串口会打印一堆错误信息仔细看的话能看到“malloc failed”或者“PSRAM not found”之类的提示。另一个常见原因是看门狗超时。S3 默认开启了任务看门狗如果你的 loop 函数里有长时间阻塞的操作比如 delay 太久或者死循环看门狗就会复位芯片。解决办法是在长时间操作里定期喂狗或者调整看门狗超时时间。还有一种情况是电源问题。S3 在 WiFi 工作时瞬间电流能到 500mA 以上如果 USB 口供电不足或者板子上的稳压芯片功率不够就会导致电压跌落芯片重启。这种问题比较隐蔽因为不是每次都出现。如果你发现板子在 WiFi 连接或者摄像头工作时随机重启可以试着换一个供电能力强的 USB 口或者外接电源。4.3 WiFi 与蓝牙共存的注意事项S3 支持 WiFi 和蓝牙同时工作但两者共享同一个射频模块实际使用时会互相影响。如果你同时开 WiFi 和蓝牙可能会发现 WiFi 吞吐量下降或者蓝牙连接不稳定。我的经验是如果项目不需要同时用两者就关掉不用的那个。在 Arduino 里WiFi 和蓝牙的初始化会占用内存和射频资源关掉可以省不少资源。如果确实需要共存尽量让 WiFi 和蓝牙的工作时间错开比如 WiFi 传数据的时候暂停蓝牙扫描。另外S3 的 WiFi 支持 2.4GHz 频段不支持 5GHz。如果你的路由器只有 5GHz 频段S3 是连不上的。这个在买路由器或者配置网络的时候要注意。避坑技巧S3 的蓝牙和 WiFi 天线是板载的 PCB 天线如果你把板子放在金属外壳里或者贴着金属物体信号会严重衰减。做项目的时候尽量让天线区域远离金属或者留出足够的净空区。4.4 常见问题速查表为了方便查阅我把上面提到的和另外一些常见问题整理成一张表问题排查方向快速解决串口无输出USB CDC 配置、波特率检查配置确认波特率 115200LED 不亮引脚号、LED 类型查原理图确认是普通 LED 还是 RGBPSRAM 分配失败PSRAM 类型配置切换 OPI/QSPI 试试摄像头花屏接线、时钟频率降低 XCLK检查排线屏幕闪烁LVGL 缓冲大小增大缓冲放到 PSRAM随机重启电源、看门狗换供电检查阻塞操作WiFi 连不上频段、密码确认路由器是 2.4GHz编译报错开发板选择、库版本确认板子型号更新库这张表基本覆盖了我遇到过的八成问题。剩下的两成往往是硬件本身的问题比如板子虚焊或者元件损坏这种就只能换板子了。5. 进阶玩法与项目思路5.1 用 S3 做离线语音识别S3 的算力和 PSRAM 让它能跑一些轻量级的语音识别模型。Espressif 自己就提供了语音识别框架可以识别一些预设的唤醒词和命令词。我试过用 S3 做一个简单的语音控制灯识别“开灯”“关灯”两个命令准确率还不错响应也快。做语音识别需要注意几点。麦克风的选择很重要数字麦克风比如 INMP441比模拟麦克风效果好很多抗干扰能力强。麦克风的摆放位置也要注意远离电源和 WiFi 天线否则会有底噪。模型方面预设的命令词识别不需要额外训练直接用官方提供的就行。如果要识别自定义词就需要自己训练模型那个门槛就高一些了。5.2 摄像头加屏幕的图传小系统用 S3 同时接摄像头和屏幕可以做一个简单的图传系统。摄像头采集图像S3 处理后显示到屏幕上。这个过程中 PSRAM 是关键因为一帧 RGB565 的图像320x240 分辨率就要 150KB没有 PSRAM 根本存不下。我做过一个版本摄像头采集 QVGA 图像经过简单的灰度处理后在 ST7789 屏幕上显示帧率能到 15 帧左右。如果只是显示原始图像不做处理帧率还能更高。这个方案可以用在简单的监控或者视觉反馈场景。5.3 低功耗场景的配置要点虽然 S3 不是以低功耗见长的芯片但通过合理配置也能做到不错的功耗表现。如果你做电池供电的项目有几个地方可以优化。首先是关闭不用的外设。WiFi、蓝牙、摄像头这些不用的时候就关掉能省不少电。其次是降低主频S3 支持动态调频不需要高性能的时候降到 80MHz 甚至更低。还有就是用好深度睡眠模式S3 在深度睡眠下电流能降到几十微安配合定时唤醒或者外部中断唤醒可以做很长时间待机的设备。实操心得S3 的深度睡眠唤醒后程序会从头开始执行不会从睡前的点继续。所以你需要把状态保存到 RTC 内存或者 Flash 里唤醒后先读取状态再决定做什么。这个和经典 ESP32 是一样的。6. 我个人的一些使用体会用了这么久 S3 Dev Module最大的感受就是它把“够用”和“好用”平衡得很好。算力足够跑大多数个人项目引脚数量宽裕PSRAM 让内存不再是瓶颈USB 原生支持也方便了不少。当然它也不是没有缺点比如功耗比不过一些低功耗专用的芯片价格也比经典 ESP32 贵一点。但综合来看对于需要一定算力、又要 WiFi 蓝牙、还可能接摄像头或屏幕的项目S3 目前是我首选。最后分享一个小技巧如果你从经典 ESP32 迁移代码到 S3大部分代码可以直接用但要注意几个地方。一是引脚定义可能不同尤其是用了特殊功能的引脚。二是 PSRAM 的使用方式不一样经典 ESP32 有些版本也有 PSRAM但分配方式和 S3 不同。三是 USB 相关的代码S3 的原生 USB 和经典 ESP32 的 UART 转 USB 在行为上有差异。把这几个地方检查一遍迁移基本就没什么大问题了。