ESP-01/ESP-01s烧录避坑指南:从接线到Flash容量全解析
2026/9/23 7:21:30 网站建设 项目流程

1. 为什么ESP-01/ESP-01s的烧录总让人翻车

ESP-01和ESP-01s这两块小板子,在物联网DIY圈子里算是元老级的存在了。便宜、体积小、自带Wi-Fi,拿来做个小开关、温湿度上报、远程继电器控制,成本能压到十块钱以内。但几乎所有新手第一次拿到它,都会在烧录这一步卡住——要么接线接了半天没反应,要么串口助手一片乱码,要么烧进去的程序跑不起来。我自己第一次玩ESP-01的时候,光是搞明白那几个引脚怎么接就花了一个晚上,后来陆续踩了Flash容量选错、波特率不匹配、GPIO0忘记拉低这些坑,才慢慢摸清楚它的脾气。

这篇内容就是把我这些年用ESP-01/ESP-01s烧录过程中遇到的所有坑,从引脚定义、Flash容量选择、串口助手设置到那个让人困惑的74880波特率,全部拆开讲清楚。不管你是刚接触单片机的新手,还是从STM32、Arduino转过来的老玩家,只要你想用ESP-01/ESP-01s做点东西,这里面的内容都能帮你少走弯路。我会尽量用大白话把原理讲明白,同时给出可以直接照着做的操作步骤和参数配置,让你看完就能上手。

2. 先搞清楚你手里的是ESP-01还是ESP-01s

2.1 两块板子的外观差异与识别方法

很多人拿到板子第一反应是“这不都一样吗”,确实,ESP-01和ESP-01s长得非常像,都是那种蓝色PCB、8个引脚排成两排的小模块。但仔细看还是有区别的。ESP-01的板子通常稍微长一点,PCB边缘的走线布局不同,最关键的是背面那颗Flash芯片的型号不一样。ESP-01一般配的是25Q80之类的1MB Flash,而ESP-01s多数是25Q40,也就是512KB。另外ESP-01s在板子正面通常会印一个“ESP-01S”的丝印,虽然有些批次印得很淡,但拿手电筒照一下还是能看清的。

从功能上说,ESP-01s是ESP-01的改进版,主要改动是增加了一个上拉电阻在GPIO0和GPIO2上,让模块在正常工作时更稳定,不容易因为引脚悬空导致启动失败。这个改动看起来小,但对新手来说其实挺重要的,因为ESP-01如果GPIO0或GPIO2悬空,上电后可能直接进入下载模式或者跑飞,而ESP-01s就省心很多。

2.2 为什么区分型号对烧录很重要

你可能会问,不就是烧个程序吗,型号有那么重要?答案是:非常重要。因为ESP-01和ESP-01s的Flash容量不同,烧录时如果选错了Flash Size参数,轻则程序跑不起来,重则直接烧录失败报错。比如你拿一块ESP-01s(512KB Flash)去按1MB的配置烧录,esptool可能会在写入过程中报“Failed to write flash”或者写完之后模块不断重启。反过来,如果你拿ESP-01(1MB Flash)按512KB配置烧,虽然能烧进去,但浪费了空间,而且如果程序里用了SPIFFS文件系统,可能会因为地址越界出问题。

所以第一步,先确认你手里板子的Flash容量。方法很简单:看背面Flash芯片的丝印。25Q40是512KB,25Q80是1MB,25Q16是2MB。如果丝印磨掉了看不清,那就用esptool连上之后执行esptool.py flash_id,它会直接告诉你Flash的厂商和容量。这个命令后面我会详细讲怎么用。

3. 引脚定义与接线:8个引脚到底怎么接

3.1 八个引脚的完整定义与功能说明

ESP-01/ESP-01s的8个引脚排列是2x4的,从上到下、从左到右分别是:

引脚位置名称功能说明
第一排第1脚GND接地
第一排第2脚GPIO2通用IO,启动时必须为高电平
第一排第3脚GPIO0通用IO,拉低进入下载模式,悬空或拉高为运行模式
第一排第4脚RX串口接收,接USB转TTL的TX
第二排第1脚VCC电源正极,3.3V
第二排第2脚CH_PD芯片使能,必须拉高才能工作
第二排第3脚RESET复位,低电平复位
第二排第4脚TX串口发送,接USB转TTL的RX

