ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

ESP32-S3 Mini还是C3 Mini?PSRAM与USB差异详解

ESP32-S3 Mini还是C3 Mini?PSRAM与USB差异详解

只要你在购物车里同时躺着 ESP32-S3 Mini 和 ESP32-C3 Mini,我大概就能猜到你的状态:想玩 WiFi/蓝牙嵌入式,预算不多,希望几十块钱把所有功能都体验一遍。这个想法没问题,Mini 板型这两年在玩家圈子里确实火,引脚基本全引出、插面包板方便、驱动也成熟。但走到付款这一步,很多人就开始卡壳——因为同名的“Mini”,S3 和 C3 差别实在太大:C3 Mini 适合轻量联网节点、传感器采集、开关控制这类固定任务;而 S3 Mini 因为带双核、能挂 PSRAM、还有原生 USB-OTG,适合跑 MicroPython 大脚本、LVGL 界面、摄像头、USB 键鼠模拟这些“吃内存、吃外设”的活。

这篇文章我把 PSRAM、USB 以及“怎么核对一张采购单”从头拆一遍,还会附上我踩过的一些坑。无论你是刚摸单片机,还是已经在用 MicroPython 做项目,都能拿去对照。

1. S3 Mini 和 C3 Mini 不是大小号,是两个物种

1.1 一眼看懂核心差异:芯片、内核、内存

很多新手以为 C3 是 S3 的“低配版”,S3 是 C3 的“高配版”,就像手机的标准版和 Pro 版。这个理解放在乐鑫这两颗芯片上是不成立的。C3 走的是 RISC-V 架构单核路线,S3 是 Xtensa LX7 双核架构,指令集都不同,周边外设能力和扩展上限也完全不在一个量级。

这里先给一张核心对比表,后面所有选购决策都从这张表出发:

对比项ESP32-S3ESP32-C3
内核架构双核 Xtensa LX7,最高 240MHz单核 RISC-V,最高 160MHz
内部 SRAM512KB约 400KB
PSRAM 扩展支持,常见 2MB / 8MB不支持
USB 能力原生 USB-OTG,支持 Host 与 Device仅 USB-Serial/JTAG,用于下载与日志
WiFi / 蓝牙WiFi 4 + BLE 5.0WiFi 4 + BLE 5.0
常见模组ESP32-S3-WROOM-1 / MINI-1ESP32-C3-MINI-1 / WROOM-02
典型 Flash4MB / 8MB / 16MB4MB

S3 双核意味着你可以一边跑 WiFi 协议栈,一边跑业务逻辑,复杂任务不容易互相卡顿;C3 单核虽然够用,但在高负载下会明显感觉到“忙不过来”。我实际测过,同样一段 JSON 解析加 HTTP 请求,C3 要明显慢一截,但 C3 的功耗和价格也更友好。所以这不是谁替代谁的关系,而是看你手上项目的真实诉求。

1.2 为什么 Mini 板型这么讨喜

Mini 板型这两年能火,原因很朴素:方便。2.54mm 排针间距可以直接插面包板和洞洞板,比乐鑫官方 DevKitC 那种大板子灵活太多;板载 Type-C、电源 LDO、按键、LED、天线,外围电路基本都集成好了。价格上,C3 Mini 通常在 10 到 20 元,S3 Mini 在 20 到 40 元,对学习和原型验证来说成本极低。

另外,Mini 板子的社区资料非常全。合宙、WeAct、微雪这些第三方厂商都有自己的文档和示例,引脚定义、出厂固件、MicroPython/Arduino 配置基本都能搜到。对于新手来说,这意味着踩坑之后大概率能找到对应的解决方案,不会被一块边缘板子卡死。这也是我推荐多数人从 Mini 板入手的原因,而不是去买裸模组自己画板。

1.3 选错之后的代价

选错不是“性能差一点”的问题,而是有些项目压根做不成。举个最典型的例子:C3 没有 USB-OTG,你买回来想让它模拟成键盘给电脑打字,物理上就做不到,只能重新换板子。再比如 S3 有些低配版本不带 PSRAM,你兴冲冲刷了 MicroPython 想跑 LVGL 做全彩界面,一开屏就内存不足,画面根本刷不动。

所以我的建议是:买之前先想清楚主要用来干什么,再倒推出需要哪些配置。别只看“S3 性能更强”就无脑下单,也别因为“C3 便宜”就忽略内存瓶颈。

