很多玩ESP32的朋友,第一块板子基本都是买现成的开发板,插上USB就能点灯、连WiFi,确实省心。但当你把项目往产品方向推的时候就会发现,标准开发板总有那么几处不合适:尺寸塞不进外壳、引脚引出顺序不合心意、外设资源被板载功能占掉,甚至一个简单的供电都要被开发板自带的USB转串口电路牵着走。自己画一块ESP32最小系统板,才是真正“吃透”这颗芯片的开始。这篇文章我结合自己在嘉立创EDA上从头做板子的完整过程,把方案选型、原理图设计、PCB布局布线、打样焊接以及烧录调试中容易被忽视的坑全部整理出来。不管你是第一次画板还是已经画过几块STM32最小系统,这篇文章都能帮你少走不少弯路。
我用的工具是嘉立创EDA,理由很简单:免费、元件库全、和立创商城打通,画完原理图可以直接关联封装,下单打样也方便。下面我就按实际做板流程来讲,尽量把每一步的“为什么”也说清楚。
1. 先搞清楚:最小系统板要哪些东西,以及为什么组件这么选
1.1 从买板子到自己画板,差的到底是什么
买现成的ESP32开发板,便宜的NodeMCU十几块,官方DevKitC也就二三十块。自己做一版5片,算上物料成本,单片可以压到接近开发板价格,但优势不在省钱,而在自由度和可控性。
自研板的第一个好处是尺寸和引脚完全自定义。比如我要把板子装进一个手持设备外壳里,开发板那种宽宽长长的排针布局根本塞不进去。自研板可以按外壳内部空间定制板框,把排针安排在你需要的位置,甚至直接做成邮票孔或者金手指,这些都是买开发板解决不了的。
第二个好处是去掉了用不到的外围电路。很多开发板上有TF卡座、按键、大功率LDO、板载天线馈线等,这些资源你未必用得到,但会占用PCB面积,有的还会引入不必要的干扰。做最小系统板,就是把“必需”和“可选”拆开,只保留必需部分,把GPIO全部以排针或测试点形式引出,方便后续扩展。
第三个好处是倒逼你把芯片的启动逻辑、复位电路、供电需求真正搞懂。买开发板时你只要插USB就行,自己画板时这些问题一个都躲不掉,不过踩过一遍坑之后,你再看ESP32数据手册里那些启动时序、电平要求,就会觉得特别清晰。
1.2 “最小系统”并不是“最简电路”
很多人一听“最小系统”,以为就是把芯片引脚全引出来就行。实际上,ESP32最小系统板有两层含义。
第一层是“能跑起来”:必须有稳定供电、可靠的复位电路、正常的启动状态选择,以及一个能下载程序的接口。ESP32的工作电压是3.0到3.6V,对电源纹波比较敏感;EN引脚负责使能和复位,需要一个上拉电阻加一个对地电容形成RC复位电路;GPIO0是启动模式选择脚,拉低进入下载模式,正常运行时必须保持高电平;烧录接口通常用UART,需要通过USB转串口芯片和电脑连接。
第二层是“方便自己用”:包括把GPIO引出到排针、预留电源指示灯、预留手动复位和BOOT按键、给天线留出净空区等。别小看这些细节,实际操作中,没有BOOT按键的板子搞起来会麻烦很多,每次烧录都要拿镊子短接GPIO0和GND,体验非常差。
所以“最小”指的是功能范围最小化,而不是电路设计偷工减料。该有的去耦电容、滤波电容、上下拉电阻,一个都不能少,否则板子能跑但跑不安稳,排查起来反而更痛苦。
1.3 方案选择:模块、稳压、串口芯片都要提前定
ESP32方案有两种:模块方案和裸芯片方案。
模块方案用ESP32-WROOM-32这种成品模块,内部已经集成了晶振、Flash、天线和匹配电路,外面只需要供电和简单的外围电路,新手成功率极高。裸芯片方案用的是ESP32-D0WD这种纯芯片,需要自己设计40MHz晶振电路、Flash存储、天线匹配、射频走线,调试难度一下子跳到另一个量级,普通DIY场景完全没必要。
我这次选择模块方案,原因很直接:射频走线这东西对阻抗、净空和寄生参数都很敏感,自己做容易做出一块能跑但信号差的板子,得不偿失。用模块,射频部分由原厂解决,我只需要把电源和数字信号做好。
电源方案上,最常见的LDO是AMS1117-3.3,便宜、好买、电路简单。但AMS1117压差比较大,输入输出压差约1V,输入5V输出3.3V时还有一定余量,只是它在负载突然增大时瞬态响应一般。ESP32在WiFi发射瞬间电流可能冲到500mA以上,这时候用AMS1117的人很多,但摸过芯片的人会发现有点烫。如果追求更好的表现,可以用RT9013或ME6217这类超低压差LDO,静态功耗低、输出更稳。我的设计里先用AMS1117(因为手头有),但预留了焊盘可以直接换RT9013,这个后面再细说。
USB转串口芯片选型也值得提前考虑。CH340C内置晶振,外围电路简单,SOP16封装手工焊接也比较友好,是新手的稳妥选择。CP2102性能也不错,但QFN封装引脚在底部,手工焊接难度大,新手不建议一开始就挑战。因此我选择CH340C。
2. 原理图设计:把每个引脚的功能都落实到图纸
2.1 电源、去耦和Type-C插入识别
电源是整个系统的地基,我的习惯是先画电源,再画其他部分。
USB的5V进来之后,先经过一个500mA的自恢复保险丝,再并上一个大电容和一个小电容做输入滤波。大电容我用10μF钽电容,小电容用0.1μF瓷片电容,两者并联可以兼顾低频储能和高频去耦。5V经过LDO之后得到3.3V,这个3.3V是给ESP32模块、CH340C以及所有上拉电阻供电的。3.3V输出端同样需要10μF加0.1μF的组合,而且这两个电容要尽量靠近LDO的输出引脚放。
这里有个容易踩的坑:ESP32模块本身的VDD引脚,在模块内部有几个电源域,数据手册要求每个VDD引脚都放置不小于0.1μF的去耦电容。如果模块的VDD引脚分散在两侧,不要只在一侧放一个电容就算完事,最好每个VDD引脚旁边都放一个0.1μF电容到地,这样才能尽量减少不同引脚之间的电源耦合。
Type-C接口部分,如果用的是常见的六脚或十六脚Type-C座,要注意CC1和CC2引脚。作为被供电的设备,CC1和CC2都要各接一个5.1kΩ下拉电阻到地,这样才能让USB电源正确识别并输出5V。很多新手画Type-C只连VBUS和GND,结果插到某些只支持PD协议的电脑上发现没有电,多半就是这个原因。
2.2 EN复位电路与GPIO0:启动和下载的钥匙
ESP32模块的EN引脚是全芯片使能和复位引脚,低电平复位。我习惯在EN上接一个10kΩ上拉电阻到3.3V,再接一个0.1μF电容到地。上电瞬间,电容充电需要时间,EN引脚电压是缓慢上升的,这就形成了硬件复位的延时,比瞬间拉高可靠得多。
复位按键的接法是EN引脚通过按键接地,按下时把EN拉低复位。注意这个按键不需要接上拉,因为已经有10kΩ上拉了。
GPIO0是启动模式选择脚,它决定ESP32是进入下载模式还是正常运行模式。上电时GPIO0为高电平则正常运行,为低电平则进入串口下载模式。因此GPIO0需要一个10kΩ上拉电阻,同时通过一个按键接地作为BOOT按键。正常状态下GPIO0被上拉到高,按下BOOT时接地,再按一下EN复位,芯片启动时检测到GPIO0为低,就会进入下载模式。
这个“按BOOT→按EN→松BOOT”的操作,是ESP32最原始的下载方式。后面我会再讲自动下载电路,它是用CH340的DTR和RTS信号替代手动按键,但原理是一样的:下载工具先让GPIO0为低,再给EN一个低脉冲复位芯片,芯片启动时检测到低电平的GPIO0,就进入下载模式了。
2.3 串口、LED与引脚引出:在嘉立创EDA中一步步连出来
串口部分,CH340C的TXD要接到ESP32的RXD0,CH340C的RXD要接到ESP32的TXD0,这里一定要交叉!很多新手照着自己想的“同名相连”去接,结果TX接TX,死活连不上。CH340C的VCC接3.3V,如果CH340C的某些版本支持5V供电,要注意电平匹配,但CH340C的VCC接3.3V最省事,TXD、RXD的输出电平和ESP32兼容。
嘉立创EDA里画原理图的操作并不复杂。打开工具后,新建一个工程,在“元件库”里搜索“ESP32-WROOM-32”,会看到封装已经关联好的模块元件,直接放置即可。CH340C、AMS1117、Type-C座、按键、排针、电阻电容这些元件,在嘉立创EDA的立创商城库里基本都能直接搜到,而且封装大多数都已经做好,省去了自己做封装的麻烦。
LED部分,我留了一个电源指示灯接在3.3V,通过一个1kΩ限流电阻到GND;再接一个用户LED到GPIO5,同样用1kΩ限流。选择GPIO5而不是GPIO2,是因为GPIO2在某些启动场景下是strapping引脚,虽然模块内部处理得比较好了,但为了减少不必要的启动干扰,还是用GPIO5更省心。
所有GPIO都通过排针引出,排针间距2.54mm。GND我多引了几个引脚,方便后续接传感器和示波器。3.3V和5V也各引一到两个,供电方便。
原理图画完之后,在嘉立创EDA里运行一次电气规则检查,重点看有没有悬空引脚、有没有只连接了一端的线、有没有把VCC和GND短接的低级错误。这一步虽然不能保证电路完全正确,但能过滤掉不少笔误。
3. PCB布局布线:射频、接地与美观怎么平衡
3.1 从一块空板到功能分区的摆放
原理图通过DRC之后,就可以切换到PCB界面。我的板框画成60mm×38mm,两层板,板厚1.6mm。这个尺寸既能放下所有元件,又不会显得太挤,排针两侧引出后,整个板子看起来和普通开发板差不多大小。
布局的核心思路是“按功能分区,按信号流向排位置”。我把Type-C座放在板子左侧,紧挨着它的是自恢复保险丝和CH340C,因为USB转串口的数据线要短;AMS1117放在CH340C下方,靠近5V输入点。ESP32模块放在板子右上方,天线部分朝右,确保天线正对区域没有任何金属和走线。复位按键和BOOT按键放在模块左侧边缘,这样既能按到又不会遮挡其他元件。两侧排针纵向排开,把GPIO按顺序引出,电源和GND分别放在排针两端。
为什么模块要放在角落而不是正中间?因为ESP32-WROOM-32的板载天线在模块一端,天线下方必须净空,如果模块在板子中间,四周都是铺铜和走线,天线辐射性能和接收灵敏度都会明显下降。放在角落,可以让天线伸出板边,净空区域不受板内铜皮影响,这是射频部分最基本的要求。
3.2 星型接地在双面板上的实战表达
“星型接地”这个词,在音响和射频圈子里经常被提起。它的核心思想是:各个功能模块的地线不要形成串联公共路径,而是各自单独拉回到一个公共接地点,避免大电流的噪声通过地对小信号造成干扰。
但在双面板上,实际做法往往不是字面上的星星状走线,而是采用大面积地平面铺铜。大面积铺铜之后,地网络的阻抗极低,回流路径也最短,信号环路面积最小,这比人为画几根星型地线效果更好。那星型接地在ESP32板子上怎么用呢?我的做法是:整个板子底部铺一层GND铜皮,把数字地全部连成片;但传感器接口、ADC参考电压附近的地,单独用一小段走线引出之后再到主地汇合,避免和电源大电流回流路径直接交叠。
这里有个实操建议:不要在ESP32的地网络上做那种“每个地引脚单独走一根线到某一点”的星型接法,反而会增加地阻抗和环路面积。双面板就把地铺好,铺铜过孔打密一点,比什么接地玄学都管用。如果你用ADC采集模拟信号,再把模拟地网络在芯片附近单独隔离一下,效果会更好。
3.3 天线净空、线宽和过孔
天线净空是ESP32板子最容易出问题的点。ESP32-WROOM-32模块的天线在模块右上角,我做板时把模块放在板子边缘,天线部分完全伸出板边,这样板内铜皮不会影响天线。如果模块不能完全伸出,那么天线正下方至少保持8mm以上的净空区域,这个区域内顶层、底层都不能铺铜,也不能走信号线。
走线宽度上,我习惯把电源线走0.5mm(约20mil),信号线走0.3mm(约12mil),GND通过铺铜形成网络,不额外走线。对于CH340C和ESP32之间的UART信号,0.3mm完全够用,线距也保持在0.3mm以上。过孔我统一用内径0.3mm、外径0.6mm的规格,这样板厂加工无忧,手工焊接时过孔过大反而不容易填充。
布线的先后顺序也很有讲究。我先把USB转串口芯片到ESP32的UART线布好,再把电源线走完,最后处理LED、按键、排针等低速信号。走线时尽量避免在模块天线下面横穿,也尽量避免在晶振区域走覆铜。所有过孔旁边都打上地过孔,形成“地针包围”信号线的效果,这样能减少信号回流外泄。
4. DRC、打样与焊接:把图纸变成第一块能用的板子
4.1 设计规则检查不是走过场
在PCB界面布线完成后,最忌讳的就是直接下单。先运行一遍设计规则检查,也就是DRC,很多低级错误都能被它拦住。
嘉立创EDA的DRC检查在“工具”菜单下,可以按板厂的生产工艺去设置规则。比如线宽下限设0.15mm,线距下限设0.15mm,孔的尺寸下限设0.3mm。这些参数不同板厂可能略有差异,但嘉立创常规工艺都能支持。
我第一版板子DRC报了一堆错误,仔细排查之后,最典型的几个是:元件间距不足、丝印覆盖焊盘、以及电源线在某个拐角处突然变细变成瓶颈。元件间距不足会让焊接时两个焊盘连锡;丝印覆盖焊盘会导致焊接后看不清标识,甚至因为丝印层在焊盘上形成阻焊凸起影响贴片;电源线变窄则会在高电流下形成明显的压降和发热。DRC查完,再把丝印稍微调整一下,让位号清晰可见,就可以准备导出了。
4.2 下单时这几项要选对
嘉立创EDA和嘉立创打样平台是一体的,PCB画完可以直接在EDA里生成下单文件,不需要手动导出Gerber再上传,这也是一体化工具的好处。
下单时板材选FR-4,板厚1.6mm,层数选2层,颜色随便选,我个人喜欢绿色配白丝印,看着清爽。表面工艺选无铅喷锡,性价比高,手工焊接也不会有什么问题。最小线宽线距填6mil或8mil,过孔参数按默认来。
数量方面,打样一般5片起,价格很便宜,新手第一次打样完全够用。下单后随时关注板厂邮件或站内信,如果DRC规则和板厂工艺有冲突,板厂会提示,按提示改一下再重新提交就行。
4.3 焊接顺序和上电自检
板子回来后,开始焊接前先准备好工具:T12烙铁,温度调到350到380摄氏度,助焊剂、吸锡带、镊子都得备好。
焊接顺序一般是先焊电源部分,再焊小元件,最后焊大模块。我这里先焊Type-C座、保险丝、AMS1117,然后是CH340C和电阻电容,最后焊ESP32模块和排针。
为什么ESP32模块放最后?因为模块引脚多,如果先焊模块,后面焊接其他元件时烙铁容易碰到它,弄不好就会把引脚弄短路。最关键的还是上电前自检:量一下3.3V和GND之间有没有短路,确认无误后再插USB。插上USB后马上测LDO输出是否为3.3V、测量EN引脚电压是否接近3.3V、量CH340C的TXD引脚是否有3.3V逻辑电压。这些指标正常,才敢去连电脑、看串口。
5. 第一次上电:烧录、调试和三个逃不掉的坑
5.1 下载模式进不去的快速排查
板子焊好、上电正常,接下来就是烧录。如果用ESP-IDF或Arduino IDE烧录,第一次大概率会遇到“Connecting... 然后卡住”的情况。别慌,这是ESP32烧录最常见的问题。
先试手动下载方式:按住BOOT按键,按一下EN按键复位,然后松开BOOT,在IDE里点烧录。如果等几秒后开始同步,说明板子硬件没问题,只是自动下载电路没生效。如果手动方式也进不去,就要检查串口有没有识别到COM口、CH340C的驱动装没装、TXD和RXD有没有交叉接反。
还有一个容易忽略的问题:如果你把GPIO0引脚也引出来做其他外设用,且外部电路把GPIO0拉低了,那么上电后板子会一直处于下载模式,程序跑不起来。遇到这种问题,断开GPIO0外部电路再看,多半就正常了。这和后面提到的LAN8720以太网模块的坑是同一个道理。
自动下载电路这块,我用的是CH340C的DTR和RTS两个信号经过三极管控制EN和GPIO0。如果自动下载失败,先别急着怀疑三极管,先用示波器或万用表看一下按下烧录时DTR、RTS有没有电平变化,再看EN有没有被拉低、GPIO0有没有被拉低。整个下载时序是:工具先让GPIO0拉低,再让EN产生一个低脉冲,芯片在复位后检测到低电平的GPIO0进入下载模式。如果三极管接反了或者电阻选得不对,都可能导致时序对不上。如果你只是做自己用的板子,不想调自动下载电路,完全可以用手动下载方式,一个BOOT键一个EN键就足够稳定了。
5.2 给这块板子加网口:ESP32接LAN8720的3个坑
很多物联网项目需要有线网络,ESP32本身只有WiFi,要接以太网通常走RMII接口加一颗LAN8720A PHY芯片。这个组合在很多开发板资料里都有,但实际接起来特别容易踩坑,网上搜“esp32连接lan8720”能看到各种问题,我这里总结三个最常见的。
第一个坑是引脚对应不匹配。ESP32的RMII接口不是随便拉几个GPIO就能用的,常用的引脚分配是:GPIO21接TX_EN,GPIO22接TXD0,GPIO23接TXD1,GPIO25接RXD0,GPIO26接RXD1,GPIO27接CRS_DV,时钟信号走GPIO0。问题就出在GPIO0上,它既是RMII的REF_CLK引脚,又是启动模式选择引脚。正常情况下GPIO0要接时钟输出给PHY,但这会干扰下载模式,导致烧录不稳定。解决办法是在GPIO0和PHY时钟之间加一个0欧电阻或直接留一个跳线焊盘,烧录时断开,运行时常住。
第二个坑是复位时序问题。LAN8720的复位引脚是低电平有效,上电后必须给它一个由高到低再回到高的复位脉冲,之后PHY才能正常初始化。很多模块设计把这个引脚直接接3.3V,看起来省事,但PHY可能没有完成内部复位,导致MCU读不到PHY寄存器。正确做法是用MCU的一个GPIO控制PHY复位,复位后延时150ms以上再开始配置PHY寄存器。
第三个坑是电源噪声。LAN8720对3.3V电源的纹波比较敏感,实测中如果3.3V上叠加了较大的开关噪声或WiFi射频干扰,PHY会出现偶发断链、丢包。解决方法是给PHY的电源引脚单独加一个10Ω电阻串联磁珠再并0.1μF电容,形成简单的电源隔离,效果明显。
如果你也打算给ESP32板子扩展以太网,建议布局时把PHY芯片靠近RJ45网口放,RMII信号线要短,避免过长走线引入时序问题。
5.3 ESP32的ADC精度和WiFi蓝牙共存实测
最后说两个ESP32本身容易被误解的地方。
第一个是ADC精度。ESP32内置的SAR ADC在12位模式下理论精度不错,但实际线性度并不好,尤其是0到100mV和3.0V以上区间,误差非常明显。在不同衰减档位下,ADC的增益和零点偏差也不一样。如果你的项目对电压采集精度要求高,比如做电池电压监测、电流采样,建议不要直接用内置ADC,外挂ADS1115这种16位ADC,或者用校准算法先做一段线性补偿。我在做一个小型传感器板时,用内置ADC测锂电池电压,读数和万用表差出将近100mV,后来换成外部ADC才解决问题。
第二个是WiFi和蓝牙共存。ESP32同时支持WiFi和蓝牙,硬件上可以同时开启,但两者共用2.4GHz频段和射频前端,所以是时分复用关系。实测下来,蓝牙保持连接、WiFi同时传输数据时,WiFi吞吐率会有明显下降,反之蓝牙丢包率也会上升。如果你的应用对实时性要求很高,比如WiFi传音视频又要蓝牙控制,就要考虑到这个干扰,尽量错开两者的工作时段。
这几个问题不算“板子设计”问题,但它是你在这块最小系统板上跑实际项目时一定会遇到的。先把这些了解清楚,后续开发能省掉很多排查时间。
我个人做这块最小系统板,前后做了两版。第一版只画了电源、复位、串口、排针,功能简单,但烧录要手动按键,用起来不够顺手。第二版加了自动下载电路、Type-C的CC下拉电阻、以及更规范的天线净空区域,整体稳定性和体验好了很多。如果你也打算复刻一遍,建议第一版就把自动下载电路加上,成本其实只是几个电阻电容和一个三极管,但体验提升非常明显。
最后再分享一个小技巧:在嘉立创EDA里画完PCB后,别忘了检查一下丝印方向。排针的1脚、按键的标识、LED的正负极,在焊接时都会用到。把丝印调整到清晰可读的方向,能省掉不少对着原理图翻来找去的时间。打样回来焊完第一块板子,插上USB看到串口打印出“boot: 0x0”的那一刻,所有画图时候的折腾都值了。