☰
ESP32-S3 Mini还是C3 Mini?选型、PSRAM和USB避坑指南
2026/10/6 1:18:14 网站建设 项目流程

玩 ESP32 的人,迟早都会在“S3 Mini”和“C3 Mini”之间纠结一下。两个板子都是十来块、名片大小的开发板,插个 Type-C 就能用,但“能用”和“够用”完全是两码事。我经常被问:就做个智能开关,买哪个?想跑屏幕 UI,买哪个?想把板子变成鼠标键盘,买哪个?答案不太一样。这篇我就从选型思路、PSRAM、USB 这几个最影响决策的点展开,最后放一张可以对着下单选型的核对表,顺便聊聊验货和排坑,希望能帮你少花一笔冤枉钱。

1. 为什么你会纠结 S3 Mini 和 C3 Mini?

1.1 这俩板子到底有什么不同

首先得把芯片本身的分歧讲清楚。ESP32-S3 是双核 Xtensa LX7 处理器,主频最高 240MHz,带向量指令和 SIMD,除了常规 WiFi/BLE 之外,核更“粗”;ESP32-C3 是单核 RISC-V 处理器,主频最高 160MHz,架构新,但性能明显矮一头。两者都能跑 WiFi 和 BLE 5,日常联网都没问题,但在需要算力的场景,比如图像处理、复杂的 UI 渲染、大量浮点运算,S3 的底子明显更厚。

很多人只看到“都是 4MB Flash”就觉得差不多,实际上真正的落差在内存。S3 内置约 512KB SRAM,部分版本还带外部 PSRAM,可以干“大内存活”;C3 只有约 400KB SRAM,且不支持外部 PSRAM。什么意思?当你用 Arduino 或 ESP-IDF 写代码,malloc 一块稍微大的缓冲区都会失败时,就明白“内存决定玩法”了。

Mini 开发板还有个容易忽略的点:板载 USB 接口的种类。S3 有 USB OTG 和 USB Serial/JTAG 两个控制器;C3 只有 USB Serial/JTAG。也就是说,C3 只能把 USB 口当作串口和调试口用,没法模拟成 USB 键盘、鼠标、U 盘这类外设。如果你项目里需要“被电脑识别成一个 USB 设备”,只能老老实实选 S3。

1.2 Mini 板型的选型逻辑

Mini 板的核心优势是小和便宜,劣势是引出的 GPIO 和外围资源不如 DevKit。选型时先别纠结板子外形,先把项目约束列出来:要不要跑屏、要不要接摄像头、要不要做 USB 外设、要不要做低功耗电池设备、有没有 5V/3.3V 供电条件、开发环境是 Arduino 还是 ESP-IDF 还是 MicroPython。

列完之后再套两条粗线:

  • 如果只是做继电器控制、温湿度采集、MQTT 上报、BLE 广播这种“轻任务”,C3 Mini 通常够了,而且功耗表现更好,价格也更低。
  • 如果你要玩 LVGL 界面、摄像头拍照、语音处理、USB HID 外设,或者以后想跑更复杂的固件,直接选 S3 Mini,并且优先选带 PSRAM 的版本。

我见过不少朋友图便宜买了 C3 Mini,后来想加个小屏幕,LVGL 跑不动,只好又买 S3,板子钱翻倍不说,还得重写底层。选型时“往上留一档”,长期看反而更划算。

2. PSRAM:最容易被忽略的性能分水岭

2.1 PSRAM 是什么,什么时候必须用它

PSRAM 的中文叫伪静态随机存储器,本质上是一种通过 SRAM 接口访问的 DRAM,外面包了刷新逻辑,让主控可以把它当普通 SRAM 用。在 ESP32-S3 上,外部 PSRAM 通过 SPI 接口连接,常见容量 2MB、4MB、8MB,它和芯片内部 SRAM 一起组成你 malloc 时的可用堆。