2. 先说 PSRAM:有没有它,完全是两块板子

2.1 PSRAM 到底是什么

PSRAM 可以理解为外挂内存。ESP32-S3 芯片内部有 512KB SRAM,听起来不少,但系统本身、WiFi 协议栈、蓝牙协议栈、MicroPython 解释器都要占空间,真正能留给开发者自由分配的内存往往只有两三百 KB。跑点简单逻辑没问题,但一旦涉及大 framebuffer、大模型、大量字符串拼接,这点内存立刻就见底了。

PSRAM 就是用来解决这个问题的。它通过 SPI/Octal 接口挂在芯片外部,大小常见 2MB 或 8MB,价格没贵多少,但可用内存直接翻好几倍。拿 MicroPython 举例,没有 PSRAM 时 GC 堆可能只有 100KB 出头,开了 PSRAM 之后堆可以涨到 1MB 甚至更多,跑大脚本的体验完全不一样。

提示:ESP32-C3 本身不支持 PSRAM。所以凡是跟你说“C3 也能扩内存”的,基本不靠谱,硬件上就没有对应的控制器接口。

2.2 哪些场景必须上 PSRAM

我整理了几个最容易碰到的场景,只要沾上其中一个,无 PSRAM 的板子基本不用考虑。

第一是 LVGL 图形界面。假设你用一块 240x320 的彩色 TFT 屏,RGB565 格式下每像素两个字节,一帧 framebuffer 就是 240x320x2 = 153600 字节,约 150KB。要做流畅的 UI 滚动、动画、双缓冲,至少需要 300KB 以上。内部 SRAM 撑不住,PSRAM 几乎是刚需。

第二是摄像头。OV2640 这类摄像头的 QVGA 分辨率 RGB565 帧 buffer 已经约 150KB,加上压缩编码 buffer、DMA 缓冲,一轮操作轻松超过 400KB。经典的 ESP32-CAM 之所以拍照稳定,靠的就是板载 PSRAM。没有 PSRAM,摄像头项目基本寸步难行。

第三是 MicroPython 大数据处理。比如反复请求 REST API 解析 JSON、拼接字符串、处理长文本,Python 对象开销大,内存增长很快。我实际遇到过一个场景:一段 20KB 的 JSON 数据在无 PSRAM 的板子上直接 MemoryError,挂了。换到 8MB PSRAM 的 S3 后,同样的代码跑得毫无压力。

第四是离线语音和 TinyML。语音唤醒、命令词识别、TinyML 模型推理,模型权重动辄几百 KB 起,推理时的中间张量又占一块。没有 PSRAM,很多现成模型根本加载不进去。

2.3 怎么确认板子带没带 PSRAM

看模组型号就行。乐鑫模组命名里 R 代表 PSRAM,N 后面的数字代表 Flash 大小。比如 ESP32-S3-WROOM-1-N8R2 是 8MB Flash + 2MB PSRAM;N16R8 是 16MB Flash + 8MB PSRAM。如果是 MINI-1 模组,商品页通常会写明“8MB Flash + 2MB PSRAM”这样的组合。

但商品页有时候不靠谱,尤其是某些第三方小厂,标题写“高配”实际发货“低配”。最好的办法是到手后直接在 MicroPython REPL 里验证:

import esp print(esp.psram_size())

返回字节数大于 0,说明 PSRAM 已启用且可用;返回 0 就说明板子上没有 PSRAM,或者固件没有启用 PSRAM 支持。部分固件版本 API 名可能有差异,如果没有这个函数,可以改成import gc; print(gc.mem_free()),然后对照固件文档看堆大小是否异常地小。

3. USB 的区别比你想的大:C3 的 USB 不能插 U 盘

3.1 S3 原生 USB-OTG 到底能做什么

S3 芯片内置了完整的 USB-OTG 控制器,物理引脚是 GPIO19(D-)和 GPIO20(D+)。它既可以做 USB Host,也可以做 USB Device。做 Host 时能读 U 盘、接键盘鼠标、接游戏手柄、接 USB 转串口模块;做 Device 时能模拟成 HID 键盘鼠标、MSC 大容量存储、CDC 串口设备。

这意味着什么?你可以用 S3 做一个自动输入文字的“键盘模拟器”,或者做一个 USB 转接器,甚至做一个免驱 U 盘用于数据交换。这些都依赖 USB 协议栈里的枚举、端点传输、类驱动这些概念。不过作为应用层玩家,不需要把 USB 协议全部啃一遍——Arduino 下的 TinyUSB 库、MicroPython 的 USB 相关库都封装好了,调用示例即可。

