先说一个我自己踩过的坑。有段时间想做一台插U盘播音频的小终端,在购物网站搜“ESP32-S3 Mini”,页面跳出来一堆:S3 Mini、C3 Mini、N8R2、N16R8……尺寸差不多,Type-C口也都在,我当时被标题里的“S3”两个字带着就下单了。收到板子才发现丝印是N8,没有PSRAM,代码一申请大块内存就崩。后来把几块板子摊开对比才明白:Mini只是版型代号,真正决定能不能跑摄像头的关键在于PSRAM,决定能不能接U盘、键盘的关键在于USB OTG。
这篇文章就是把这两条主线拆开讲清楚:PSRAM到底怎么选、USB口到底能干什么、下单前应该核对哪些项目。适合三类人看:从ESP8266或者STM32转过来的朋友、第一次买S3 Mini/C3 Mini的新手,以及准备给项目批量备板的人。不看的话,大概率会在“长得差不多”的外表下买错芯片。
1. 同是Mini,C3和S3的差距藏在硅片里
1.1 核心参数对比
很多朋友把S3 Mini和C3 Mini当成“同款大号小号”,其实这两颗芯片是乐鑫产品线里定位完全不同的两个东西。C3是低成本、低功耗的入门级RISC-V芯片,S3则是面向高性能AIoT场景的双核芯片。
| 参数 | ESP32-C3 | ESP32-S3 |
|---|---|---|
| 内核 | RISC-V 32位单核,最高160MHz | Xtensa LX7双核,最高240MHz |
| 内部SRAM | 约400KB | 约512KB |
| 外部PSRAM | 不支持 | 支持,常见2MB或8MB |
| USB能力 | 仅USB Serial/JTAG(下载、日志、调试) | USB Serial/JTAG + USB OTG(可做Host/Device) |
| 常见Flash配置 | 4MB为主 | 8MB/16MB为主 |
| 典型定位 | 低成本Wi-Fi/BLE节点 | 高性能AIoT、复杂外设、屏幕/摄像头 |
这两颗芯片在算力上有明显差距。S3的双核240MHz加上向量指令扩展,跑图片处理、语音识别、复杂UI时优势明显;C3更擅长轻量的传感器采集、协议转发、开关控制这类任务。
1.2 Flash、SRAM、PSRAM是三个东西
早期玩STM32的朋友习惯用“ROM + RAM”的二分法想问题,到了ESP32-S3这里必须改成三分法:Flash是硬盘,SRAM是板载内存条,PSRAM是额外插的一条大内存条。
- Flash存程序、字库、图片、文件系统,掉电不丢。
- SRAM跑变量、栈、堆,掉电就丢。
- PSRAM是外挂的RAM颗粒,通过SPI或Octal接口和主控通信,可以放大的数据缓冲区、图像帧、UI资源。
C3的问题不是Flash小,而是RAM太小。400KB SRAM要用在WiFi协议栈、蓝牙协议栈、系统任务和用户程序上,实际能留给你自由malloc的往往只有一两百KB。S3的512KB内部SRAM看起来也没大太多,但它能外挂PSRAM,直接把内存上限拉到2MB甚至8MB,这是质的区别。
1.3 先回答最直接的问题:你的项目需要哪一颗
判断标准不复杂:
- 跑温湿度传感器、继电器、灯控、MQTT、ESPHome、Tasmota、小型OLED屏——C3 Mini完全够用,便宜、功耗低、开发软件生态也成熟。
- 跑带触摸的LVGL界面、摄像头拍照或视频流、语音识别合成、大文件缓存、USB键鼠/优盘——必须S3 Mini。
- 预算不紧张、项目后续还要加功能——直接S3 Mini带PSRAM,比以后换平台重画板省心得多。
C3适合做“节点”,S3适合做“终端”。买之前先想清楚你的项目是哪种。
2. PSRAM:S3 Minim值钱的地方,也是最容易买错的地方
2.1 PSRAM是内存条,Flash是硬盘
ESP32-S3芯片本身支持外接PSRAM,开发板厂商会把一颗PSRAM颗粒和主控放在同一块板上,用的时候它就像“主板上的内存条”。PSRAM的作用很纯粹:让你的程序有更多RAM可用。
举个具体案例:一块320×240的彩色屏幕,RGB565格式一帧画面是320×240×2字节,约150KB。如果要做双缓冲,就是300KB。这还没算字库、图标、UI资源、WiFi缓冲区。C3那点RAM不用算就知道放不下,S3不开PSRAM也只有512KB,勉强跑个静态界面。开了8MB PSRAM之后,UI随便放,图片缓存随便开,程序从“小心翼翼省内存”变成“随便造”。
PSRAM还有一个好处是支持内存映射,CPU可以直接读写,不像外挂Flash那样要先读进SRAM再处理。
2.2 一眼看懂丝印:FN8R2、N16R8这些后缀什么意思
买S3 Mini最核心的一句话:看丝印,看后缀。
以常见的“ESP32-S3FN8R2”为例:
- FN8表示芯片内部封装了8MB Flash。
- R2表示封装了2MB PSRAM。
- 如果丝印是“ESP32-S3FN8”,没有R后缀,就是8MB Flash、无PSRAM。
- “N16R8”则表示16MB Flash加8MB PSRAM。
所以你在商品页看到“S3 Mini N8R2”,意思就是8MB Flash + 2MB PSRAM;“N16R8”就是16MB Flash + 8MB PSRAM。这是目前市面上最常见的两种高配组合。
C3的丝印规律就简单多了:常见的是“ESP32-C3FN4”,意思是4MB Flash,没有PSRAM后缀可选。因为C3芯片本身不支持外部PSRAM,所以永远不会买到“带PSRAM的C3”。如果看到某个商家号称C3能扩展大内存,多半是外接SPI SRAM的野路子方案,不值得用在严肃项目里。
2.3 R2和R8怎么选
我自己的选型经验是这么分档:
| 项目类型 | 建议配置 |
|---|---|
| 无屏或128×64小OLED、传感器、MQTT | N8即可,连PSRAM都不用 |
| 320×240 TFT屏幕、LVGL简单界面 | N8R2起步 |
| 大屏动画、复杂UI、较多图片素材 | N16R8 |
| OV2640/OV5640摄像头、拍照或视频流 | 基本锁定N16R8 |
| 音频播放、TTS缓存、大文件HTTP下载 | N16R8 |
R2和R8的板子在硬件上主要差一颗PSRAM颗粒,价格差通常不大,可能也就十几块甚至几块钱。如果你要做的是带屏幕或者带摄像头的项目,我建议直接上R8,把这个差价当作“内存焦虑保险费”,省得做一半发现malloc失败。
2.4 最容易被忽略的:固件没开PSRAM等于白买
买了带PSRAM的板子,不代表PSRAM默认就在跑。Arduino环境下需要在Tools菜单里找到PSRAM选项并打开,不同开发板库的选项名字不一样,常见的有“PSRAM: Enabled”“OPI PSRAM”等。ESP-IDF环境下要在menuconfig里启用CONFIG_SPIRAM,并根据板子的颗粒类型选择Quad或Octal模式。
判断PSRAM有没有被启用,最直接的办法是打印一行:
Serial.printf("PSRAM: %u KB\n", ESP.getPsramSize() / 1024);如果返回0,说明没启用或者板子根本没有PSRAM。很多人买了N8R2的板子跑LVGL还是崩,查到最后就是PSRAM没开。
3. USB能力不对等:C3只是排障口,S3才能玩OTG
3.1 原生USB和CH340的老方案不是一回事
老玩家用ESP8266或者经典ESP32时,板子上必定有一颗CH340G或CP2102,作用是把USB转成串口。C3和S3不一样,芯片内部内置了USB Serial/JTAG控制器,Type-C口可以直接连到芯片的USB引脚,不需要外置转接芯片。
这个设计带来的变化是:板子更便宜、更简洁,插上电脑就能出COM口,还能顺带做JTAG调试。但也带来一个认知门槛:很多人以为C3和S3的Type-C口功能一样,实际上两颗芯片的USB能力差了很多。
3.2 C3的USB能做什么
C3的USB口只能枚举成“USB JTAG/serial debug unit”,干三件事:
- 下载固件。
- 输出串口日志。
- 通过JTAG调试。
它没有可编程的通用USB外设,不能做USB Host,不能枚举成键盘鼠标,也不能读优盘。
所以如果你看到有人折腾C3接USB键盘或者做USB设备,基本可以断定方向错了,硬件上就不支持。C3 Mini定位就是Wi-Fi/BLE节点,USB口只是维护口而已。
3.3 S3的USB OTG能玩出哪些花样
S3的USB外设是真正的OTG,具备Host和Device两种角色能力。常见的玩法有这么几类:
- USB Host读U盘:接一个USB优盘,枚举后用FATFS读写文件,适合做离线资料读取、固件升级、日志导出。
- USB Host接键盘鼠标:把键盘输入转成串口数据发给其他设备,或者做一个键盘控制的交互盒子。
- USB Device模拟HID设备:让电脑把ESP32-S3识别成键盘或鼠标,配合宏定义做自动化输入。
- USB Device模拟MSC设备:把Flash或SD卡暴露成U盘。
- USB Device模拟CDC虚拟串口:做一个免驱的USB转串口工具。
- DFU固件升级:把设备枚举成DFU模式,配合量产脚本做固件更新。
乐鑫官方IDF仓库里examples/peripherals/usb目录下有host和device两个分支的示例,HID、MSC、CDC都有现成代码可以参考。如果做USB Host接U盘实验,一定注意供电:U盘瞬间启动电流可能会到几百毫安,最好给开发板提供足额的5V电源,否则容易掉盘。
3.4 日志与OTG二选一的引脚复用
S3的USB OTG和USB Serial/JTAG共用同一组物理引脚(GPIO19/20)。一旦你的代码把USB口配置成了OTG模式,它就不能再作为串口打印日志了。此时串口日志需要切换到UART0,外接USB转TTL才能看到。
很多人第一次跑USB Host代码,发现插上电脑后设备管理器里的“USB JTAG/serial debug unit”消失了,以为板子坏了,其实只是引脚被OTG占用了。另外,如果板子正在运行USB OTG的固件,再次下载时可能无法自动进入下载模式,需要按住BOOT键再插USB或者复位一次,让芯片进入下载状态,然后重新刷机。
3.5 从STM32转过来的人请记住一个数字:12Mbps
以前用STM32做USB设备,要处理外部晶振、上拉电阻、USB枚举中断这些琐碎事。ESP32-S3把这些全部打包了,TinyUSB组件帮你处理描述符和回调,开发体验比STM32直接不少。
但有一个数字必须清楚:S3的USB是Full Speed,最高12Mbps,不是High Speed的480Mbps。做键鼠、优盘、虚拟串口、DFU升级都没问题,但别想着拿它跑USB摄像头视频流。真要跑视频流,还是得走摄像头专用接口。
调试USB设备时,如果遇到枚举失败、设备描述符请求失败这类问题,抓包工具是排查利器。S3支持可编程USB端点之后,软件抓包能看到描述符请求、配置选择、端点通信的完整过程,这是C3做不到的,因为C3没有可编程端点可抓。
4. 采购单:下单前看着这张表核对
4.1 十个核对项一张表
去购物网站看板子的时候,不要只看标题。下面是十项逐条核对清单,直接照着查。
| 核对项 | 要看什么 | 建议 |
|---|---|---|
| 芯片完整型号/丝印 | 是N8还是N8R2,有没有R后缀 | 买S3务必确认带R2或R8 |
| Flash容量 | 4MB、8MB还是16MB | 新项目建议8MB起步,玩LVGL/摄像头选16MB |
| PSRAM容量 | 2MB还是8MB | 摄像头/复杂UI直接R8 |
| USB口线序 | D+/D-是否接到了Type-C口 | 看原理图确认,有的板子USB引脚引到排针 |
| 板载USB-UART芯片 | 有CH340/CH343还是纯原生USB | 需要UART0日志时,板载转接芯片很省事 |
| BOOT/RESET按键 | 有没有、好不好按 | Mini板最好两个都有,下载失败时可以强进下载模式 |
| 天线形式 | PCB天线还是IPEX座 | 金属外壳或需要外置天线场景选IPEX |
| 排针焊装 | 是否预焊排针、间距是否合面包板 | 新手选预焊版本,避免自己焊偏 |
| 供电设计 | 5V输入、板上LDO、VBUS电流 | 做USB Host时供电要求更高 |
| 出厂固件 | 预置MicroPython、ESPHome还是空片 | 预置固件要和你的开发环境匹配,不匹配先擦除 |
芯片完整型号永远是第一位。商品标题写“ESP32-S3 Mini”是不够的,必须看到“N8R2”或者“N16R8”这类带存储信息的后缀,或者商品图里清晰拍了丝印。如果页面只说“ESP32-S3”,没有给到具体型号,问客服拿原理图再决定。
USB口的线序是第二容易踩的坑。有些板子虽然做了Type-C口,但USB数据引脚并没有直连芯片D+/D-,可能只是接到了一片USB转串口芯片,或者压根只供电。这类板子的OTG能力就是零。看完原理图再下单,比你买回来飞线省心得多。
4.2 常见事故现场
我在各个群里看到过不少真实案例,整理五个典型:
事故一:看着“S3 Mini”标题下单,到手是N8无PSRAM版本。跑LVGL开不了界面,一开就重启。对策是下单前看丝印,而不是看标题。
事故二:买了C3 Mini想模拟USB键盘鼠标,折腾一周无果。C3没有可编程USB外设,想玩USB HID只能换S3。
事故三:S3跑USB Host代码后,插电脑没有串口了,以为板子烧了。下发下载模式下按住BOOT复位即可重新烧录。
事故四:买了带CH340的S3板子,以为下载走原生USB口,实际走的是UART0转接芯片。这倒不算故障,但你要清楚两个USB口的分工。
事故五:不同厂商都叫“Mini”,引脚定义却不兼容。Mini不是一个标准,只是营销叫法。看原理图和引脚图,别只看尺寸。
4.3 五步采购流程
我现在的采购流程固定是五步:
- 写下项目里的内存大件:屏幕、摄像头、音频队列、USB缓冲。
- 决定内核:复杂外设选S3,纯物联网节点选C3。
- 决定存储组合:C3选N4或N8,S3选N8R2或N16R8。
- 核对板子原理图,确认USB口直连、电源输入、按键配置。
- 下单前再回看一遍丝印,并且多买一到两块备用板。
这一步下来踩坑的概率能降一半以上。
5. 开箱先验证:十分钟确认你没买错
5.1 用esptool确认芯片和Flash
板子到手不要急着写业务代码,先验证硬件。把Type-C线插上电脑,Windows设备管理器里会出现COM口,Linux下用ls /dev/ttyACM或者ls /dev/ttyUSB找设备。
安装esptool:
pip install esptool然后执行:
esptool.py --port COMx flash_id注意把COMx换成你实际的串口号。输出会包含芯片型号、Flash大小,例如“Detected chip type: ESP32-S3”“Detected flash size: 16MB”。这比用Arduino API读Flash更可靠,因为esptool读的是Flash芯片ID,不是软件里配置的默认值。
如果这个命令报错连接失败,多半是板子没有进入下载模式。多数Mini板需要按住BOOT键再插USB,进入下载状态后松手,再执行命令。
5.2 用Arduino实测PSRAM
Flash验证过了,PSRAM也要实测。在Arduino里选对应的开发板,确认PSRAM选项已启用,然后跑这段代码:
#include <Arduino.h> void setup() { Serial.begin(115200); delay(800); Serial.printf("Flash: %u KB\n", ESP.getFlashChipSize() / 1024); Serial.printf("PSRAM: %u KB\n", ESP.getPsramSize() / 1024); size_t chunk = 2 * 1024 * 1024; // 2MB测试块,8MB板子可以加大到4MB uint8_t *buf = (uint8_t*)heap_caps_malloc(chunk, MALLOC_CAP_SPIRAM); if (buf) { for (size_t i = 0; i < chunk; i += 4096) { buf[i] = 0x5A; } Serial.println("PSRAM write test OK"); heap_caps_free(buf); } else { Serial.println("PSRAM alloc failed, 没有可用的PSRAM"); } } void loop() {}如果串口打印的PSRAM大小为0,或者“PSRAM alloc failed”,先检查PSRAM开关,再确认板子丝印是否真的有R后缀。我遇到过不少朋友在这步发现买错了,趁还在七天无理由期内还能退。
5.3 验证USB枚举和下载流程
最后验证USB链路。刚插上板子时,Windows设备管理器里应该能看到“USB JTAG/serial debug unit”或类似名称,Linux下lsusb会看到Espressif的USB设备。
按住BOOT再按一下RESET,观察设备管理器的设备有没有重新枚举。正常情况下,串口会短暂消失再重新出现,这说明芯片的USB Serial/JTAG工作正常,下载接口没问题。
如果想进一步验证S3的OTG能力,可以参考IDF的USB Host示例,用一个外部供电的USB Hub接U盘或者键盘,看日志里有没有枚举成功。第一次跑OTG实验时记得做好外部供电,避免板子5V轨道带不动外设。
我个人现在买板子的习惯是这样:先把项目里最可能出现的内存大件列出来,如果答案可能超过512KB,直接S3 Mini N16R8,差价就当买保险;如果只是传感器、开关、MQTT这类,C3 Mini轻松愉快。到货后先花十分钟跑一遍上面的验证流程,确认丝印、Flash、PSRAM真实存在,再开始写业务逻辑。这个习惯帮我挡掉了不少换平台的折腾,你也可以试试。