有人觉得:S3 不是有 512KB SRAM 吗?为什么还要 PSRAM?做个灯控绰绰有余,但如果你跑 LVGL,一个 320x240 RGB565 屏幕帧缓冲就要 320×240×2 = 150KB,一个页面细化控件、字体、图标缓存,512KB 很快就吃完了。再比如接一个 200 万像素摄像头,图像缓冲区动辄几百 KB,没有 PSRAM 根本拍不了照。跑 MicroPython 也一样,解释器、对象、字节码都吃内存,内部 SRAM 很容易爆。

C3 没有 PSRAM,这是硬件限制,软件再怎么优化也补不回来。不过反过来想,C3 的外设需求通常也简单,跑一些轻量固件反而省电。所以“PSRAM 是不是必须”完全取决于应用场景,谁也别劝谁,先想清楚目标。

2.2 怎么确认板子上的 PSRAM 有没有被系统启用

买回来的 S3 Mini,哪怕焊了 PSRAM,如果固件配置没开启,编译器也不知道有这玩意。拿 ESP-IDF 来说,需要保证CONFIG_SPIRAM是开启状态,常见选项有:

  • CONFIG_SPIRAM_BOOT_INIT:开机时初始化 PSRAM
  • CONFIG_SPIRAM_TRY:PSRAM 初始化失败时,系统还能继续启动
  • CONFIG_SPIRAM_USE_MALLOC:将 PSRAM 纳入 heap,让 malloc 能分配大块内存

在 Arduino IDE 里也要选对 Board。很多 S3 开发板在“Tools”菜单下有一项PSRAM: OPI PSRAM或者Quad PSRAM,默认可能是 Disabled,你不改过来,PSRAM 就是摆设。烧录后在串口监视器里看启动日志,一般能看到类似PSRAM initialized或Adding pool of 8192K of PSRAM memory to heap allocator的提示。如果没看到,说明 PSRAM 没被使能,回去检查配置。

还有一个快速测试方法:用ESP.getPsramSize()/ESP.getFreePsram()(Arduino)看返回值。能读出 4MB 或 8MB,基本就说明 PSRAM 已生效。注意,有些板子丝印写的是“S3 Mini 8MB”,但这里的 8MB 可能指 Flash,也可能指 PSRAM,一定要看清楚型号描述。买了之后用代码验证,比看商品页靠谱得多。

3. USB:从烧录口到 USB 外设,坑比你想的多

3.1 C3 和 S3 的 USB 控制器差异

这一块一定要掰开揉碎。ESP32-C3 芯片内部只有一个 USB Serial/JTAG 控制器,它做的事情是把 USB 虚拟成一个串口,同时配合 JTAG 调试功能。你在电脑上会看到一个新的 COM 口(Windows)或者/dev/ttyACM0(Linux),通过这个口可以烧录、打印日志、碰巧也能用 OpenOCD 调试。

但注意:这个 USB Serial/JTAG 口在 C3 上是不能作为通用 USB 外设接口的。也就是说,你不能让 C3 模拟出键盘、鼠标、读卡器、U盘、串口设备以外的任何 USB 设备。芯片的数据手册里,它就只是“Serial/JTAG controller”,没有 OTG 相关的协议栈。

ESP32-S3 就不一样了。它有两个独立的 USB 相关控制器:一个 USB 1.1 Full-speed OTG,另一个同样带 USB Serial/JTAG。OTG 是什么?就是既能当 Slave(设备)也能当 Host(主机),比如读取 U 盘里的文件、接一个 USB 键盘、连一台 USB 摄像头,或者把自己模拟成一个 HID 设备,这些都是通过 OTG 实现的。USB Serial/JTAG 只负责烧录和调试,它和 OTG 不能混为一谈。