我自己的一个项目是用 S3 Mini 模拟 HID 键盘,接一个小按键矩阵,按一下就能输出一串常用命令。这个需求用 C3 就完全做不到,因为 C3 的 USB 口没有 Host 能力,也不支持 HID Device 类。

3.2 C3 的 USB 只是“调试口”

ESP32-C3 也有 USB 接口,但那个 USB 控制器是 USB-Serial/JTAG,定位是给开发者下载固件、打印串口日志、做 JTAG 调试用的。它不能枚举 U 盘,不能接键盘鼠标,不能做 USB-OTG Host。很多新手买回 C3 板子,看到 Type-C 口就以为无所不能,结果插上 U 盘一点反应都没有,这是最典型的认知误区。

所以要记住一个判断标准:不是所有 Type-C 口都叫 USB-OTG。S3 的原生 USB 口才有完整的 Host/Device 能力,C3 的 USB 口本质上是“保留调试功能”的串口替代方案。

3.3 板子的 USB 接口与串口芯片,下单前看清

这里还要说一个容易忽略的坑:芯片有 USB-OTG 能力,不代表板子一定把原生 USB 引出来了。市面上很多 S3 核心板只有一个 Type-C 口,这个口连的是外部 USB-UART 芯片(常见 CH340、CP2102、CH9102),用来和电脑通信、下载固件,并不直接连 S3 的 GPIO19/20。也就是说,你拿到手想玩 USB Host,却发现根本没有可插外设的口。

下单前先看两个信息:一是商品页有没有明确标注“USB-OTG”或“原生 USB”口,二是板子的 USB 口数量。很多 S3 Mini 板子是双口设计,一个 Type-C 接 UART 芯片用于调试下载,另一个 Type-C 直连 S3 原生 USB 引脚用于 OTG。如果只有一个口,且原理图显示走的 CH340/CP2102,那原生 USB 基本没引出。

外置串口芯片的种类也值得留意。CH340 在 Windows 下需要装驱动,CP2102 在新版系统里经常自动识别,CH9102 是 CH340 的升级替代。无所谓好坏,关键是别把“驱动装不上”误判成板子坏了。我遇到过好几次,到头来只是系统没有识别对驱动,重新安装官方驱动就恢复。

3.4 USB Host 外设供电是个大坑

如果你准备用 S3 的 USB Host 功能接耗电外设,比如移动固态硬盘、带灯的机械键盘,一定要提前解决 5V 供电问题。S3 核心板的 3.3V LDO 只负责给芯片和接口逻辑供电,VBUS 的 5V 通常需要从 USB 口或者外部电源接入,很多小板的 VBUS 电流输出能力很有限。

我实测下来的经验是:U 盘插上没反应,先看 U 盘的指示灯亮不亮。不亮大概率是 VBUS 供电不足,用带独立供电的 USB Hub 转接一下,问题立刻就解决。如果灯亮了但还是不识别,再往枚举失败、文件系统格式方向排查。

提示:USB 协议里的枚举、描述符、端点这些概念,玩到 Host 模式时迟早会接触到。遇到“Unknown Device”这类错误,优先怀疑供电、接触、线材,而不是直接往协议深处钻。

4. 采购核对单:一张表把配置看明白

4.1 核心字段与核对方法

买 Mini 板子不是只看芯片型号就行,商家在 Flash、PSRAM、USB 引出、天线类型、引脚引出上能玩出各种花样。我自己吃过亏之后,每次下单前都会列一张核对表,核对完再付款。

核对字段为什么重要建议核对方式
芯片型号S3 和 C3 能力差异巨大看商品标题与描述,确认是 ESP32-S3 还是 ESP32-C3
模组型号决定 Flash、PSRAM 组合认准 WROOM-1 / MINI-1,标注 N8R2 / N16R8
Flash 大小决定固件和文件存储空间8MB 起步,跑 TTS/摄像头建议 16MB
PSRAM 大小决定大内存项目能否运行明确标注 2MB 或 8MB,没标注默认无
USB-OTG 引出决定能否玩 USB Host/Device看是否有原生 USB 口,是否有第二 Type-C
USB-UART 芯片决定驱动安装难度CH340/CP2102/CH9102,注意驱动
天线类型决定 WiFi 信号稳定性PCB 天线够用,IPEX 外接天线更灵活
板载 LED/按键决定原型调试便利度确认引脚映射,是否有 RGB LED
GPIO 引出决定外设扩展能力尽量选全引脚引出版本
供电电路决定功耗与接口兼容性是否有 5V 输入、电池充电、LDO 规格

