ESP32-S3 Mini 和 C3 Mini 这两块板子,是我被问到最多的入门级 WiFi 开发板之一,而绕不开的两个关键词就是 PSRAM 和 USB。很多人看它们长得差不多——都是小尺寸、Type-C 口、双排排针、价格咬得很紧——于是把 C3 当成 S3 的低配版直接下单,等做到一半才反应过来:USB 口只能当串口用,内存几百 KB 跑不动 GUI,退货的快递费都够再买一块。这篇文章就干三件事:讲清 S3 和 C3 在 PSRAM、USB 上的真正差异,给一套把需求翻译成选型的判断方法,最后附一张下单前可以逐项核对、到手后可以逐步验证的采购单。
1. 先搞清楚一件事:S3 和 C3 不是一个系列的高配低配
1.1 芯片底子:一个 RISC-V 新秀,一个 Xtensa 正统续作
先说结论:ESP32-C3 不是 ESP32-S3 的“青春版”,它俩的关系更像是“两条产品线的交叉点”。C3 用的是乐鑫第一代 RISC-V 单核处理器,主频 160 MHz,设计目标非常明确——用低成本、低功耗的方案去替代老的 ESP8266 和一部分 ESP32 基础场景。它支持 WiFi 和 BLE 5.0,内置约 400KB SRAM,常见模组自带 4MB Flash,作为传感器节点、遥控器、智能开关这类“轻量级联网设备”的 SoC 非常合适。
S3 则是 ESP32 家族的正统续作,用的是 Xtensa LX7 双核,主频最高 240 MHz,内置 512KB SRAM,并且带了一组 SIMD 向量指令,官方的解释是用于 DSP 和 AI 加速。这个差异直接决定了它能做 C3 做不了的事:跑比较大的本地推理、跑复杂的 GUI 动画、同时处理 WiFi 和 USB 而不互相拖累。注意,S3 还内置了原生 USB-OTG 控制器,而 C3 只有 USB-Serial-JTAG 控制器,这两个东西名字都带 USB,实际能力差了一个量级。
我见过太多人只盯着“都是 Mini 板”“都是 Type-C 口”就下手,结果拿到手刷固件才发现内核架构完全不同,连编译工具链都不一样。所以第一件事就是纠正认知:C3 和 S3 是定位不同的芯片,不是同一块板子的“高性能版”。
1.2 一张表把核心差异摆平
| 核对项 | ESP32-C3 Mini | ESP32-S3 Mini |
|---|---|---|
| CPU 核心 | RISC-V 单核 | Xtensa LX7 双核 |
| 最高主频 | 160 MHz | 240 MHz |
| 内置 SRAM | 约 400KB | 约 512KB |
| 外挂 PSRAM | 不支持 | 支持(2MB 到 16MB) |
| 原生 USB-OTG | 无 | 有(FS 12Mbps) |
| USB-Serial/JTAG | 有 | 有 |
| Flash 常见配置 | 4MB(部分模组内置) | 4MB / 8MB / 16MB |
| 典型定位 | 低功耗传感器、遥控、开关 | GUI、摄像头、USB 外设、复杂应用 |
这张表里最值得划重点的,是“外挂 PSRAM”和“原生 USB-OTG”这两行。C3 的硬件设计里根本没有 PSRAM 控制器,也没有对应的外部引脚,所以网上有人说“C3 可以自己焊 PSRAM”,那是错的,物理上就不支持。S3 则把 PSRAM 和 USB 都做成了可选能力——同一个 S3 芯片,模组厂商可以选择带不带 PSRAM、带多大 PSRAM,这也导致市面上 S3 板子的规格非常杂乱,采购时必须逐项确认。
1.3 “Mini”命名的陷阱:同名不同命
“Mini”这个词在两家板子上更像一个尺寸风格标签,不代表同一系列。C3 Mini 和 S3 Mini 的 PCB 尺寸、排针间距、引脚引出方式、甚至 Type-C 口的内部接线都可能不一样。我就遇到过有人照着 C3 Mini 的引脚图去接 S3 Mini 的外部设备,结果把 I2C 引脚接错,折腾了一晚上。
更重要的是,两家厂商的 Mini 板可能引脚兼容,但芯片的外设映射不同。C3 的 UART0、I2C、SPI 默认引脚和 S3 不是一一对应的,直接套用教程里的begin()代码很可能跑不通。所以不管是买 C3 还是 S3,我都建议你把板子的原理图 PDF 下载下来存到本地,而不要只收藏一个淘宝链接。到手后先用它核对排针丝印,再开始接线,这是最省时间的做法。
2. PSRAM:S3 的内存杠杆,C3 的硬伤
2.1 PSRAM 到底解决什么问题
用一个生活类比:SRAM 是手边的工作台,PSRAM 是书柜。工作台就这么大,你同时只能摊开几份文件;PSRAM 是把书柜挪到旁边,随时可以把更多文件搬上桌,虽然从柜子里拿文件比工作台上直接拿慢一点,但总比没得放强。ESP32 这类芯片的 SRAM 非常有限,C3 约 400KB,S3 约 512KB,听起来不小,但一张 240×240 的 RGB565 图片就要 115KB 左右,跑个带图片解码的 LVGL 界面,内存立刻见底。
PSRAM 就是用来解决这种“临时空间不够”的问题的。它挂在 SPI 总线上,速度比内置 SRAM 慢,但容量可以做到 2MB、8MB、16MB。S3 芯片自带 PSRAM 控制器,所以模组厂商可以在封装里集成一颗 PSRAM 颗粒,片上应用就能拿到 MB 级的内存空间。C3 没有这个控制器,也没有 PSRAM 引脚,直接锁死了这条路。
所以,如果你的项目涉及以下任何一种情况,PSRAM 几乎是刚需:跑 Micropython 的大型应用、LVGL GUI + PNG/JPEG 解码、摄像头采集和帧缓冲、Web 服务器缓存大页面、音频播放缓冲。没有 PSRAM 的 S3 在这些场景下和 C3 一样难受。
2.2 S3 的 PSRAM 不止看容量:Quad 和 Octal 是两回事
很多人买 S3 只问一句“PSRAM 是几 MB”,这是不够的。S3 支持两种 PSRAM 接口:Quad SPI(QSPI)和 Octal SPI(OPI)。通俗说,QSPI 用 4 根数据线,OPI 用 8 根数据线,同一时钟下 OPI 的吞吐量接近 QSPI 的两倍。再配合更高的时钟频率和双沿采样,OPI PSRAM 在高帧率 GUI、摄像头预览这类持续大量读写的场景下会明显更稳。
举个实际例子:我在一块 2MB QSPI PSRAM 的 S3 板子上试过跑 LVGL 动效列表,滑动手感能接受,但切屏时有可见卡顿;换到 8MB OPI PSRAM 的板子后,同样代码切屏就顺了很多。这说明容量只是“装不装得下”的问题,接口速度是“跑不跑得动”的问题。商品页面如果只写“8MB PSRAM”而不写 Quad 还是 Octal,你可以直接问客服,或者在规格书里搜 PS RAM 接口部分。
另外注意单位换算。很多模组规格书写的是“64Mbit PSRAM”,除以 8 才是 8MB。如果看到“8Mbit”别高兴太早,那是 1MB。这个 Mbit 和 MByte 的坑,在 Flash 和 PSRAM 的标注里都非常常见。
2.3 什么项目必须上 S3 + 带 PSRAM 的版本
我按常见玩法分了三类:
第一类,桌面小屏幕设备。比如做个天气时钟、桌面宠物、带触控的播放器控制面板。这类项目跑 LVGL 或类似 UI 框架,再加上几张图片资源,内存占用很容易超过 1MB,没有 PSRAM 的 S3 会很吃力。建议直接选 8MB OPI PSRAM 的版本,一步到位。
第二类,摄像头相关。S3 支持摄像头接口,但一张 VGA 照片的 JPEG 编码缓冲就要几百 KB,如果要同时显示到屏幕,帧缓冲更大。C3 完全没有这条路线,S3 无 PSRAM 版本也会捉襟见肘。想做离线拍照、画面识别这类小项目,带 OPI PSRAM 的 S3 是起步配置。
第三类,Micropython 重度用户。Micropython 本身有解释器开销,再挂上网络库、GUI 库后,几百 KB 的内存会很紧张。S3+PSRAM 可以在 Micropython 里跑到几 MB 的可用堆内存,写代码时心态完全不一样,不用处处省着用。
反过来,如果只是做温湿度上报、开关控制、红外遥控、低功耗门磁这类“采集+上报”型项目,C3 Mini 绰绰有余。C3 的深度睡眠功耗更低,代码简单,成本也更低,没必要为用不上的 PSRAM 和双核买单。
2.4 C3 用户的内存焦虑,老实说基本无解
C3 没有 PSRAM 控制器,这是硬件层面的结论,软件优化只能缓解不能根治。如果你已经在 C3 上遇到malloc失败、跑一段时间重启、编译后 Flash 塞不下固件这些问题,常规操作是:用 ESP-IDF 而不是 Arduino,因为 C 代码更省内存;把大缓冲改成静态全局变量而不是动态分配;砍掉不必要的库。但这些操作只能把 400KB 的内存用到极致,救不了内存饥饿型应用。
我的建议很简单:如果项目还没开始,直接选 S3 带 PSRAM 的版本;如果项目已经做到一半,也别在 C3 上继续耗,换板子的成本大概率比重构代码低。这不是说 C3 差,而是工具要匹配任务。
3. USB:C3 的“USB”和 S3 的“USB”差了整整一个量级
3.1 C3 的 USB 到底是啥
C3 芯片内置了一个 USB-Serial-JTAG 控制器,它的作用是让板子插上电脑后直接枚举成一个虚拟串口(COM 口),顺便提供 JTAG 调试通道。对用户来说,最大的好处是不需要额外买 USB 转 TTL 模块,一根 Type-C 数据线就能烧录和看日志,非常方便。这也是它的全部能力。
注意,C3 的 USB 不能被配置成 U 盘、键盘、鼠标、游戏手柄,也不能作为 USB 主机去接外部设备。它本质上是一个内置的 USB 转串口桥,和板上焊一颗 CH340、CP2102、FT231X 的作用差不多,区别只是集成到了芯片里。所以那些玩 U 盘模拟、HID 键鼠的教程,第一步就要先确认芯片支不支持,C3 可以直接跳过。
3.2 S3 的 USB 能做哪些事
S3 内置的是原生 USB-OTG 控制器,支持全速 12Mbps。这意味着它可以作为 USB 设备(Device),也可以作为 USB 主机(Host)工作。Device 侧常见的类包括:CDC 虚拟串口、MSC 大容量存储(也就是被电脑当成 U 盘)、HID 人机交互设备(键盘、鼠标、游戏手柄)、DFU 固件升级,以及把这些类组合起来的复合设备。Host 侧则可以接 USB 键盘、USB 鼠标、U 盘、USB 转串口线等外设。
更关键的是,S3 还有一个独立的 USB-Serial-JTAG 控制器,所以 S3 板子上的那个 Type-C 口,在固件层面可以选择把它连接到哪个控制器。默认情况下,很多 S3 开发板插上去就是 COM 口,因为固件用的是 USB-Serial-JTAG;如果你想玩 TinyUSB,需要把 USB 外设配置到 OTG 控制器上。很多新人插上 S3 后发现“怎么还是只有串口”,就是这个原因,不是坏了。
3.3 实操示例:用 ESP32-S3 做一个 USB 键盘
如果你买了 S3 想验证 USB 能力,最直观的玩法是做一个 HID 键盘。需要准备一块引出 GPIO19/GPIO20 的 S3 板子(这两个引脚是 OTG 的 D-/D+),在 ESP-IDF 里启用 TinyUSB 组件,然后初始化 HID 设备,调用tinyusb_hid_keyboard_report发送按键报告,电脑上就能收到按键。
这个过程有两个关键点。第一,D+/D- 引脚是固定的,不能像 I2C 那样随便改,买板子时就要确认 Type-C 口的 D+/D- 是否连到了 GPIO19/20,并且没有占用其它功能。第二,TinyUSB 的运行会影响 USB-Serial-JTAG 的默认串口行为,调试日志可能会换到另一个通道,需要重新配置终端工具。我建议第一次做实验时,保留一个外接 UART 调试口(比如用 USB 转 TTL 接 GPIO43/44),避免日志和数据通道路冲突时两眼一抹黑。
还有一个顺手能玩的是 DFU。S3 的 ROM 引导程序支持 USB DFU 模式:按住 BOOT 键插入 USB,电脑上会出现一个 DFU 设备,用支持 DFU 的烧录工具可以直接下载固件,完全不需要额外的串口芯片。C3 没有这个功能,它的 USB 口永远只能当串口。
3.4 那些和 USB 相关的热词,哪些和这两块板子有关
最近总看到一堆 USB 关键词,我帮你过滤一下哪些和 S3/C3 真有关:
- usb 转串口:C3/S3 内置的 USB-Serial-JTAG 正在省掉外部芯片,但在 S3 上玩 TinyUSB 后可能不够用,所以外接 USB 转 TTL 仍是调试备用方案。
- usb 抓包 / usb 协议:想深入看 S3 枚举成什么设备、描述符对不对,Windows 下可以用 Wireshark + USBPcap,Linux 下直接
lsusb -v。C3 基本用不上。 - usb dfu / usb msc / usb gadget tool:这几个都是 S3 的原生 USB OTG 才能碰的功能,C3 做不到。
- 普通 USB 数据线和 OTG 线区别:S3 做主机接 U 盘/键盘时,需要 OTG 转接头或 USB-A 母座扩展板;C3 没有 Host 能力,不用考虑。
- 设备描述符请求失败:插上 S3 后 Windows 报“未知 USB 设备”,大多数时候是线材只充电不传数据,或者固件把 USB 引脚配置成了 GPIO 导致没有正常枚举。
4. 选型决策:把需求套进去
4.1 三种典型用户画像
我把常见的咨询场景归纳成三类,你可以对号入座。
第一类是传感器/低功耗玩家。需求是做个电池供电的温湿度计、门磁、遥控器、智能开关,几天甚至几个月不充电。这类项目最关键的是深海睡眠功耗、启动速度和价格,C3 Mini 几乎完美匹配。它的 RISC-V 单核虽然性能一般,但跑个 MQTT/HTTP 上报绰绰有余。选 C3 不是妥协,是合理匹配。
第二类是 GUI/摄像头玩家。需求是做个带屏幕的桌面摆件、摄像头拍照器、或者跑 Micropython 做原型验证。这类项目内存消耗大,对双核性能也有要求,直接选 S3 + 8MB OPI PSRAM 的版本,别省那十几块钱。我用无 PSRAM 的 S3 跑过 LVGL 做了个天气时钟,加载三张天气图标后内存告急,页面切换明显掉帧,后来换到 8MB PSRAM 版本才流畅。
第三类是 USB 外设玩家。需求是模拟键盘鼠标、做 U 盘、DIY 游戏手柄、读外部 USB 设备。这只有 S3 能胜任,而且一定要确认板子引出 GPIO19/20 并且 Type-C 口数据线连接正常。顺便说一句,如果你打算做 USB Host 读 U 盘,最好买带 USB-A 母座或者有 OTG 转接方案配套的板子,省得自己飞线。
4.2 一个快速决策表
| 需求信号 | 推荐选择 |
|---|---|
| 只要 WiFi/BLE + 低功耗 + 便宜 | C3 Mini |
| 跑 Micropython 但内存不够用 | S3 + PSRAM |
| 要跑 LVGL / 图片解码 / 摄像头 | S3 + OPI PSRAM |
| 要模拟 U 盘 / 键鼠 / 做 USB Host | S3(确认 GPIO19/20 引出) |
| 纯替代 ESP8266 的老项目 | C3 Mini |
| 想学习双核多任务 / 向量指令 / DSP | S3 |
我特别建议把“要不要 PSRAM”和“要不要原生 USB”作为两个独立的判断题,而不是只看芯片名字。S3 有大量无 PSRAM 版本,也有大量带 PSRAM 版本,它们虽然都叫 S3,实际体验差很多。买之前把需求翻译成“我需要大内存吗”“我需要 USB OTG 吗”这两个问题,基本就不会买错。
4.3 容易踩的几个认知坑
坑一:认为 C3 是 S3 的低配版本。这两个芯片定位不同,C3 在某些低功耗场景反而比 S3 更合适,不能简单用高低配来理解。
坑二:认为 S3 带 USB 就能自动变成 U 盘/键盘。S3 的 USB 能力需要固件配合,默认插上电脑很多时候还是串口,需要手动启用 TinyUSB 并写相应代码。
坑三:认为 S3 板子上标注“8MB 内存”是指 SRAM。这个 8MB 多半是 PSRAM 或 Flash,而不是当成内存用的 SRAM。看到“内存大”先问清楚是什么存储介质。
坑四:认为买到 S3 后可以自己焊 PSRAM 升级。S3 芯片本身支持,但模组内部是否预留了 PSRAM 引脚、PCB 是否布线,都不是你自己能决定的,况且没 PSRAM 的板子很可能连 PSRAM 焊盘都没画。下单前选对配置是最好的升级。
5. 下单前必看:一张可核对的采购单
5.1 采购单表格
下面这张表我每次买板子都会自己过一遍,虽然啰嗦,但很管用:
| 核对项 | C3 Mini 检查点 | S3 Mini 检查点 |
|---|---|---|
| 模组丝印 | ESP32-C3-MINI-1 或类似 | ESP32-S3-MINI-1 / WROOM-1 |
| 芯片丝印 | ESP32-C3 | ESP32-S3 |
| Flash 大小 | 常见 4MB | 4MB / 8MB / 16MB,问清 Mbit/MByte |
| PSRAM | 无,不用问 | 问清容量 + Quad 还是 Octal |
| USB 能力 | 仅 USB-Serial/JTAG | 原生 OTG,确认 GPIO19/20 引出 |
| 排针/引脚 | 确认是否焊好排针 | 确认是否焊好排针 |
| 天线形式 | PCB 天线 / IPEX | PCB 天线 / IPEX |
| 供电方式 | Type-C 5V | Type-C 5V,部分带电池充电 |
| 固件生态 | Micropython / Arduino / ESP-IDF | Micropython / Arduino / ESP-IDF / TinyUSB |
| 到手验证工具 | esptool chip_id | esptool chip_id + PSRAM 日志 |
5.2 怎么在下单前通过商品页做预核对
下单前不用等快递,先做两件事。第一,把商品主图放大,看 PCB 上的模组丝印。模组丝印通常会直接印着 ESP32-S3-WROOM-1 或 ESP32-C3-MINI-1 这类字符串,一眼就能确认芯片家族。如果图片里看不清,评论区晒单图一般会更清楚。第二,直接问客服三个问题:PSRAM 多大、是 Quad 还是 Octal、USB 口是否支持 TinyUSB 示例。愿意回答的店铺靠谱程度会高很多,支支吾吾的店铺建议慎买。
有经验的卖家还会提供固件验证截图,比如esptool flash_id的输出、Micropython 启动时打印的RAM: 1048576这类信息。在我个人经验里,能拿出这种截图的卖家,说明他们是真的了解自己卖的东西。
5.3 到手后逐项验证
快递到手,先别急着接线,花 10 分钟跑一遍验证流程。
pip install esptool python -m esptool chip_id python -m esptool flash_id python -m esptool read_macchip_id会显示芯片型号,比如Chip is ESP32-S3还是Chip is ESP32-C3,这能直接戳穿任何刷错固件的板子。flash_id会显示 Flash 厂商和容量,确认和购买页一致。如果是 S3 带 PSRAM 的版本,可以刷一版支持 PSRAM 的 Micropython 固件,启动日志或在 Python 里执行:
import gc print(gc.mem_free())如果可用内存只有几百 KB,说明 PSRAM 没启用;如果出现几 MB,恭喜,PSRAM 在工作。
5.4 关于版本差异和批次坑
模组厂商经常调整 Flash/PSRAM 的组合,同一个板子商品页可能换过好几个硬件版本。S3 的模组型号后缀里,N 后面数字一般表示 Flash 大小,R 后面数字一般表示 PSRAM 大小,比如 N8R8 大约就是 8MB Flash + 8MB PSRAM。但这个规则不是所有模组都统一,所以仍然要以板子实物丝印和规格书为准。
C3 也有内置 Flash 规格的差异,比如 ESP32-C3FH4 这类带内置 Flash 的封装。不同批次还可能用不同品牌的 Flash 颗粒,虽然绝大多数不影响使用,但如果你要做批量产品,最好固定一个硬件版本再针对性测试,避免“这批板子刷上没问题,下批板子刷上就异常”这种幽灵问题。
6. 到手后 30 分钟快速验证:从 esptool 到 TinyUSB
6.1 环境准备与驱动注意
Windows 下插上 C3/S3 板子,系统一般会识别出一个 COM 口。如果识别异常,先检查数据线是不是“只充电不传数据”的线,这类线在淘宝上泛滥,是“设备描述符请求失败”的头号元凶。Linux 下驱动基本免装,但要注意 ModemManager 有时会抢占串口,导致打开端口失败,可以暂时停止该服务。macOS 直接看/dev/tty.usbmodem*或/dev/cu.usbmodem*即可。
esptool 用 pip 装就行。进入下载模式的方法一般是按住 BOOT 键再插入 USB,或者插着 USB 短按 RESET 后在串口监视器里看到Waiting for download。S3 要玩 DFU 的话,可以在按住 BOOT 插 USB 时观察系统里是否出现 DFU 设备,有的话说明 ROM 引导已经进入 USB 下载模式。
6.2 芯片、Flash、PSRAM、USB 四步验证
第一步验证芯片:
python -m esptool chip_id第二步验证 Flash:
python -m esptool flash_id第三步验证 PSRAM:刷一个支持 PSRAM 的固件,看启动日志或执行上面的 Micropython 内存检查。如果固件不支持 PSRAM 配置,就算板子上有 PSRAM 颗粒也看不到,所以不要第一时间怀疑硬件。
第四步验证 USB 能力:默认固件插上只看到 COM 口是正常的。想验证 S3 的 OTG/HID,可以烧一个 ESP-IDF 的 TinyUSB 示例,比如tinyusb_hid,然后重新插拔板子,电脑上会枚举成一个键盘/自定义 HID 设备。如果还是 COM 口,说明固件没有把 OTG 控制器启用,或者 Type-C 口内部只连接了 USB-Serial-JTAG 那一路,需要看板子原理图确认。
6.3 常见问题速查表
| 现象 | 可能原因 | 排查方法 |
|---|---|---|
| 电脑完全找不到设备 | 线材只供电不传数据 | 换一根短的数据线 |
| 未知 USB 设备(设备描述符请求失败) | USB 引脚被固件配置成 GPIO / 供电不足 / 线材差 | 换线、换口、进下载模式重试 |
| 烧录提示 no serial data received | 没进入下载模式 / 串口号选错 | 按住 BOOT 插 USB,重新查看串口号 |
| 插上后 USB 识别成光驱/CD-ROM | 驱动被虚拟光驱类描述符抢占 | 手动更新驱动为串口设备 |
| S3 只有 COM 口,没有 HID/U 盘 | 固件未启用 TinyUSB / OTG 控制器 | 烧 TinyUSB 示例、检查 GPIO19/20 |
| Micropython 内存才几百 KB | 固件未开启 PSRAM 或板子无 PSRAM | 换带 PSRAM 固件,核对硬件版本 |
| C3 无法模拟 U 盘/键盘 | 硬件不支持 OTG | 换 S3 |
6.4 我的几个实操小技巧
第一个技巧,常备一根质量好的短 Type-C 数据线,专门用来烧录和调试。很多玄学问题都是线材引起的,这根线值得投资。
第二个技巧,在 S3 上做 USB 实验前,先确认有没有外接 UART 调试口。理由前面说过,开了 TinyUSB 后默认串口行为会变化,如果没有外接调试口,日志很容易看不见,排查起来非常痛苦。
第三个技巧,手机上存一份 esptool 命令备忘和一个支持 OTG 的转接头。外出调试时,用手机给板子供电、用转接头连一个 USB 键盘,就能快速验证 S3 的 Host 功能,不用背着电脑。
第四个技巧,也是我目前最受用的:收到板子后把规格书 PDF、原理图、固件版本、esptool 输出全部归档到一块,按日期命名。版本差异在 ESP32 生态里太常见了,没有归档的话,半年后你想复现一个项目,可能连当初烧的是哪个固件都记不清。
我个人实际用下来,抽屉里常备三块 C3 Mini 做传感器节点,两块 S3 Mini 分别处理 GUI 和 USB 实验。踩过最大的坑就是为省几十块买无 PSRAM 的 S3,结果 GUI 卡到怀疑人生,所以后来采购单里永远有一行“PSRAM 容量 + 接口类型”,下单前放大商品图看模组丝印,再问一句“能不能跑 TinyUSB 示例”,确认清楚再付钱。希望这份采购单也能帮你少走一次弯路。