☰
ESP32-S3 Dev Module 实战指南:从选型到摄像头与语音应用
2026/10/14 1:14:19 网站建设 项目流程

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. 开发环境搭建:从零到点亮第一颗 LED

2.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 配置、波特率检查配置,确认波特率 115200
LED 不亮引脚号、LED 类型查原理图,确认是普通 LED 还是 RGB
PSRAM 分配失败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 在行为上有差异。把这几个地方检查一遍,迁移基本就没什么大问题了。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询