做这张表的初衷很简单:商品标题和实际配置经常对不上。有些店铺写的“ESP32-S3 开发板”,到手发现是 Mini-1 模组的低 Flash 版本,标题里完全不提 Flash 和 PSRAM 大小。我的原则是,详情页没有标注模组完整型号的,一律按缩水版对待;价格明显偏低的 S3 Mini,往往就是无 PSRAM 或 4MB Flash 版本。

4.2 常见板级型号与配置参考

以市面上常见的第三方 Mini 板为例,大致可以这么归类。WeAct 的 ESP32-S3-MINI-1 Core Board 常见配置是 8MB Flash + 2MB PSRAM,Type-C 接口,排针基本全引出,比较适合需要原生 USB 的项目。合宙的 ESP32-S3 Mini 系列 SKU 比较多,有标配版也有大内存版,部分版本板载两个 USB 口,能同时兼顾调试和 OTG,但不同批次差异明显,必须看详情页。C3 Mini 最常见的是 4MB Flash 无 PSRAM,配上 CH340 或者直连内置 USB-Serial/JTAG,价格特别低,适合轻任务。

这里有个选型技巧:如果你是跟着某个开源项目买板,直接抄作者提供的型号和店铺链接,比自己重新选型稳妥得多。开源作者踩过的坑已经帮你筛掉一大半,你只要按原配置购买,基本能复现项目效果。如果你想自己组合,就按 4.1 的核对表逐项比对。

4.3 典型场景直接给结论

不同需求的配置差异我整理成一张表,直接照抄就行:

项目场景推荐配置理由
温湿度上报、MQTT 开关、智能灯ESP32-C3 Mini 4MB便宜、低功耗、任务轻量
ESPHome / Tasmota 固件ESP32-C3 Mini 或 S3 MiniC3 够用,S3 性能更充裕
OLED 屏显示 + 简单逻辑ESP32-C3 Mini内部 SRAM 能扛住小型 framebuffer
MicroPython 处理 JSON / 爬取数据S3 Mini + PSRAM堆内存大,不容易 MemoryError
LVGL 彩色 UI / 带屏桌面摆件S3 Mini + 8MB PSRAM双缓冲和控件需要大量内存
USB 键盘鼠标模拟、HID 注入S3 Mini,确认带原生 USB 口C3 无 OTG 能力
摄像头拍照 / 图像识别S3 Mini + 8MB PSRAM帧缓冲必须外挂 PSRAM
离线语音唤醒 / 命令词识别S3 Mini + 8MB PSRAM模型权重需要几百 KB

这条表是我被问得最多的内容。每次有人拿着“我该买哪块”来问,我基本都从这表里挑一行给他。说实话,大多数人说想学习嵌入式,最后真正做完的项目不过是传感器、屏幕、语音这三类。干脆按目标用途锁定配置,就不要在购物车里反复纠结了。

5. 买回来后怎么验货:5 分钟确认没买亏

5.1 插电先看设备枚举

新板子到手后别急着写代码,先插电脑看设备能不能正常识别。在 Windows 设备管理器里,插上 Type-C 后应该能看到一个 COM 口,名字可能是“CH340”“CP2102”或“USB-SERIAL CH340”之类的。如果看到“未知 USB 设备(设备描述符请求失败)”,先换一根确定能传数据的数据线,再换一个 USB 口,最后再考虑驱动问题。

我自己就栽过跟头:家里一堆 Type-C 线,大部分是手机充电线,只有少数几根支持数据传输。插上去电脑毫无反应,第一反应以为是板子短路了,后来换线立刻识别,虚惊一场。所以验货第一步,建议直接拿一根确定好的数据线来测。

5.2 用 esptool 读芯片信息

识别 COM 口之后,用 esptool 拉一下芯片信息,几分钟就能确认 Flash 大小和芯片型号:

pip install esptool esptool.py --port COM14 flash_id

正常输出会包含Chip is ESP32-S3、Flash size: 8MB、MAC 地址等关键信息。如果连接失败,一般需要按住板上的 BOOT 键再插线,或者插线后按住 BOOT 再按一下 RST 键,让芯片进入下载模式。这一步能排除绝大多数“板子坏了”的误会。

