十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

ESP32选型实战:S3与C3性能对比及避坑指南

ESP32选型实战:S3与C3性能对比及避坑指南 ESP32 这个系列发展到现在型号已经多到让人眼花缭乱。我最早用的是 ESP32-WROOM-32后来陆续上手了 S3、C3、C6每次新项目选型的时候都得重新翻一遍数据手册和勘误表。说实话官方文档给的是参数但真正决定选哪颗的往往是那些文档里不会写的细节——比如某个型号的 GPIO 在特定模式下会拉低、某颗芯片的 USB 外设在特定条件下枚举失败、某款模组的射频性能和标称值差距有多大。这篇内容就是把我这几年在 ESP-IDE 环境下实测各型号的经验整理出来从 S3 到 C3把选型逻辑、性能差异、踩过的坑一次讲清楚。1. 先搞清楚 ESP32 家族到底分几条产品线很多人一上来就问“S3 和 C3 哪个好”这个问题本身就不成立因为它们压根不是同一个定位的东西。ESP32 家族目前大致可以分成三条线经典 ESP32包括 ESP32-D0WD、ESP32-S2、ESP32-S3、成本优化线ESP32-C 系列包括 C2、C3、C6以及即将铺开的 P 系列带 AI 加速的。选型的第一步不是比参数而是先确定你的项目属于哪一类需求。1.1 经典 ESP32 和 S 系列的定位差异经典 ESP32 是双核 Xtensa LX6240MHz带经典蓝牙和 BLEWi-Fi 支持 2.4G b/g/n。它的优势是生态最成熟Arduino 库、ESP-IDF 示例、各种第三方组件几乎都优先适配它。但它的短板也很明显USB 外设缺失S2 开始才有、GPIO 数量有限、射频性能在复杂环境下不如新制程芯片稳定。ESP32-S2 是一个比较尴尬的存在单核 LX7没有蓝牙USB OTG 是它的亮点但因为没有蓝牙加上生态适配慢实际项目里用得不多。真正接棒经典 ESP32 的是 ESP32-S3双核 LX7240MHz带向量指令用于 AI 加速USB OTG蓝牙 5.0 LEGPIO 数量大幅增加而且射频前端做了优化。我实测下来S3 在 Wi-Fi 吞吐和接收灵敏度上都比经典 ESP32 好一截尤其是在路由器距离较远或者 2.4G 频段拥挤的场景下差距能到 3-5dBm 的等效差异。1.2 C 系列为什么便宜砍掉了什么ESP32-C3 是单核 RISC-V160MHzWi-Fi 只支持 2.4G b/g/n蓝牙 5.0 LE没有经典蓝牙。它的核心逻辑是“够用就好”——GPIO 数量少最多 22 个可用没有 USB OTG只有 USB Serial/JTAG没有向量指令内存也小400KB SRAM。但它的价格比 S3 便宜不少而且 RISC-V 架构在功耗控制上有优势。ESP32-C2 更极端只支持 Wi-Fi 4 和 BLE 5.0连 USB Serial/JTAG 都砍了SRAM 只有 272KB定位是极低成本的 Wi-Fi 联网节点。ESP32-C6 则是 C 系列里的“升杯”版本带 Wi-Fi 6802.11ax、Thread、ZigbeeRISC-V 单核 160MHz但价格也上去了。我一般给客户的建议是如果你要做的是简单的传感器节点、开关控制、数据上报C3 完全够用没必要上 S3。但如果你要做语音唤醒、图像处理、USB 设备、或者需要大量 GPIO 做矩阵键盘、LCD 并口驱动那 S3 是唯一选择。1.3 一张表看清各型号的核心参数差异型号核心主频SRAMWi-Fi蓝牙USBGPIO 数量典型价格区间ESP32-D0WD双核 LX6240MHz520KB2.4G b/g/nBTBLE无34低ESP32-S2单核 LX7240MHz320KB2.4G b/g/n无OTG43中低ESP32-S3双核 LX7240MHz512KB2.4G b/g/nBLE 5.0OTG45中ESP32-C2单核 RISC-V120MHz272KB2.4G b/g/nBLE 5.0无14极低ESP32-C3单核 RISC-V160MHz400KB2.4G b/g/nBLE 5.0Serial/JTAG22低ESP32-C6单核 RISC-V160MHz512KBWi-Fi 6BLE 5.0Serial/JTAG30中这张表里的 GPIO 数量是“可用”数量不是芯片引脚数。实际项目中如果你要用 SPI、I2C、UART能剩下的 GPIO 会更少。C3 的 22 个 GPIO 里有几个是 strapping 引脚上电时有特殊功能不能随便用。S3 的 45 个 GPIO 里也有类似情况但余量更大。2. ESP-IDE 环境搭建别在第一步就卡住选型定了之后下一步就是搭环境。ESP-IDE 是乐鑫官方基于 Eclipse 的集成开发环境但说实话我身边大部分资深开发者最后都回到了命令行 VS Code 的组合。不过 ESP-IDE 对于新手来说确实省事尤其是它自带的串口监视器、烧录配置、调试器集成能少踩很多坑。这里我把两种方式的搭建过程都过一遍重点讲那些容易出问题的地方。2.1 ESP-IDE 安装时最容易忽略的依赖问题ESP-IDE 的安装包在 Windows 上大概 1GB 左右安装过程本身不复杂但有几个点必须注意。第一安装路径绝对不能有中文和空格这是 Eclipse 系工具的通病路径里有中文会导致编译时找不到文件。第二安装程序会问你要不要安装 Python 和 Git如果你机器上已经有 Python 3.8 以上版本建议不要让它再装一个否则环境变量会冲突。第三安装完成后第一次启动会提示你选择 ESP-IDF 版本这里建议选最新的稳定版不要选 master 分支master 分支的 API 变动太频繁今天能编译的代码明天可能就报错。我遇到过最典型的问题是安装完 ESP-IDE 后编译一个最简单的 hello_world 都报错提示找不到idf.py。原因是安装程序没有把 ESP-IDF 的路径加到系统环境变量里。解决办法是手动在系统环境变量里添加IDF_PATH指向你的 ESP-IDF 安装目录然后在 Path 里添加%IDF_PATH%\tools。这个坑我在三台不同的电脑上都遇到过不是个例。2.2 命令行方式搭建 ESP-IDF 的完整流程如果你决定用命令行 VS Code流程是这样的先从乐鑫的 GitHub 仓库克隆 ESP-IDF注意要递归克隆子模块否则编译时会缺组件。命令是git clone --recursive https://github.com/espressif/esp-idf.git然后进入目录执行install.batWindows或install.shLinux/Mac。这个脚本会自动下载 Xtensa 和 RISC-V 的工具链下载量大概 2-3GB网络不好的话可能要等很久。安装完成后每次打开终端都要先执行export.bat或source export.sh来激活环境。我建议把这个命令写进 shell 的启动脚本里省得每次手动敲。VS Code 里装 Espressif IDF 插件后插件会自动识别 IDF 路径但有时候会识别错需要在设置里手动指定idf.espIdfPath和idf.toolsPath。注意ESP-IDF 的版本和芯片型号有对应关系。比如 ESP32-C6 需要 ESP-IDF v5.1 以上才支持C2 需要 v4.4 以上。如果你用的是老版本 IDF编译时会提示找不到目标芯片。选型确定后先去官网查一下最低 IDF 版本要求。2.3 不同型号在 ESP-IDE 里的目标配置差异在 ESP-IDE 里切换芯片型号是通过idf.py set-target命令实现的。比如idf.py set-target esp32s3会把当前项目的目标设为 S3idf.py set-target esp32c3则切到 C3。这个命令会重新生成 sdkconfig 文件你之前的一些配置可能会被重置所以切换目标后要重新检查 menuconfig 里的设置。有一个细节很多人不知道S3 和 C3 的默认串口波特率不一样。S3 的 USB Serial/JTAG 默认是 115200但如果你用的是外部 USB-UART 芯片波特率可以拉到 921600 甚至更高。C3 的 USB Serial/JTAG 在 ESP-IDF 里默认也是 115200但它的 ROM 引导模式对波特率更敏感太高了容易握手失败。我在 C3 上试过 460800烧录成功率大概只有 70%降到 230400 就稳定了。3. 实测性能差异S3 和 C3 到底差多少参数表上的差异是纸面的实际跑起来差多少才是选型的关键。我拿 S3 和 C3 做了几组对比测试包括 Wi-Fi 吞吐、BLE 连接稳定性、GPIO 翻转速度、功耗表现以及在不同 IDF 版本下的编译速度。测试环境是同一个路由器、同一个电源、同一套测试代码尽量排除外部变量。3.1 Wi-Fi 吞吐量实测S3 的优势在什么场景下才明显用 iperf 测试 TCP 吞吐S3 在 2.4G 频段、20MHz 带宽下稳定在 25-30Mbps 左右C3 大概在 18-22Mbps。差距看起来不大但如果你跑 UDP 或者多连接并发S3 的双核优势就出来了——一个核处理网络协议栈另一个核跑应用逻辑互不干扰。C3 是单核网络流量大的时候应用逻辑会明显卡顿。我做过一个测试C3 在跑 MQTT 上报数据的同时主循环里做 GPIO 翻转翻转频率从 10kHz 降到 3kHz 左右。同样的代码在 S3 上翻转频率基本不变。所以如果你的项目里 Wi-Fi 通信和实时控制是并行的S3 是更稳妥的选择。接收灵敏度方面我用同一块开发板、同一根天线在路由器距离 15 米、隔一堵墙的场景下测 RSSI。S3 的 RSSI 稳定在 -67dBm 左右C3 在 -72dBm 左右。5dBm 的差距意味着 C3 在边缘覆盖场景下更容易掉线。如果你做的是穿墙能力要求高的产品比如智能门锁、室外传感器S3 的射频前端更可靠。3.2 BLE 连接数和稳定性对比S3 支持 BLE 5.0理论连接数更多实际测试中同时连接 7 个 BLE 从设备数据上报稳定没有丢包。C3 也是 BLE 5.0但同时连接 4 个以上就开始出现连接间隔抖动第 5 个连接经常超时失败。如果你做的是 BLE 网关或者多设备采集C3 的连接数上限是个硬伤。还有一个细节S3 的 BLE 和 Wi-Fi 共存做得比 C3 好。C3 在 Wi-Fi 大量收发数据的时候BLE 的连接间隔会明显拉长有时候从 30ms 拉到 100ms 以上。S3 在同样场景下BLE 间隔波动在 10ms 以内。这个差异在需要低延迟 BLE 控制的应用里很关键比如 BLE 遥控器、游戏手柄。3.3 GPIO 翻转速度和中断响应延迟用示波器测 GPIO 翻转S3 在 240MHz 下用寄存器直接操作翻转频率可以到 40MHz 以上方波C3 在 160MHz 下大概 20MHz 左右。中断响应延迟方面S3 从 GPIO 触发到中断服务函数第一条指令大概 200ns 左右C3 大概 350ns。这个差异在高速脉冲计数、编码器读取等场景下会体现出来。但要注意S3 的 GPIO 翻转速度受限于 IO MUX 的配置。如果你用gpio_set_level这种高层 API速度会慢很多因为里面有函数调用开销。要跑高速翻转必须直接写寄存器比如GPIO.out_w1ts (1 pin)和GPIO.out_w1tc (1 pin)。这个技巧在 C3 上也适用但 C3 的寄存器地址和 S3 不一样不能直接照搬代码。3.4 功耗表现C3 的 RISC-V 架构确实省电用同一块开发板关闭 Wi-Fi 和蓝牙只跑一个空循环S3 的电流大概 25mAC3 大概 18mA。在 light sleep 模式下S3 是 240uAC3 是 130uA。deep sleep 模式下差距缩小S3 是 10uAC3 是 8uA。如果你做的是电池供电的传感器节点C3 的功耗优势在活跃状态下更明显。但 C3 有一个问题它的 Wi-Fi 唤醒速度比 S3 慢。从 deep sleep 唤醒到 Wi-Fi 连接成功C3 大概需要 1.8 秒S3 大概 1.2 秒。如果你的应用需要频繁唤醒上报数据C3 的唤醒延迟会吃掉一部分省下来的电。我一般建议如果上报间隔大于 5 分钟C3 的功耗优势才能体现出来如果上报间隔很短S3 反而更合适。4. 选型决策树什么项目该选什么芯片参数和实测都摆出来了但真正做决定的时候还是要回到项目需求本身。我总结了一个简单的决策逻辑按优先级排序先看有没有 USB 需求再看 GPIO 数量够不够然后看 Wi-Fi 和 BLE 的并发要求最后看成本敏感度。4.1 必须选 S3 的四种情况第一种需要 USB OTG 或者 USB 设备功能。比如你要做一个 USB 摄像头、USB 声卡、或者 HID 设备只有 S3 和 S2 支持。S2 没有蓝牙所以如果同时需要 USB 和蓝牙S3 是唯一选择。第二种GPIO 需求超过 25 个。C3 最多 22 个可用 GPIO扣掉 strapping 引脚和默认的 UART、USB 引脚实际能自由使用的不到 18 个。如果你要驱动 LCD 并口、矩阵键盘、多个 SPI 设备S3 的 45 个 GPIO 才够用。第三种需要 AI 加速或者向量运算。S3 的向量指令集在跑 TinyML 模型、FFT、滤波算法的时候比 C3 快 3-5 倍。如果你做语音唤醒、振动分析、图像预处理S3 是必须的。第四种Wi-Fi 和 BLE 需要同时高负载运行。比如 BLE 网关 Wi-Fi 上云S3 的双核架构能保证两个协议栈互不干扰C3 单核跑这种场景会力不从心。4.2 C3 能胜任的典型场景C3 最适合的是“单一任务 联网”的场景。比如温湿度传感器上报、智能开关、灯控模块、简单的 BLE 信标。这些场景里芯片大部分时间在休眠醒来后连 Wi-Fi 发一包数据就睡C3 的 RISC-V 架构和低功耗特性正好匹配。我做过一个智能农业的项目用 C3 做土壤湿度采集每 10 分钟上报一次两节 AA 电池撑了 8 个月。同样的代码换成 S3只能撑 5 个月左右。所以如果你的项目对成本敏感、对续航要求高、功能单一C3 是更理性的选择。但要注意C3 的 ADC 精度比 S3 差。C3 的 ADC 在满量程附近的线性度不太好如果你要测电池电压或者精密传感器建议用外部 ADC或者选 S3。我实测 C3 的 ADC 在 3.0V 以上读数偏差能到 5%S3 大概 2% 左右。4.3 C2 和 C6 的适用边界C2 我只在极低成本的项目里用过比如一次性消费类电子产品功能就是连 Wi-Fi 上报一个状态。它的 SRAM 只有 272KB跑 TLS 握手的时候内存会很紧张有时候需要把 mbedTLS 的缓冲区调小才能连上。如果你要用 HTTPSC2 会比较吃力。C6 我目前用得还不多它的 Wi-Fi 6 和 Thread 支持是亮点适合做 Matter 设备或者需要低延迟 Wi-Fi 的场景。但它的价格比 C3 高不少而且 ESP-IDF 对 C6 的支持还在完善中有些 API 还不稳定。如果你不是必须用 Wi-Fi 6 或者 ThreadC3 的性价比更高。5. 那些数据手册不会告诉你的坑选型的时候数据手册给的是理想参数但实际项目里会遇到各种“意外”。这一节我整理了几个我在 S3 和 C3 上踩过的坑有些是芯片本身的限制有些是 ESP-IDF 的 bug有些是开发板设计的问题。5.1 S3 的 USB 枚举失败问题S3 的 USB OTG 在作为设备的时候有时候会枚举失败尤其是用 Windows 主机的时候。表现是设备管理器里能看到 USB 设备但一直提示“设备描述符请求失败”。这个问题我在三块不同的 S3 开发板上都遇到过后来发现是 USB 的 DP/DM 上拉电阻和主机兼容性的问题。解决办法有两个一是在软件里加一个 USB 重新枚举的延时在tinyusb初始化之前延时 100ms 左右二是在硬件上把 DP 的上拉电阻从 1.5k 改成 2.2k兼容性会好很多。这个坑在官方论坛上也有很多人反馈但数据手册里不会写。5.2 C3 的 strapping 引脚配置陷阱C3 的 GPIO 2、8、9 是 strapping 引脚上电时的电平决定了启动模式。GPIO 9 是 boot 模式选择如果上电时被外部电路拉低芯片会进入下载模式而不是正常运行。我遇到过一个问题C3 接了一个 I2C 传感器传感器的 SDA 接在 GPIO 8 上上电时传感器把 GPIO 8 拉低了导致芯片启动异常。解决办法是在 GPIO 8 上接一个上拉电阻确保上电时是高电平。或者换一个 GPIO 接传感器。这个坑在 C3 的设计指南里有提到但很多人画板子的时候不会仔细看。5.3 ESP-IDF 版本升级导致的 API 断裂ESP-IDF 从 v4.x 升级到 v5.x 的时候很多 API 变了。比如gpio_pad_select_gpio被废弃了改用gpio_reset_pin。timer_group的 API 也变了老代码直接编译不过。我建议在项目开始的时候就锁定 IDF 版本不要随便升级。如果必须升级先在一个分支上跑通所有功能再合并。还有一个坑不同 IDF 版本对 C3 的 Wi-Fi 驱动优化不一样。v4.4 的 C3 Wi-Fi 吞吐比 v5.0 低大概 15%因为 v5.0 优化了 DMA 描述符的处理。所以如果你用 C3 做 Wi-Fi 吞吐敏感的应用建议用 v5.0 以上版本。5.4 开发板天线设计对性能的影响同一个芯片不同开发板的射频性能可以差很多。我手上有三块 C3 开发板一块是 PCB 天线一块是陶瓷天线一块是外接天线座。在同样的测试环境下PCB 天线的 RSSI 比陶瓷天线好 3dBm 左右外接天线又比 PCB 天线好 2dBm。所以如果你做产品天线设计比芯片选型更重要。S3 的开发板也有类似情况。有些开发板为了省空间把天线放在板子边缘但旁边有金属螺丝孔或者电池会严重干扰天线。我建议在选型阶段就拿到开发板实测不要只看芯片参数。6. 从选型到量产的几个关键检查点选型不是选完芯片就结束了从开发板到量产中间还有很多事情要确认。这一节我列几个我在项目里必做的检查项帮你避免量产时才发现问题。6.1 确认芯片的勘误表乐鑫每个芯片都有勘误表Errata里面列了已知的硬件 bug 和规避方法。比如 ESP32-C3 的某个版本在特定条件下 I2C 会锁死需要在软件里加超时重置。S3 的 USB 在某个版本有 DMA 对齐问题需要确保缓冲区地址 4 字节对齐。这些信息在数据手册里没有必须看勘误表。我一般会在项目启动时就去官网下载对应芯片的勘误表把和项目相关的条目列出来逐条确认规避方案。这个工作看起来麻烦但能避免量产后的批量返工。6.2 内存预算要留足余量S3 的 512KB SRAM 看起来很多但 Wi-Fi 协议栈、蓝牙协议栈、TLS、MQTT 这些组件加起来能吃掉 200KB 以上。如果你再用 LVGL 做 UI内存会很紧张。我一般建议在开发阶段就用heap_caps_get_free_size监控内存确保峰值使用不超过总内存的 70%。C3 的 400KB SRAM 更紧张跑 HTTPS MQTT 的时候剩余内存经常只有 100KB 左右。如果你要在 C3 上跑文件系统或者 OTA需要仔细规划内存布局把不常用的缓冲区放到外部 Flash 的 PSRAM 里如果开发板有的话。6.3 烧录和量产测试方案S3 和 C3 都支持 UART 烧录和 USB 烧录。UART 烧录需要控制 EN 和 BOOT 引脚量产时可以用自动烧录机。USB 烧录更方便但需要主机支持 USB 设备枚举有些工厂的电脑 USB 口供电不足会导致烧录失败。我建议在量产测试架上同时保留 UART 和 USB 两种烧录方式UART 作为主力USB 作为备用。另外烧录完成后一定要做射频校准测试检查 Wi-Fi 和 BLE 的发射功率和接收灵敏度是否在规格范围内。这个测试需要专用的仪器但可以抽样做不用全检。6.4 温度范围和长期供货S3 和 C3 都有工业级版本温度范围 -40 到 85 度。如果你做的是室外设备或者工业场景一定要选工业级型号。商业级是 0 到 70 度夏天户外暴晒很容易超温。供货方面乐鑫的芯片一般供货周期比较稳定但模组厂商的供货会有波动。我建议在选型时就确认模组的长期供货计划避免量产半年后模组停产。如果项目周期长可以考虑直接买芯片自己贴片但射频校准会比较麻烦。7. 我个人的选型习惯和最后几条建议做了这么多项目我现在选型的流程基本固定下来了先列需求清单把 USB、GPIO 数量、Wi-Fi/BLE 并发、功耗、成本这几个维度打分然后对照上面的决策树初选再拿开发板实测关键指标最后确认勘误表和供货。这个过程大概需要一周左右但能避免后面几个月的返工。如果非要说一条最重要的建议那就是不要只看芯片参数一定要拿开发板实测。同一个芯片在不同开发板上的表现可以差很多尤其是射频性能和功耗。我见过太多项目因为开发板天线设计不好导致 Wi-Fi 距离不达标最后不得不改板。另外ESP-IDF 的版本管理很重要。我现在的做法是每个项目单独建一个 IDF 版本的 Docker 镜像这样环境隔离不会因为升级 IDF 影响老项目。VS Code 的 Dev Container 功能配合 Docker 很好用推荐试试。最后说一个 C3 的小技巧如果你觉得 C3 的 Wi-Fi 吞吐不够可以试试把 Wi-Fi 的 TX 缓冲区调大在 menuconfig 里把CONFIG_ESP32_WIFI_TX_BUFFER从默认的 16 改成 32吞吐能提升 10% 左右。这个参数在 S3 上也有但 S3 默认的缓冲区已经够大了改了效果不明显。
返回列表