这里有几个关键点新手特别容易搞错。第一,VCC是3.3V,绝对不能接5V,接5V基本就是瞬间冒烟。第二,CH_PD必须接高电平,很多人忘了接这个脚,结果模块一点反应都没有,还以为板子坏了。第三,RX和TX是交叉连接的,模块的RX接转换器的TX,模块的TX接转换器的RX,这个和STM32串口通信是一样的道理。

3.2 烧录模式与运行模式的接线差异

烧录模式和运行模式的接线区别,核心就在GPIO0这一个脚上。烧录的时候,GPIO0必须接GND(拉低),然后给模块复位或者重新上电,模块就会进入下载模式。烧录完成后,把GPIO0断开(悬空或者接VCC),再复位一次,模块就进入正常运行模式,开始执行你烧进去的程序。

我自己的习惯是,在面包板上搭一个固定的烧录电路:VCC和CH_PD接3.3V,GND接地,GPIO0通过一个按钮开关选择接GND还是悬空,GPIO2直接接VCC(或者通过10K电阻上拉),RESET也接一个按钮到GND。这样烧录的时候按一下GPIO0的按钮再按一下RESET,就能进入下载模式;烧完之后松开GPIO0按钮再按RESET,就进入运行模式。这个电路搭一次,后面烧多少块板子都方便。

注意:ESP-01的GPIO2在启动时如果被拉低,模块会进入一种特殊的启动模式,导致程序不运行。所以GPIO2一定要确保高电平,最稳妥的做法是接一个10K电阻到VCC。

3.3 USB转TTL转换器的选择与接线实操

USB转TTL转换器市面上常见的有CH340、CP2102、FT232这几种芯片的方案。CH340最便宜,几块钱一个,但有些批次的驱动在Windows上不太好装,需要手动指定驱动。CP2102稳定性好一些,价格也就贵几块。FT232最稳,但价格偏高。我个人推荐用CP2102的方案,驱动兼容性好,基本插上就能用。

接线的时候,转换器的3.3V输出接到模块的VCC和CH_PD,GND接模块的GND,转换器的TX接模块的RX,转换器的RX接模块的TX。这里要特别注意:有些转换器上有3.3V和5V两个电源输出脚,一定要接3.3V那个。另外,转换器的3.3V输出电流能力有限,一般只有100mA左右,而ESP-01在发射Wi-Fi的时候瞬间电流能到300mA,所以烧录的时候最好用外部3.3V电源给模块供电,转换器的3.3V只用来给CH_PD提供使能信号。如果手头没有外部电源,至少要在VCC和GND之间并一个100uF以上的电解电容,缓解瞬间电流不足的问题。

4. Flash容量选择:选错就是白忙活

4.1 Flash容量与模块型号的对应关系

前面说了,ESP-01一般是1MB(8Mbit)Flash,ESP-01s一般是512KB(4Mbit)Flash。但这个规律不是绝对的,因为有些厂家会出一些特殊版本,比如ESP-01配512KB的也有,ESP-01s配1MB的也有。所以最靠谱的方法还是用esptool读一下。

在Arduino IDE里,Flash Size的选项在“工具”菜单下面,有“512KB (4Mbit)”、“1MB (8Mbit)”、“2MB (16Mbit)”、“4MB (32Mbit)”等选项。对于ESP-01s,选“512KB (4Mbit)”;对于ESP-01,选“1MB (8Mbit)”。如果你不确定,可以先选512KB烧一次试试,如果报错说空间不够,再换成1MB。

4.2 Flash布局与程序空间的实际计算

这里稍微展开讲一下Flash布局,理解了之后你就知道为什么容量选错会出问题了。ESP8266的Flash不是全部用来存程序的,它被划分成几个区域:程序代码区、OTA升级区、文件系统区、RF校准区等。以1MB Flash为例,典型的布局是这样的:

  • 0x00000 - 0x0FFFF:系统参数区,64KB
  • 0x10000 - 0x7FFFF:程序代码区,448KB
  • 0x80000 - 0xFBFFF:文件系统区,496KB
  • 0xFC000 - 0xFFFFF:RF校准区,16KB

如果你选了512KB的配置,程序代码区就只有大约256KB,稍微大一点的程序就放不下了。所以如果你写了一个带Web服务器、MQTT、JSON解析的程序,编译出来可能超过300KB,这时候就必须用1MB的Flash。反过来,如果你只是点个灯、读个传感器,512KB完全够用。

4.3 烧录地址与Flash Size的匹配原则