所以你会发现某些 S3 Mini 板上只有一个 USB 口,插上去只能看到串口。你别以为“这板子可以模拟 U 盘”,要确认它的 USB 口是接到了 USB Serial/JTAG,还是把 OTG 的 D+/D- 引到了 Type-C 母座。有些板子做了双 USB 口,一个专门用于下载调试,另一个用于 USB 外设。购买时看原理图、看商品详情“双 USB”、或者搜同型号网友反馈,这几分钟审查很有必要。

3.2 一个 USB-C 口能不能搞定下载调试?

能。S3 和 C3 都支持从 USB Serial/JTAG 直接下载,前提是电脑能正确识别设备。插上 Type-C 线,电脑如果没有识别出串口,先别怪驱动,很多情况下是线的问题。Type-C 线也分三六九等,有些只能充电、没有 D+/D- 或者接触不良,换一根短一点的、带数据传输功能的线再试。

如果设备识别了串口但下载失败,通常是板子没有进入下载模式。此时按住板子上的 BOOT/IO0 键,再按一下 RESET 键,或者重新插拔一次 USB 线,然后点击烧录。大多数 ESP-IDF 和 Arduino 的下载工具支持“自动复位”烧录,利用 RTS/DTR 信号控制 EN 和 IO0,但有些迷你板没有引出这些引脚,或者使用 USB Serial/JTAG 自动下载需要芯片侧的特殊支持,失败时手动进 boot 最稳。

还有一点,USB Serial/JTAG 口默认占用了 GPIO18(D-)和 GPIO19(D+)?我没记错的话,S3 的 USB Serial/JTAG 和 USB OTG 的连接引脚是独立的:OTG 使用 GPIO19/GPIO20,USB Serial/JTAG 使用 GPIO18 和 GPIO19?不对,S3 的 USB OTG 是 GPIO19 (D-) / GPIO20 (D+),Serial/JTAG 使用 GPIO18/GPIO19?需要准确。据官方文档:ESP32-S3 的 USB Serial/JTAG 引脚是 GPIO18(USB_D-)和 GPIO19(USB_D+)。内部 Flash/PSRAM 使用 SPI0/1,不影响。因此如果你看到引脚冲突,就不展开。简单写“某些外设引脚和 USB 存在复用关系,看原理图”。

3.3 做 USB 外设(HID/MSC/UAC)该注意什么

如果你选 S3 是为了做键盘鼠标、手柄、虚拟 U 盘或者 USB MIDI,除了确保板上有 OTG 口外,更重要的是软件栈选择。ESP32-S3 官方典型方案是 TinyUSB,它在 ESP-IDF 里作为组件集成;你可以在 menuconfig 里启用COM_ENABLE_ESP32_S3_USB_OTG之类的选项,再选择 TinyUSB 或直接使用tinyusb_deviceAPI。

我建议第一次玩 USB 外设时,先跑官方tinyusb_hid和msc例程,别一上来就钻协议细节。跑通一次后,你会发现 USB 枚举、描述符这些概念不再抽象。另外建议准备一个“USB 协议观察”手段:Linux 下可以用lsusb -v查看枚举信息,用 Wireshark 的 usbmon 抓包;Windows 下可以用 USBView 或者设备管理器配合查看描述符。这些工具不用全买,但至少会看lsusb -v和dmesg,能帮你定位很多“设备无法识别”的问题。

C3 的 USB Serial/JTAG 虽然不能做 USB 外设,但它有个隐藏优点:不需要外部 USB 转 TTL 芯片,做串口打印和下载非常省心。如果你需要给 C3 接外部 USB 转 TTL(比如某些模块没有板载 USB,或者你想用 UART0 和外设通信),注意共地,并且看模块是 3.3V 逻辑还是 TTL 电平,别直接怼 5V 上去。

4. 一张可核对的采购单

4.1 核心硬件参数核对表

废话少说,给一张可以直接对着看参数的采购单。所有“√”项都是下单前必须确认的。

