
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-01s2.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-01s512KB Flash去按1MB的配置烧录esptool可能会在写入过程中报“Failed to write flash”或者写完之后模块不断重启。反过来如果你拿ESP-011MB Flash按512KB配置烧虽然能烧进去但浪费了空间而且如果程序里用了SPIFFS文件系统可能会因为地址越界出问题。所以第一步先确认你手里板子的Flash容量。方法很简单看背面Flash芯片的丝印。25Q40是512KB25Q80是1MB25Q16是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.3VGND接地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_PDGND接模块的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一般是1MB8MbitFlashESP-01s一般是512KB4MbitFlash。但这个规律不是绝对的因为有些厂家会出一些特殊版本比如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系统参数区64KB0x10000 - 0x7FFFF程序代码区448KB0x80000 - 0xFBFFF文件系统区496KB0xFC000 - 0xFFFFFRF校准区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而不是11520074880这个波特率第一次看到的人都会觉得奇怪为什么不是常见的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 硬件连接检查清单在开始烧录之前按这个清单检查一遍接线转换器的3.3V接到模块的VCC和CH_PD转换器的GND接到模块的GND转换器的TX接到模块的RX转换器的RX接到模块的TXGPIO0通过按钮或跳线接GND烧录模式GPIO2接VCC或通过10K电阻上拉VCC和GND之间并一个100uF电解电容确认转换器输出的是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都用DIOFlash Size512KB (4Mbit) 或 1MB (8Mbit)按实际容量选Debug portDisabled不用调试口Debug LevelNone不用调试信息lwIP Variantv2 Lower Memory省内存VTablesFlash省RAMCPU 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不闪检查GPIO1TX和GPIO2的配置因为ESP-01的LED通常接在GPIO1或GPIO2上而GPIO1同时也是TX如果串口占用了GPIO1LED可能就不亮了。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-01s512KB 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、GPIO1TX、GPIO3RX这四个其中GPIO1和GPIO3还被串口占了。所以如果你要做复杂一点的项目比如同时接传感器和继电器GPIO可能不够用。这时候可以考虑用ESP-12F或者ESP32引脚多、性能强价格也就贵几块钱。ESP-01/01s适合那种只需要一个IO的简单场景比如控制一个继电器或者读一个DHT11。最后分享一个小技巧如果你经常烧录ESP-01/01s可以做一个专用的烧录底座用弹簧针或者排母把8个引脚固定好GPIO0和RESET各接一个按钮VCC和GND接好电源和电容。这样每次烧录只需要把模块往底座上一插按两下按钮就行比用杜邦线一根根接快多了也不容易接错。这个底座我做了三个分别放在家里、工作室和车上随时都能烧录调试。