在Arduino IDE里烧录ESP-01的时候,Flash Size选错会导致两种典型错误。一种是编译时报“text section exceeds available space”,这个很明显,就是程序太大了。另一种更隐蔽:烧录成功,但模块不断重启,串口输出一堆乱码或者“rst cause:2, boot mode:(3,6)”之类的信息。这种情况往往是因为Flash Size选大了,程序被烧到了不存在的地址上,模块读不到正确的指令。

我的经验是,拿到一块新板子,先用esptool的flash_id命令确认容量,然后在Arduino IDE里严格按实际容量选择。如果实在懒得查,就统一选512KB,因为ESP-01s是主流,而且512KB的配置在1MB的板子上也能跑,只是浪费了一半空间而已。

5. 串口助手设置与74880波特率的来龙去脉

5.1 为什么是74880而不是115200

74880这个波特率,第一次看到的人都会觉得奇怪,为什么不是常见的9600、115200?其实这个数字和ESP8266的晶振频率有关。ESP8266的外部晶振是26MHz,芯片内部有一个分频器,在启动阶段,Bootloader使用的波特率是26MHz除以某个分频系数得到的。具体来说,26MHz / 348 = 74712.6,约等于74880。所以74880是ESP8266 Bootloader的默认波特率,用来输出启动日志。

那为什么我们平时烧录和通信都用115200呢?因为115200是应用程序里设置的波特率,Bootloader跑完之后,控制权交给应用程序,应用程序会把串口波特率改成115200(或者你代码里设置的其他值)。所以你会看到这样一个现象:模块刚上电的时候,串口助手如果设成115200,输出的启动日志是乱码;如果设成74880,启动日志就正常显示,但应用程序的输出又变成乱码了。

5.2 启动日志的读取与乱码排查

启动日志对调试非常重要,它能告诉你模块的Flash容量、启动模式、复位原因等信息。要看启动日志,就把串口助手的波特率设成74880,然后给模块复位。正常的启动日志大概长这样:

ets Jan 8 2013,rst cause:2, boot mode:(3,6) load 0x4010f000, len 1384, room 16 tail 8 chksum 0x2d csum 0x2d v3de0c112 ~ld

其中“rst cause”表示复位原因,2是外部复位,1是上电复位,4是看门狗复位。“boot mode”的第一个数字表示启动模式,3是Flash启动,1是下载模式。如果你看到boot mode是(1,x),说明GPIO0被拉低了,模块在下载模式,不会运行程序。

如果启动日志全是乱码,先检查波特率是不是74880,再检查晶振是不是26MHz(有些山寨模块用的是40MHz晶振,波特率就不对了)。如果波特率对了还是乱码,那可能是Flash里的程序损坏了,重新烧录一次就好。

5.3 串口助手的具体参数配置

我用的是SSCOM这个串口助手,配置很简单:波特率74880,数据位8,停止位1,校验位无,流控无。打开串口之前,先确认COM口选对了,可以在设备管理器里看一下转换器对应的COM号。打开串口后,按一下模块的RESET按钮,如果接线没问题,应该就能看到启动日志了。

烧录的时候,串口助手要先关掉,因为Arduino IDE或者esptool要占用串口。烧录完成后,再把串口助手打开,波特率改成74880看启动日志,或者改成115200看应用程序输出。这个切换过程有点繁琐,但习惯了就好。

提示:有些串口助手支持“波特率自适应”或者“多波特率同时监听”,但实测下来对74880的支持都不太好,还是手动切换最靠谱。

6. 完整烧录流程:从接线到程序运行

6.1 硬件连接检查清单

在开始烧录之前,按这个清单检查一遍接线:

  1. 转换器的3.3V接到模块的VCC和CH_PD
  2. 转换器的GND接到模块的GND
  3. 转换器的TX接到模块的RX
  4. 转换器的RX接到模块的TX
  5. GPIO0通过按钮或跳线接GND(烧录模式)
  6. GPIO2接VCC或通过10K电阻上拉
  7. VCC和GND之间并一个100uF电解电容
  8. 确认转换器输出的是3.3V不是5V

这个清单看起来简单,但每一步都有翻车的可能。我遇到过最离谱的一次是转换器的TX和RX丝印印反了,害我查了半天。所以如果接线检查了好几遍还是没反应,不妨把TX和RX对调一下试试。

6.2 Arduino IDE的环境配置与参数设置