核对项推荐/标准注意事项
芯片型号ESP32-S3 或 ESP32-C3S3 跑复杂应用;C3 跑轻量低功耗
模组丝印确认 Flash/PSRAM 容量后缀比如 S3FH4R2、S3FN8、C3FH4,看不懂就问客服
Flash 容量至少 4MB做 OTA/文件系统建议 8MB
PSRAM 容量S3 建议 8MB,最低 2MBC3 无 PSRAM,别被虚假宣传骗
USB 口需要 USB 外设必选带 OTG 引出的 S3 板只有 Serial/JTAG 口做不了键盘/U盘
复位/BOOT按键最好板载没有的话烧录麻烦
天线PCB 天线/ IPEX可选外壳屏蔽多时用 IPEX 外接
排针/母座2.54mm 排针或母座方便接面包板/杜邦线
电源板载 LDO,支持 5V 输入注意 WiFi 峰值电流,供电不足会重启
尺寸匹配外壳/固定孔位有些 Mini 板孔位不对,买前查图纸
资料官方原理图/示例/旧版 v1.1 修正没原理图的板子尽量避开

4.2 外设与扩展需求核对表

除了板子本身,你还要考虑它要接的外设。外设不能只看引脚数量,还得看电源。最典型的坑是:S3 Mini 引出 3.3V 和 5V 引脚,很多人直接挂一块 IPS 屏幕加一个传感器,一上电屏幕闪一下板子重启。原因就是 5V 输入虽然够,但板载 LDO 输出 3.3V 最大电流有限,或者供电路径上没有留够余量。

做带屏项目时,优先看板子的“对外供电能力”和“背光驱动”是否带独立电路。如果板载 3.3V 最大输出只有 500mA,你就别硬接所有外设;可以分一组 5V 转 3.3V 的降压模块给外设供电,减轻板载 LDO 负担。如果外设对时序要求高,比如需要 I2C、SPI 速度快,注意尽量使用默认引脚和四级映射关系,别为了布线方便把引脚改到不支持的外设。

外设侧需要核对的事项也不要落下:

外设需求建议
TFT/MIPI 屏选 S3 + 8MB PSRAM,预留 30+ 个 GPIO
摄像头选 S3 + 8MB PSRAM,确认摄像头 PCLK/HREF/VSYNC 引脚能被路由
U盘/USB读取选 S3 且板上有 OTG 口,软件用 TinyUSB Host
USB键盘/鼠标同上,Host 模式 + HID Class
传感器采集C3 足够,注意 ADC 引脚数量和型号
低功耗电池C3 更适合,留意 Deep Sleep 电流表现
Touch/扩展IO两者都有,但数量差异大

4.3 买完记得做验板清单

到手后别急着写大应用,先花十分钟做一套基本体检:

  1. 插上 USB,看电脑能否枚举出设备(Windows 设备管理器 / Linuxdmesg/lsusb)。
  2. 串口打开,确认芯片固件里打印的芯片型号、Flash 容量、PSRAM 容量和店家描述一致。
  3. 写一个 Blink 程序,点灯确认 GPIO 正常工作。不同板子的 LED 引脚不一样,看原理图。
  4. 短接 TX0/RX0 或对应 UART 引脚做回环测试,确认串口收发正常。
  5. 用ESP.getFreeHeap()和ESP.getFreePsram()或esp_get_free_heap_size()检查堆大小。如果买的是带 PSRAM 版本,但显示只有几百 KB 可用,说明固件没开 PSRAM。
  6. 跑一个简单的 WiFi 扫描,确认射频正常,天线焊接没问题。
  7. 最后测一下断电重启后能不能正常启动,防止买到了虚焊、电容漏电的板子。

这组清单看着基础,但能挡掉 80% 的“到手坏”和“货不对板”。我在十几个板子上踩过不少雷,最夸张的一次是买到丝印是 S3FH4R2 但实际 PSRAM 焊盘空着的板子,跑 LVGL 直接死机。所以,验板一定要“先小后大”。

5. 常见问题与排查实录

