
做硬件这些年被问得最多的一个问题是“我用 ESP32那我买东西到底买芯片还是模组”每次听到这种问法我心里都会咯噔一下——因为“ESP32”这三个字在大家嘴里实在太泛了。它可能指的是乐鑫那颗 SoC 芯片也可能指的是带天线带 Flash 的模组甚至有人把开发板也叫 ESP32。真实选型时如果你没有把概念区分清楚没有落到一个“可下单的料号”后面采购、贴片、认证、代码统统会踩坑。这篇文章我打算从一个硬件工程师的实际选型视角把 SoC、芯片、模组这三个词拆开讲清楚他们到底差在哪再结合我自己的实操经验给出一套从需求到具体料号的选型方法。不管你是刚接触硬件的创客还是准备把样品做成产品的工程师都能在里面找到可以直接抄作业的判断逻辑。1. 先把底层概念捋清楚SoC、芯片、模组到底分别是什么很多朋友第一次听到“SoC”这个词第一反应是“这不就是颗 CPU 吗”。真不是。SoC 的全称是 System on Chip翻译过来是“片上系统”。它把一个无线设备需要的绝大部分单元集成到了一颗裸硅片里。拿经典 ESP32 来说芯片内部有双核 Xtensa LX6 处理器、Wi-Fi 802.11 b/g/n 基带、蓝牙 4.2 协议栈、520KB SRAM、ADC/DAC、多路 UART/I2C/SPI/GPIO、硬件加密和电源管理模块。你把它理解成一间“拎包入住状态的迷你公寓”更合适CPU 只是客厅Wi-Fi 和蓝牙是卧室内存是厨房外设接口是阳台电源管理是水电管道。而传统方案里这些功能大概要好几个独立 IC 才能凑齐。把这么多模块集成到一个硅片上最大的好处是物理上大幅减少了 BOM 数量也让功耗可以协同管理。比如 Wi-Fi 空闲时 Modem-SleepCPU 还能继续跑任务再比如深度睡眠时只供 RTC 域电电流能降到几十微安级别。如果你用分立器件做这种跨模块的低功耗调度会变得极其困难。这也是为什么 ESP32 系列能成为 IoT 项目“默认选型”的核心原因。不过这里要特别提醒SoC 芯片本体一般是不带 Flash 和 PSRAM 的。经典 ESP32 和 ESP32-S3、ESP32-C3 的裸芯片虽然是 QFN 封装但它仍需要给外面接一颗 SPI NOR Flash才能存放固件。上电启动时芯片内部的 ROM Bootloader 会通过 boot 引脚的配置决定是从 Flash 正常启动还是进入串口下载模式。这个过程就是大家搜索“soc芯片启动”时会看到的内容。换句话说只买一颗芯片你是没法直接用的后面还有一串“外挂”等着你配。1.1 一颗 ESP32 芯片的本质SoC 不是 CPU 的简单替代直接买芯片的人往往只看到“便宜”。但便宜不代表简单。裸芯片通常以 QFN 封装出货引脚中心间距不到 0.5mm手工焊接几乎不可能必须用钢网、回流焊或者精密热风枪来处理。而且它需要外部挂 SPI Flash、无源晶振、负载电容、射频匹配网络、电源去耦电容。每一颗料都有选型讲究布局布线也要小心。我见过不少项目芯片贴好了固件也烧进去了但板子 WiFi 灵敏度差到手机隔一堵墙就连不上。原因往往是天线走线、参考地平面、匹配器件本身的问题。同样的芯片方案不同人画出来的板子性能可以天差地别。这就属于“看得见的价格看不见的研发和测试成本”。1.2 模组帮你把“芯片”变成一个能用的硬件单元模组则是另一条思路模组厂先把 SoC、Flash、PSRAM、40MHz 晶振、射频匹配网络、天线、屏蔽罩以及一堆去耦电容全部贴到一小块 PCB 上然后把必要的引脚以邮票孔或 LGA 焊盘的方式引出来。你拿到手里的是一个可以直接当成“带 Wi-Fi 的 MCU 主板”的元件只需要按引脚定义给它供电、接传感器或外设它就能工作。常见的 ESP32-WROOM-32E、ESP32-S3-WROOM-1、ESP32-C3-MINI-1 都属于这种形态。如果说裸芯片是“买了一台发动机散件”那模组就是“买了一台带进排气和点火系统的发动机总成”。总成价格当然更贵但你不需要自己配油管、配火花塞插上线束就能跑。模组里最难处理的射频前端——天线匹配、阻抗控制、射频走线——已经在出厂前调好了而且许多模组都拿过 FCC、CE 等认证。只要你的产品电路没有乱画天线位置没被金属大面积遮挡认证时就能引用模组已有报告节省的周期和费用相当可观。从料号上看模组也比散片更容易精确表达。你写“ESP32-WROOM-32E”采购就知道要带 4MB Flash 的板载天线模组写“ESP32-S3-WROOM-1-N8R8”就知道是 8MB Flash 加 8MB PSRAM 的 AI 版本写“ESP32-C3-MINI-1”就知道是小尺寸低功耗版本。而如果你只写“ESP32”代理商大概率会追问一句你要芯片还是模组哪个后缀是不是要带 Flash这一问很多人就懵了。所以先分清形态之后再谈可下单料号。2. 选型决策前提从应用场景出发选芯片还是选模组“选芯片还是模组”没有标准答案完全看你的项目阶段、团队能力和量产规模。我见过两三个人埋头做消费单品也见过大厂硬件组为了省几毛钱料成本硬啃裸芯片。下面我把两种路线的适用条件说清楚你对照自己的情况去判断。2.1 裸芯片直用适合量足够大、有射频设计能力的团队裸芯片成本低这个谁都知道但不是谁都能把这颗低成本的芯片用好。直接用裸芯片你至少要自己解决四件事第一设计外部 SPI Flash 电路包括选型、供电、走线第二设计 40MHz 晶振及其负载电容晶振起振不稳芯片整个不工作第三设计射频部分包括天线、巴伦、匹配网络和阻抗线这部分直接决定 Wi-Fi 的信号质量和辐射带宽第四做 Boot 启动电路保证烧录和正常启动之间能自动切换。这些工作的难度不是“照着参考设计抄”就能抄完的。天线附近的过孔、铺铜、器件摆放、PCB 叠层都会影响性能。裸芯片贴回板子上之后你还需要用频谱仪看发射功率用网分看天线匹配用屏蔽房测试接收灵敏度。没有这些设备和经验你很可能做出来的板子“能跑但信号特别差”而且很难定位是哪里的问题。更现实的是认证成本原厂模组很多已经过了无线认证你用裸芯片等于重做射频认证周期和预算都不小。除非你有稳定的出货量可以把这些成本摊得很薄否则我不建议把裸芯片作为首选。2.2 模组上车适合绝大多数中小项目和快速落地模组的最大价值是帮你把硬件设计里的“高风险项”降级成“低风险项”。射频前端是被动器件最多、最讲究经验的地方模组把这一块封装好了你只需要保证电源够干净、天线净空区合规基本就能拿到正常性能。对绝大多数中小项目来说项目周期比 BOM 成本更值钱。用一个成本略高的模组换来少加班一个月、少打两次板、少跟认证实验室扯皮这笔账怎么算都是划算的。模组另一个好处是更新换代灵活。产品卖到一半如果原厂出了带更多 Flash、更低功耗的新模组只要封装和引脚兼容你可能只改固件甚至只改料号就能升级而不需要重新设计主板。反过来如果用裸芯片芯片内部资源不够或者版本改版主板基本就得重画。当然模组也有缺点体积比裸芯片方案大、引脚的选择受限制、成本的确更高。但这些缺点在量产早期通常不致命。我自己的原则是新项目一律先上模组等功能、市场都验证好以后再单独评估“是否要为了降成本切换到裸片”。这种“以后再说”的策略比一上来就挑战高难度要稳得多。2.3 需求拆解清单五个问题选出方向“选模组还是裸芯片”不是唯一的问题更关键的是选哪个型号的模组。我一般会先问五个问题无线协议是什么确定你要 2.4GHz Wi-Fi BLE还是要支持 Zigbee / Thread / Matter那就得看 ESP32-C6 之类的新家族。固件和应用需要多大空间OTA 升级、日志、本地模型都会挤压 Flash图像和 AI 运算则离不开 PSRAM。产品体积和引脚数量是什么水平模组引脚数量、尺寸和天线形式要与外壳结构匹配。功耗目标是多少电池供电还是插座供电睡眠电流能做到什么程度需要哪些 RTC GPIO 做唤醒。量产和认证路径是什么自己贴片还是代工产品使用模组还是裸片目标市场是否需要特定认证。把这五个问题的答案列成一张表格选型范围基本就框死了。下面是我比较常用的场景对照典型项目推荐参考方案选型理由温湿度采集、插座开关、简单传感器上报ESP32-C3-MINI-1体积小、成本低、RISC-V 单核够用、BLEWiFi带屏幕的人机交互、摄像头图像、边缘 AI 识别ESP32-S3-WROOM-1-N8R8双核 LX7、AI 指令扩展、8MB PSRAM 跑图老项目/生态依赖、电容触摸、经典蓝牙ESP32-WROOM-32E资料多、老外设全、兼容旧代码语音关键词唤醒ESP32-S3-WROOM-1-N8R2AI 加速 PSRAM 放模型和缓冲要注意这张表是参考不是铁律。C3 也并非绝对比 S3 功耗低只是深度睡眠时 RTC 域功耗普遍更省Wi-Fi 发射功耗大家都差不多最终决定电池续航的是唤醒策略和发包频率。3. 核心细节拆解芯片转模组之后有哪些看不见的坑很多人以为模组就是把芯片“换个壳”引脚一一对应其实没那么简单。模组内部为了集成 Flash、PSRAM、晶振、天线会牺牲一部分原本芯片可以给用户用的引脚并且把很多硬件设计的坑悄悄转移到了你的 PCB 设计里。3.1 模组把最容易踩坑的硬件环节封装好了但不是零成本模组确实帮你省了晶振、Flash、匹配电路但这些器件不是凭空消失而是被放到了模组内部并且占用了芯片的部分引脚。几乎每个模组都会有“部分 GPIO 在内部被 Flash、PSRAM、晶振或 RF 占用用户不可使用”的说明。一个典型的错误是有人按 SoC 芯片的全功能引脚表去设计底板结果接上模组之后发现某个引脚根本不受控查半天才发现内部已经连了其它设备。因此用模组设计时一定要以“模组规格书的引脚定义表”为准而不是拿原厂裸芯片手册硬套。模组手册里通常会清楚标注哪些 GPIO 可用于外部中断、哪些是 ADC 输入、哪些是 strapping 引脚、哪些被占用。坚持这个习惯能避开很多莫名其妙的硬件 bug。另外模组供电也不是接个 3.3V 就完事。Wi-Fi 发射时电流是脉冲式的峰值能到三四百毫安甚至更高如果电源 LDO 选小了或者输出电容不够电压会被拉垮造成随机重启。设计时至少给模组留 500mA 以上的余量并把去耦电容尽量靠近模组电源引脚。3.2 芯片的启动模式和自动下载电路模组同样需要很多人以为模组封装好了就不用管启动电路其实不是。模组的 EN 脚、IO0 脚仍然要连接并处理好。以经典 ESP32 为例正常启动条件是 GPIO0 在上电瞬间保持高电平而进入下载模式需要在复位时让 GPIO0 为低电平。所以我们常看到开发板上一颗 Boot 按键、一颗 EN 按键先按住 BootIO0 拉低再按一下 ResetEN 给低脉冲就能进入烧录模式。量产产品不可能靠人去按按键所以需要自动下载电路。最常见的方式是用 USB 转串口芯片的 DTR 和 RTS 信号加两个三极管或 MOS 管组合控制 EN 与 GPIO0。流程大体是先让 GPIO0 拉低然后 EN 产生一个下降沿复位芯片进入 ROM 下载模式之后串口就可以灌固件了。很多现成源码和参考设计里都叫“Auto Download Circuit”你在画底板时最好把这一小段电路原样保留。如果用的是 ESP32-S3 或 ESP32-C3 的原生 USB那更简单。S3、C3 的部分封装自带 USB-Serial/JTAG 外设直接用 Type-C 数据线就能烧录连 USB-UART 芯片都可以省。“esp32烧录方式”除 UART 和 USB 外还有 JTAG不过在量产产线上串口自动下载依然是最稳定、最通用的方案。3.3 天线形态直接决定产品结构模组常见天线有三种板载 PCB 天线、IPEX 外接天线座、以及少数陶瓷天线。选型时不能只看功能和价格必须看产品结构。如果你的外壳是全塑料、设备周围没有大面积金属那板载天线的成本最低、可靠性也足够。如果产品要放在金属机箱里或者内部有电池、电机、屏蔽罩等金属物体那最好选 IPEX 外接天线把天线引到外壳开孔处。天线附近要留净空区。哪怕是模组自带板载天线你放置在主板边缘还不够天线正下方那一圈 PCB 最好挖空铺铜周围不要走高频线也不要放金属连接器和螺丝。很多 WiFi 信号弱的投诉最后排查下来不是模组坏而是天线旁边有一个大面积的 GND 平面把辐射吸收了。这个坑很常见而且一旦形成需要改版才能修。3.4 Flash、PSRAM 与 OTA、AI 的关系要提前算同一个系列模组后缀里的 N 和 R 代表 Flash 和 PSRAM 容量。比如 ESP32-S3-WROOM-1-N8R8N8 就是 8MB FlashR8 就是 8MB PSRAM如果没有 R说明模组不带 PSRAM。这个后缀不是厂商随意加的它关系到你代码能不能跑、能不能 OTA。如果你只做一个小开关控制4MB Flash 够用。但要上 OTA就得给固件分两个区至少需要一个 OTA 分区和一个备份分区4MB 会有点紧张。如果要跑摄像头、屏幕 GUI、语音识别模型基本需要 PSRAM因为片内 SRAM 就几百 KB一帧图像就占掉不少。很多朋友从教程里抄了一版 AI 示例结果自己买的是不带 PSRAM 的 N8 版本编译能过一跑就内存不足这就是选料号时没看后缀造成的。4. 从项目需求到可下单料号一个完整选型实例前面讲了原理下面我用两个具体项目把选型过程串起来。一个是低功耗传感器节点一个是边缘 AI 视觉设备。两种项目的需求差异很大选型逻辑也因此不同但最终都要落到一行清晰可采购的料号上。4.1 场景A电池供电的温湿度采集器第一个例子很典型做一个电池供电的温湿度采集器每十分钟上报一次期望至少工作半年以上。这个场景下我大概率会选 ESP32-C3-MINI-1。原因是 C3 是单核 RISC-V足够跑 Wi-Fi、BLE 和传感器协议栈而且模组尺寸很小深度睡眠功耗也低。传感器我倾向用 I2C 接口的 SHT40 这类而不是用需要严格时序的 DHT11/DHT21因为睡眠唤醒后读数据要快、要稳。代码层面就是上电初始化、读传感器、连 Wi-Fi、往 MQTT/OneNET 发一条数据、然后进 Deep-Sleep。我通常把测量和上报时间压到两三秒内其余时间全部让系统睡过去。为了让睡眠时间精确外部中断和 RTC 唤醒是核心。比如可以接一个低功耗定时器或者用 ESP32 内部 RTC 定时器唤醒如果产品上还有物理按键按键就接在 RTC GPIO 上用外部中断把系统从 Deep-Sleep 拉起来。这个项目在 BOM 里会写“ESP32-C3-MINI-1-N4”而不是“ESP32”。如果你买开发板可以直接找 ESP32-C3-DevKitM-1如果自己做板子从模组引脚表里选可用的 GPIO 接传感器和按键同时保留 UART0 作日志和烧录。4.2 场景B带摄像头的边缘 AI 识别终端第二个例子是很多人感兴趣的方向用 ESP32 做边缘 AI识别图像或者语音关键词。这时经典 ESP32 的 520KB SRAM 往往不够我是强烈建议上 ESP32-S3 系列并且挑选带 PSRAM 的版本。推荐料号是 ESP32-S3-WROOM-1-N8R8也就是 8MB Flash 8MB PSRAM。为什么需要 PSRAM摄像头一帧 RGB565 的 QVGA 图像大概要 300KB如果做连续处理或者跑神经网络推理内存需要以 MB 为单位。没有 PSRAM基本只能读取静态图像并做非常小的分类。ESP32-S3 和其他 ESP32 芯片相比除了内存大、双核主频高还多了一部分向量指令扩展可以加速矩阵运算和 SIMD 操作。主流的嵌入式 AI 框架如 TFLite Micro 都能跑但你要有心理准备S3 毕竟不是带大算力的边缘 GPU模型必须压缩、量化到 int8参数量控制在几十到几百 KB才有可能获得实用帧率。这类产品的原型我一般会用官方 ESP32-S3-DevKitC-1 开发板跑通模型后再把核心换成 ESP32-S3-WROOM-1-N8R8 自己画底板。烧录也不用额外 USB 转串口直接用 USB 线插开发板的 USB 口在 Arduino IDE 里选 ESP32S3 Dev ModuleIDE 会自动识别。4.3 从型号到可下单料号N/R 后缀与 Ordering Info前面说了很多次“料号”这里我展开讲怎么把它落实。乐鑫官网每个产品页面下都有 datasheet规格书最后一页通常有一个 Ordering Information 表。这里会列出所有可下单的型号字符串比如 ESP32-C3-MINI-1-N4、ESP32-S3-WROOM-1-N8R8。你选型时不要自己去拼装型号最好直接复制官方的完整料号因为不同地区的代理商可能对后缀的写法有细微差异。N/R 后缀是乐鑫常用的命名规则N 后面跟数字代表 Flash 容量比如 N4 是 4MB、N8 是 8MB、N16 是 16MBR 后面跟数字代表 PSRAM 容量比如 R2 是 2MB、R8 是 8MB。如果一个型号没有 R就是不带 PSRAM 的版本。有些老型号还会带 H4 之类的后缀代表内置 4MB Flash 的版本比如 ESP32-WROOM-32E-H4。在采购单上把这些后缀写清楚代理商就不会发错货。如果你的产品已经决定用裸芯片那你也应该把芯片级别的料号写清楚。比如经典 ESP32 有 ESP32-D0WD、ESP32-D0WDQ6、ESP32-D0WD-V3 等这些版本之间在主频、封装内嵌等细节上可能有差异。不过我的建议很直接除非你有非常明确的降本需求否则默认选模组把裸芯片留给下一轮优化。4.4 开发环境准备Arduino IDE 与 PlatformIO 离线包选好料号之后最快手的方式是用 Arduino IDE 或者 PlatformIO 做原型验证。Arduino IDE 装环境时需要把 ESP32 核心包下载到本地。国内网络从外部仓库拉文件经常超时这时候用“arduino ide esp32离线包”是最省事的找一个版本匹配的离线压缩包解压到 Arduino15 目录下然后重启 IDE 就能认到板卡。PlatformIO 那边也有类似离线包常玩 ESP32 的应该都懂这里不展开。有一个特别容易踩的坑板子型号选错。C3 模组要选“ESP32C3 Dev Module”S3 模组要选“ESP32S3 Dev Module”而不是统一选“ESP32 Dev Module”。选错之后虽然代码大部分能编译但引脚编号、Flash 大小、内置 USB 可能对不上烧录后行为会非常奇怪。正确的做法是先看自己开发板丝印上写的型号再对照 IDE 列表里的板子名称。5. 常见问题与排查技巧实录5.1 问题速查表我会把实际项目中经常遇到的现象整理成一张表方便你照着排查现象很可能的原因排查方向串口连接不上 / 烧录失败USB 驱动没装、BOOT 模式没进、波特率不对装 CP210x/CH340 驱动按住 Boot 按 Reset降低波特率上电后程序没跑串口无输出Flash 没贴好、电源被拉低、EN 卡在低电平查看 EN 上拉和复位电路用示波器看 3.3V 上电波形WiFi 频繁掉线 / 信号差天线净空不足、供电纹波大、射频匹配不对检查天线周围是否铺铜确认 LDO 余量换外接天线编译提示 Flash 空间不足选择的板子 Flash 容量与实际不符或 OTA 分区太大检查 IDE 里 Board 的 Flash Size换更大 Flash 料号外部中断偶尔不触发引脚未配置为输入、上拉电阻缺失、用了非 RTC GPIO检查 pinMode、内部上拉查 RTC GPIO pinout深度睡眠后无法唤醒唤醒源配置错误、引脚被外部拉死、未使能 wakeup用 ext1 或 ext0 正确配置确保唤醒引脚可用BLE App 搜不到设备广播未开启、广播参数过于激进、天线太差确认广播代码在跑检查广播间隔靠近测试这张表覆盖了我踩过的绝大多数“看起来像软件问题实际是硬件问题”的坑。5.2 外部中断与低功耗唤醒实战“esp32外部中断实战”是搜索热度很高的词我简单说下关键点。在 Arduino 环境里普通 GPIO 中断非常直接用 attachInterrupt(digitalPinToInterrupt(pin), isr, mode) 挂在任意支持中断的 GPIO 上即可。这个层面的中断适合响应快速脉冲比如编码器、计步器、传感器报警。但如果你要做低功耗就必须区分两种中断普通中断和唤醒源。ESP32 进入 Deep-Sleep 后主 CPU 断电普通 GPIO 中断不会再触发必须使用 RTC 域支持的 GPIO 作为 ext0/ext1 唤醒源。经典 ESP32 上有 RTC_GPIO 编号映射ESP32-C3、S3 的 RTC IO 数量更少选引脚时一定要查官方 pinout。代码一般是先在 setup 里配置唤醒源再调用 esp_sleep_enable_ext0_wakeup 或 ext1最后 esp_deep_sleep_start。不少新手把普通 GPIO 当唤醒脚用结果睡死就是这个原因。5.3 蓝牙 App 控制与一键配网怎么选想用手机 App 控制 ESP32常规做法有两种一种是 App 和 ESP32 都连接同一个局域网通过 MQTT/TCP/UDP 通信另一种是直接用 BLE 做点对点控制。BLE 方案适合没有 WiFi 环境或配网前的状态WiFi 方案适合云端联动和群控。许多产品采用“先 BLE 配网再切 WiFi”的方式也就是 App 通过 BLE 把 WiFi 的 SSID 和密码传给设备设备再连路由器。乐鑫的 ESP-Touch 是另一种一键配网方式手机和模组在同一 WiFi 下通过协议广播方式下发配置。我在实际项目中更偏好 BLE 配网因为它不依赖路由器关闭 AP 隔离兼容性更好。至于“esp32 ble mesh arduino”我提醒一句Arduino 环境下跑真正的 BLE Mesh 并不舒服官方协议栈通常是用 ESP-IDF 写的。如果你只是想把一组设备互相通信可以先看 ESP-NOW 或者简单 BLE 组播没有必要一上来就上 BLE Mesh。模块选型上支持 BLE 5.0 的 S3、C3 都比经典 ESP32 更适合长距离广播。5.4 采购和生产中的料号陷阱最后这部分很重要尤其是要量产的朋友。同一个模组型号原厂可能会出多个版本修订号。比如 ESP32-WROOM-32 和 ESP32-WROOM-32E虽然引脚大致兼容但内部芯片工艺、射频指标、蓝牙版本会有变化。买之前最好先看当前版本的 datasheet并且向代理商要一份 PCN确认你设计时用的版本没有停产或者改规格。市面上的“兼容模组”也要小心。一些第三方模组会标“ESP32 compatible”但引脚定义可能不同、Flash 品牌不同、天线性能差异很大。BOM 里如果只写了“ESP32”采购很容易买到这类货。正确做法是BOM 里写完整型号并注明品牌、等效料号、封装和版本到货后用脚本读取 chip revision、Flash size、MAC 地址和原厂值做比对。这一步在量产阶段能帮你挡住不少次品。6. 我的经验与最后的几点建议6.1 先模组后降本是更稳妥的路线我做第一个量产产品时仗着硬件功底还凑合拍了板直接用裸芯片理由很直白省成本。结果省下来的那几块钱在射频调试和认证测试里翻了好几倍赔回去。后来我就养成一个习惯新项目第一版永远默认用原厂模组因为模组把变量控制住了让我能更快验证业务逻辑。等产品真正卖起来、量也上来了再专门立项做“芯片化降本”那时候预算、测试设备、团队经验都到位了风险才可控。6.2 完整料号意识要贯穿项目始终还有一个始终挂在嘴边的心得写 BOM、写 PCB 丝印、写采购单都要用完整料号。不要写“ESP32”要写“ESP32-S3-WROOM-1-N8R8”要写“ESP32-C3-MINI-1-N4”。一个看似多余的 N/R 后缀决定了你的代码能不能跑、OTA 分区够不够、AI 模型有没有内存。很多项目延误和返工源头就是这几个字符。希望能帮到正在选型的你。如果后面有具体料号吃不准或者选完发现性能不对也欢迎回来交流——选型这东西多踩几次坑就熟了。