只要你在购物车里同时躺着 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-S3 | ESP32-C3 |
|---|---|---|
| 内核架构 | 双核 Xtensa LX7,最高 240MHz | 单核 RISC-V,最高 160MHz |
| 内部 SRAM | 512KB | 约 400KB |
| PSRAM 扩展 | 支持,常见 2MB / 8MB | 不支持 |
| USB 能力 | 原生 USB-OTG,支持 Host 与 Device | 仅 USB-Serial/JTAG,用于下载与日志 |
| WiFi / 蓝牙 | WiFi 4 + BLE 5.0 | WiFi 4 + BLE 5.0 |
| 常见模组 | ESP32-S3-WROOM-1 / MINI-1 | ESP32-C3-MINI-1 / WROOM-02 |
| 典型 Flash | 4MB / 8MB / 16MB | 4MB |
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 Mini | C3 够用,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 检测,这套流程看起来很基础,但确实帮我避开了很多后期返工。选板子本质上是选“够用的硬件边界”,把边界划清楚了,后面写代码、调试、做原型才会顺。