5.1 插上 USB 没反应 / 未知设备

“未知 USB 设备(设备描述符请求失败)”是我们嵌入式玩家最常看到的一行 Windows 提示。遇到这种情况,优先级最高的排查顺序是:

  • 换线:真的,八成是线的问题。很多 Type-C 线只走 CC 充电协议,数据线物理缺失,或者只有其中一组 D+/D-。找一根手机原装数据线试试。
  • 换 USB 口:有些主机 USB 口供电不足或信号质量差,比如前置面板的口,或者老的 USB 2.0 Hub。
  • 强制进入下载模式:按住 BOOT + 按 RESET,或者按住 BOOT 重新插 USB,再看设备管理器有没有变化。
  • 检查驱动冲突:Windows 有时给 USB Serial/JTAG 装了错误的驱动,设备管理器里出现黄色感叹号。可以在设备管理器卸载设备,卸载时勾选“删除驱动程序软件”,再重新插拔。
  • 检查 D+/D- 虚焊:如果换了所有办法都识别不了,优先怀疑板子焊接问题。用放大镜看 USB 口 D+/D- 是否连到芯片对应引脚,尤其是 Mini 板空间小,虚焊概率不低。

Linux 下也可以用dmesg看内核日志。常见dwc2/ch341/ftdi_sio之类的驱动提示,能帮你判断是不是驱动上错了。

5.2 Boot 模式进不去,烧录失败

ESP32 系列烧录需要对芯片 IO0(BOOT 引脚)拉低然后复位。USB Serial/JTAG 下载并不总是“一键全自动”,尤其是一些第三方 IDE 配置不对时,会提示“A fatal error occurred: Failed to connect to ESP32: Wrong boot mode detected...”。怎么处理?

  • 按住 BOOT 键,单击 RESET 键(或重新插拔电源),此时芯片进入下载模式。
  • 这时电脑上设备会重新枚举,你的烧录工具日志里会看到ESP32-S3已经识别到。
  • 点击烧录,烧到一半再松开 BOOT 也行。

如果还是没有响应,考虑焊接的 IO0 到按键之间的电阻、电容是否正常。某些 Mini 板为了自动下载加入了自动下载电路,通电瞬间会拉低 BOOT,但有些版本的电路有 bug,导致退出下载模式后 RESET 不正常,出现“每次都得手动短接 IO0 和 GND”。遇到这种情况,可以临时飞一根线在 IO0 到 GND 之间,插 USB 后等串口识别完再断开,也算曲线救国。

5.3 PSRAM 没生效,内存不够用

用 Arduino 跑一个带 LVGL 的程序,编译下载都正常,但一到初始化就崩,或者malloc返回 NULL,十有八九是 PSLAM 没开。

碰到这种情况,第一步是去看启动日志。ESP32-S3 的启动日志里如果有SPIRAM相关的 warn/error,说明初始化失败了。常见原因是配置了 Octal PSRAM 但板子实际是 Quad PSRAM(或相反)。menuconfig 里的CONFIG_ESP32S3_SPIRAM_MODE要选准,比如 OPI 表示 Octal,QPI 表示 Quad,选错就会报 cache 错误或者 init 失败。

第二步,检查自己的代码里是否用了ps_malloc()或heap_caps_malloc(&caps, MALLOC_CAP_SPIRAM)。别指望所有malloc都能用上 PSRAM,只有当 menuconfig 设置CONFIG_SPIRAM_USE_MALLOC时,默认 malloc 才会从 PSRAM 分配大块内存。但有些库内部使用 DMA 需要内部 SRAM,比如 SDIO、部分 LCD 接口,你用普通 malloc 分配的内存如果是 PSRAM,DMA 访问不到,程序同样会挂。解决方法是针对这些外设分配一个小的内部 SRAM 缓冲,再通过缓存操作搬运。