但要注意:esptool 的flash_id只能识别 SPI Flash,不能直接判断 PSRAM 容量。所以 PSRAM 是否正常,还是要靠上电后的固件来测。

5.3 用 MicroPython 验证 PSRAM 和大内存分配

给板子刷一个带 PSRAM 支持的 MicroPython 固件,然后打开 REPL 执行:

import esp print(esp.psram_size())

如果返回 2097152 或 8388608 之类的数字,说明 PSRAM 工作正常。如果返回 0,先确认固件是否支持 PSRAM,再确认板子硬件是否真的带 PSRAM。

还可以直接做一次大内存分配测试:

import gc buf = bytearray(1024 * 1024) print(len(buf))

在 8MB PSRAM 的板子上,分配 1MB 字节数组非常轻松;在无 PSRAM 的板子上,这一步大概率 MemoryError。这个测试比看规格表更真实,也更能暴露“标称配置”和“实际配置”的差异。

5.4 别忘了验证 USB 和 WiFi

有原生 USB 口的 S3 板子,建议刷一个 TinyUSB 的示例,确认 USB-OTG 链路正常工作。Arduino 环境下可以选 HID 键盘或者 MSC 模拟的 demo,编译上传后插到电脑上,看系统是否枚举出对应设备。这一步能确认板子的原生 USB 引脚确实连接到了接口,而不是只开了一个 USB-UART 口。

WiFi 部分,直接跑一个官方扫描示例,看扫描到的 AP 数量以及 RSSI 值。如果板子天线位置被外壳遮挡或天线损坏,信号会明显偏弱。我一般会把板子放到路由器两米以内测试,RSSI 通常在 -40dBm 到 -50dBm 左右,如果只有 -70dBm 甚至更低,就要怀疑天线或板子质量问题。

6. 常见问题速查与经验笔记

6.1 一张表解决八大高频问题

现象可能原因处理方法
插上电脑完全没反应充电线、驱动没装、BOOT 模式不对换数据线、装驱动、按住 BOOT 插线
提示未知 USB 设备线材接触不良、驱动异常换线刷新,重装 USB 控制器驱动
MicroPython 内存小固件未启用 PSRAM 或板子无 PSRAM查esp.psram_size(),换固件或换板
C3 无法识别 U 盘C3 没有 USB-OTG 功能硬件限制,只能用 S3
S3 Host 口识别不出设备VBUS 供电不足使用带供电 USB Hub,补 5V 供电
LVGL 运行卡顿或崩溃framebuffer 内存不足开 PSRAM,减少缓冲层数,降低分辨率
板载 LED 不亮GPIO 引脚、极性不对查原理图,确认板载 LED 连接的 GPIO
固件下载失败BOOT 模式未进入、波特率问题按住 BOOT 重试,降低波特率到 115200

6.2 一些只有上手后才会懂的经验

刷机之前,强烈建议先把板子出厂固件备份一下。很多第三方板子出厂自带演示程序,能测 LED、WiFi、按键这些硬件是否正常。这些固件在官网不一定能找到,刷没了再想恢复很麻烦。我现在的习惯是到货后先跑一遍出厂演示,确认所有板载外设正常,再开始刷自己的固件。

另一个容易被忽略的点是 PSRAM 引脚冲突。S3 的外挂 PSRAM 会占用一部分原本可用的 GPIO,比如部分型号的 PSRAM 数据引脚对应芯片内部特定 IO,板子设计时这些引脚就不再引出或不能做普通 IO 用。所以带 PSRAM 的板子,GPIO 可用数量通常比理论值少几个。做项目前先看厂家引脚定义表,别把某个“看着空着”的引脚当普通 GPIO 用了,很可能已经被 PSRAM 占着。

最后说点个人建议。如果你刚入门,实在拿不准,就买一块带 8MB PSRAM 的 ESP32-S3 Mini,价格贵不了多少,但能把 LVGL、摄像头、USB 这些大热门都玩一遍。等你明确知道自己只需要一个温度计、MQTT 开关这类轻量任务时,再买 C3 Mini 也不迟。我每次拿到新板子都先花十分钟插电、看枚举、跑 PSRAM 检测,这套流程看起来很基础,但确实帮我避开了很多后期返工。选板子本质上是选“够用的硬件边界”,把边界划清楚了,后面写代码、调试、做原型才会顺。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进