打开Arduino IDE,在“文件”->“首选项”里,把“附加开发板管理器网址”填上http://arduino.esp8266.com/stable/package_esp8266com_index.json。然后在“工具”->“开发板”->“开发板管理器”里搜索“esp8266”,安装最新版本。安装完成后,在开发板列表里选择“Generic ESP8266 Module”。

接下来是参数设置,这是最容易出错的地方:

参数项推荐设置说明
Flash ModeDIOESP-01/01s都用DIO
Flash Size512KB (4Mbit) 或 1MB (8Mbit)按实际容量选
Debug portDisabled不用调试口
Debug LevelNone不用调试信息
lwIP Variantv2 Lower Memory省内存
VTablesFlash省RAM
CPU Frequency80MHz默认即可
Upload Speed115200烧录速度
Port转换器对应的COM口在设备管理器里查

Flash Mode一定要选DIO,不要选QIO。ESP-01/01s的Flash芯片只支持DIO模式,选QIO会烧录失败。Upload Speed如果115200不稳定,可以降到57600或者9600,虽然慢一点但更可靠。

6.3 烧录操作步骤与成功标志

参数设好之后,点“上传”按钮。Arduino IDE会先编译,编译完成后自动调用esptool进行烧录。烧录过程中,模块上的蓝色LED会快速闪烁,串口助手如果开着会看到一堆乱码(因为esptool用的波特率和串口助手不一样)。烧录成功的标志是IDE底部输出“Hash of data verified.”和“Leaving... Hard resetting via RTS pin...”。

如果烧录失败,常见的错误信息有:

  • “Failed to connect to ESP8266: Timed out waiting for packet header”:模块没进入下载模式,检查GPIO0是否拉低,RESET是否按了。
  • “Failed to write flash”:Flash容量选错了,或者Flash芯片坏了。
  • “Serial data stream stopped: Possible serial noise or corruption”:波特率太高或者电源不稳,降低Upload Speed试试。

烧录完成后,把GPIO0断开,按一下RESET,模块就进入运行模式了。这时候把串口助手设成74880,应该能看到启动日志;设成115200,应该能看到你程序里打印的输出。

7. 常见问题与排查技巧实录

7.1 烧录失败问题速查表

现象可能原因解决方法
串口助手无任何输出电源没接、CH_PD没拉高、TX/RX接反检查接线,确认CH_PD接3.3V
启动日志乱码波特率不对、晶振频率不对设成74880,检查晶振
烧录时报超时GPIO0没拉低、RESET没按拉低GPIO0后复位
烧录成功但程序不跑GPIO0还接着GND、Flash Size选错断开GPIO0,重新选Flash Size
模块不断重启电源电流不足、程序崩溃加电容,检查代码
串口输出“boot mode:(1,x)”GPIO0被拉低断开GPIO0,复位

7.2 电源问题的隐蔽表现与解决

电源问题是最难排查的,因为它的表现多种多样:有时候是烧录到一半失败,有时候是程序跑几秒就重启,有时候是Wi-Fi连不上。根本原因都是ESP-01在发射Wi-Fi的时候瞬间电流能到300mA,而USB转TTL的3.3V输出通常只有100mA。解决办法很简单:用一个独立的3.3V稳压模块给模块供电,比如AMS1117-3.3,输入接5V,输出接模块的VCC和CH_PD。如果手头没有稳压模块,至少在VCC和GND之间并一个470uF的电解电容,能缓解大部分问题。

7.3 GPIO0与GPIO2的启动模式陷阱

ESP8266的启动模式由GPIO0、GPIO2、GPIO15三个引脚在上电时的电平决定。ESP-01/01s上没有引出GPIO15,它在板子内部已经下拉到GND了。所以只剩下GPIO0和GPIO2。启动模式的真值表是这样的:

GPIO0GPIO2启动模式
Flash启动(正常运行)
下载模式(烧录)
无效模式(不运行)
下载模式

所以GPIO2必须为高,GPIO0根据需要选择高或低。ESP-01s内部已经给GPIO0和GPIO2加了上拉电阻,所以悬空就是高电平。ESP-01没有内部上拉,必须外部接电阻上拉,否则可能随机进入无效模式。

7.4 烧录后的首次运行验证