Arduino 环境下,还要确认你选择的 Board 是不是对应“OPI PSRAM / Quad PSRAM”的型号。我看过太多人用默认的“ESP32S3 Dev Module”跑,PSRAM 选项默认 Disabled,代码里ESP.getFreePsram()永远是 0。把 PSRAM 选项打开后,内存空间一下子多了 8MB,同样的 GUI 流畅度完全提升一个级别。

5.4 如何用外部 USB 转 TTL 曲线救国

有些 Mini 板拿到手,USB 口就是没有枚举,或者板载 USB Serial/JTAG 有问题,很多人卡在这一步就放弃了。其实可以借助外部 USB 转 TTL 模块烧录。

原理很简单:把 USB-TTL 模块的 TXD/RXD 接到芯片的 RXD0/TXD0(注意交叉),芯片 EN 引脚接一个 1k~10k 电阻到 3.3V 上,IO0 接 GND 进入下载模式,然后让模块给板子供电。我习惯用 5V 或 3.3V 模块,但要注意共地,且不能把 5V 直接灌到 3.3V 逻辑引脚上。

具体步骤:

  1. USB-TTL 模块的 3V3 或 VCC 接 Mini 板的 5V 或 3V3(看模块输出),GND 接 GND。
  2. TXD 接目标板 RXD0,RXD 接目标板 TXD0。
  3. 临时短接或按住 BOOT(IO0)到 GND,然后复位。
  4. 在烧录工具里选择“USB-TTL 口”对应的串口号,波特率默认 115200(ESP-IDF 下载波特率可调)。
  5. 松开 BOOT,重新烧录。

这个操作还有个额外好处:USB-TTL 模块一般能提供更稳定的电源,在一些“插电脑供电不足”的场景下反而更可靠。前提是确认 USB-TTL 模块的输出电流够,便宜的 CH340 模块输出能力有限,带 WiFi 发射时可能会掉电,建议外接一个 3.3V LDO 稳压供电。

6. 我个人的购买体会与建议

6.1 先用需求倒推型号,再看热度和社区支持

我一直坚持一个原则:不要因为“大家都在买 S3”就无脑跟风。我的第一块 ESP32 是 S3 Mini,因为当时要做一个小相机;后来做一个空气质量监测节点,S3 跑得又费电又没必要,换了 C3 之后 Deep Sleep 电流低很多,Node 模块连电池都省下一半。选型精准比选型高级重要。

C3 在社区里也有一个客观劣势:部分 Arduino 库对 RISC-V 支持不如 Xtensa。比如一些快速傅里叶变换、数学库、外设驱动,虽然官方都在推进,但更新的优先级往往落后于 S3。时间敏感的项目,还是优先考虑最成熟的平台。

6.2 别忘了算上“隐形成本”

买板子本身只是开始。如果你要玩 USB 外设,成本里要加入额外的 Type-C 线、USB 延长线、甚至 USB 分析工具;如果要玩带屏项目,成本里要加入一块屏幕、背光电路、触摸驱动;如果要长期低功耗运行,还要买稳压/充电模块和外壳。

我把“一张采购单”缩到最精简时,总是会列到这几项:主板、电源线、数据线、蜂鸣器或 LED 若干、杜邦线、面包板。很多时候这些零碎的投入比主板还贵。所以下单前把总预算想好,别只看板子十几块钱。

最后分享一个小技巧:凡是印着“S3”和“C3”都分不清的店铺,我一般是直接绕开的。真正的卖家会很清楚告诉你这颗芯片的 Flash、PSRAM、USB 口到底怎么走线。你问一句“PSRAM 是哪颗颗粒,型号拍一下”,对方要是答不上来或者敷衍,基本可以判断是贴牌转卖货。买开发板最怕的不是板子贵,而是没有售后和资料,所以尽量选能提供原始原理图和下载链接的渠道,哪怕多花三五块钱,后面省的时间和耐心都远不止这点差价。能把这些坑提前想起来,就比大多数人少走半年弯路。

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

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

立即咨询