烧录完成后,第一次运行建议先烧一个最简单的Blink程序,确认模块能正常工作。Blink程序里加上串口输出,这样既能看LED闪烁,又能看串口打印。如果LED闪了但串口没输出,检查串口波特率是不是115200;如果串口有输出但LED不闪,检查GPIO1(TX)和GPIO2的配置,因为ESP-01的LED通常接在GPIO1或GPIO2上,而GPIO1同时也是TX,如果串口占用了GPIO1,LED可能就不亮了。

8. 几个容易被忽略的实操细节

8.1 烧录时的复位时序

esptool在烧录开始前会自动控制RTS和DTR引脚来复位模块并进入下载模式。但有些USB转TTL转换器没有引出RTS和DTR,或者引出了但没接到模块的RESET和GPIO0上。这种情况下就需要手动复位:先按住GPIO0的按钮(拉低),再按一下RESET按钮,然后松开RESET,最后松开GPIO0。这个时序很重要,顺序错了就进不了下载模式。

8.2 Flash擦除的时机与影响

有时候烧录失败是因为Flash里有旧程序在干扰。这时候可以在烧录前先执行一次全片擦除。在Arduino IDE里没有直接的擦除按钮,但可以用esptool命令行:esptool.py --port COM3 erase_flash。擦除后Flash全变成0xFF,再烧录就干净了。不过擦除会清掉Wi-Fi配置等保存的数据,所以不是必须的话不用每次都擦。

8.3 不同批次模块的兼容性差异

ESP-01/01s的厂家很多,不同批次的Flash芯片、晶振、PCB布局都有差异。我遇到过一批模块,Flash芯片是GD25Q40,用Arduino IDE默认的DIO模式烧录总是失败,后来改成DOUT模式才成功。所以如果你按标准配置烧录失败,不妨试试把Flash Mode从DIO改成DOUT,或者把Upload Speed降到9600,往往能解决一些莫名其妙的兼容性问题。

8.4 串口助手与烧录工具的串口冲突

Arduino IDE和串口助手不能同时占用同一个COM口。烧录的时候必须关掉串口助手,否则IDE会报“COM口被占用”。反过来,烧录完成后如果串口助手打不开,检查一下IDE的串口监视器是不是还开着。这个冲突很基础,但新手经常忘,然后以为是硬件问题。

9. 从点灯到联网:烧录成功后的下一步

烧录成功只是第一步,接下来你要让ESP-01连上Wi-Fi、连上云平台、实现远程控制。这里简单提一下点灯科技(Blinker)的实例,因为这是很多新手入门的第一个项目。点灯科技的库可以通过Arduino库管理器安装,安装后在示例里找到Blinker的ESP8266示例,把Wi-Fi名称、密码和设备密钥填进去,烧录到ESP-01上,手机装个点灯科技的APP,就能远程控制GPIO了。

不过要注意,点灯科技的库比较大,编译出来可能超过512KB,所以如果你用的是ESP-01s(512KB Flash),可能需要选“1MB (8Mbit)”的Flash Size,或者用“Basic”示例而不是“Full”示例。这个坑我踩过,编译时报“text section exceeds available space”,换成Basic示例就好了。

10. 我个人的几条经验总结

玩ESP-01/01s这些年,最大的体会就是:硬件问题90%出在电源和接线上,软件问题90%出在Flash Size和波特率上。把这两块搞明白了,剩下的就是写代码的事了。另外,不要贪便宜买那种几块钱一套的转换器加模块套装,转换器的质量直接影响烧录成功率,多花十块钱买个CP2102方案的转换器,能省下好几个小时的排查时间。

还有一点,ESP-01/01s的GPIO数量很少,能用的就GPIO0、GPIO2、GPIO1(TX)、GPIO3(RX)这四个,其中GPIO1和GPIO3还被串口占了。所以如果你要做复杂一点的项目,比如同时接传感器和继电器,GPIO可能不够用。这时候可以考虑用ESP-12F或者ESP32,引脚多、性能强,价格也就贵几块钱。ESP-01/01s适合那种只需要一个IO的简单场景,比如控制一个继电器或者读一个DHT11。

最后分享一个小技巧:如果你经常烧录ESP-01/01s,可以做一个专用的烧录底座,用弹簧针或者排母把8个引脚固定好,GPIO0和RESET各接一个按钮,VCC和GND接好电源和电容。这样每次烧录只需要把模块往底座上一插,按两下按钮就行,比用杜邦线一根根接快多了,也不容易接错。这个底座我做了三个,分别放在家里、工作室和车上,随时都能烧录调试。

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

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

立即咨询