ARTICLE DETAIL

资讯详情

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

ESP32烧录原理与Flash Download Tool深度实战

ESP32烧录原理与Flash Download Tool深度实战 1. 为什么我坚持用Flash Download Tool而不是Arduino IDE一键烧录在ESP32开发的前三年我几乎全靠Arduino IDE那个绿色的“上传”按钮——点一下等几秒串口监视器里跳出“Hello World”心里踏实。直到去年做一款带OTA升级和多分区OTA镜像的智能灌溉控制器连续七次烧录失败最后一次甚至把芯片的eFuse锁死整块开发板直接报废。拆开看不是代码问题是IDE底层调用的esptool.py在处理分区表偏移、flash模式匹配和加密密钥注入时对ESP32-WROVER-B模组的PSRAM初始化时序判断失误导致固件写入到错误地址段。那一刻我才真正意识到烧录不是“上传”而是对芯片存储空间的一次外科手术式精准投送。Flash Download Tool官方名称为Espressif Flash Download Tool不是替代工具它是Espressif原厂为量产和深度调试场景设计的底层烧录引擎。它绕过了Arduino或PlatformIO封装层的所有抽象逻辑直接与ESP32的ROM bootloader通信暴露所有关键参数flash size、flash modeDIO/QIO/OPI、flash frequency40MHz/80MHz、boot modedownload/boot from SPI flash、以及最关键的——每个bin文件的绝对烧录地址。这些参数在Arduino IDE里被默认隐藏而恰恰是它们决定了固件能否在特定硬件上稳定启动。比如你用ESP32-S3-DevKitC-1开发板它的flash是2MB但默认分区表只分配了1.5MB给app剩下512KB留给ota_data和nvs。如果你用Arduino IDE烧录一个编译后大小为1.6MB的固件IDE会静默截断或报错但不会告诉你具体哪一段被丢弃而Flash Download Tool会在烧录前就校验bin文件大小与目标地址空间是否冲突并弹出明确提示“0x10000地址段空间不足当前bin需1678232字节可用空间仅1572864字节”。这种“提前预警”能力在量产阶段能避免整批设备变砖。更实际的是兼容性。我手头有六种ESP32模组ESP32-WROOM-32、ESP32-S2-Saola-1、ESP32-C3-DevKitM-1、ESP32-S3-DevKitC-1、ESP32-PICO-D4还有客户定制的ESP32-WROVER-E。它们的flash引脚定义、PSRAM使能方式、USB-to-Serial芯片型号CH340/CP2102/FTDI各不相同。Arduino IDE的串口自动识别经常误判尤其在Windows下频繁出现“COM3被占用”或“无法打开端口”的假死状态而Flash Download Tool的串口选择是纯手动列表支持指定波特率115200/921600、数据位8、停止位1、校验位None还能强制重置芯片进入下载模式——哪怕你的USB转串口芯片驱动完全崩溃只要按住GPIO0再上电Tool就能捕获到下载信号。所以这不是“要不要用”的问题而是“什么时候必须用”的问题。当你遇到以下任一情况Flash Download Tool就是唯一解烧录后设备反复重启串口输出显示Invalid header: 0xXXXXXXOTA升级失败新固件无法触发切换使用自定义分区表如增加factory_app、test_app、storage两个独立分区需要烧录加密固件需要配合espsecure.py生成key并注入调试bootloader行为比如修改app_main()入口地址或验证签名机制。它不是给初学者准备的玩具而是给真正要让设备跑进千家万户的工程师准备的手术刀。接下来我会带你从零开始把这把刀磨得锋利、用得精准。2. 工具链安装与环境校验避开Windows驱动和Mac权限两大深坑很多人卡在第一步——工具根本打不开或者打开后串口列表为空。这不是软件问题是操作系统底层权限和驱动链路没打通。我见过太多人花三天时间折腾CH340驱动最后发现只是Win10系统更新后自动禁用了未签名驱动加载。下面是我实测验证过的、覆盖Windows 10/11、macOS Monterey/Ventura、Ubuntu 22.04的完整校验流程每一步都附带“为什么必须这么做”的底层原理。2.1 Windows平台驱动安装不是终点而是起点首先明确一点Flash Download Tool本身不需要安装解压即用。但它的运行依赖两个前置条件Java JRE 8 和 USB-to-Serial芯片驱动。很多人以为装了CH340驱动就万事大吉其实漏掉了最关键一环——驱动签名强制策略。在Windows 10 1809及以后版本默认启用“驱动程序强制签名”Driver Signature Enforcement。CH340官方驱动v3.5.2021.1是未签名驱动系统会拒绝加载。解决方案不是关掉签名验证那会带来安全风险而是手动导入微软认证的第三方签名证书。实操步骤如下下载最新版CH340驱动官网wch.cn/download/CH341SER_EXE.html解压后不要双击安装右键“此电脑”→“管理”→“设备管理器”展开“端口COM和LPT”找到带黄色感叹号的“USB-SERIAL CH340 (COMx)”右键该设备→“更新驱动程序”→“浏览我的计算机以查找驱动程序”→“让我从计算机上的可用驱动程序列表中挑选”勾选“显示兼容硬件”在厂商列表中选择“WCH”型号选择“USB-SERIAL CH340”点击“下一步”此时系统会弹出“Windows无法验证此驱动程序的数字签名”警告务必点击“始终安装此驱动程序”——这是微软允许的临时绕过机制仅对本次安装生效。提示如果上述步骤失败请检查BIOS中是否启用了Secure Boot。部分品牌机如联想ThinkPad默认开启需进入BIOS开机按F1/F2/Del将Secure Boot设为Disabled保存重启后再试。这不是降级安全而是让系统接受合法的第三方驱动签名链。验证是否成功打开设备管理器确认COM端口名称变为“USB-SERIAL CH340 (COMx)”且无感叹号在命令行输入mode COMxx替换为你的真实端口号应返回类似串行端口 COM3:的响应。若返回“拒绝访问”说明端口被其他程序如Arduino IDE串口监视器、Putty、VS Code Serial Monitor占用需全部关闭。2.2 macOS平台权限不是玄学是Gatekeeper的硬性规则macOS对未签名应用的拦截比Windows更严格。Flash Download Tool的macOS版.dmg格式下载后双击拖入Applications文件夹首次打开时会弹出“已损坏无法打开”的红色警告。这不是文件损坏而是Apple的Gatekeeper机制在起作用。正确解法分三步打开“访达”→顶部菜单栏“前往”→“前往文件夹”输入/Applications定位到Flash Download Tool.app右键该App→“显示简介”在底部勾选“通用”里的“锁定”选项防止系统自动删除打开“终端”执行以下命令sudo xattr -rd com.apple.quarantine /Applications/Flash\ Download\ Tool.app输入管理员密码后回车。这条命令的作用是清除macOS为下载文件自动添加的隔离属性quarantine flag相当于告诉系统“这个App是我亲手放进来的信得过”。注意不要用“右键打开”绕过——那是临时豁免下次启动仍会拦截。必须用xattr命令永久清除隔离属性否则Tool每次启动都会卡在白屏。验证双击App应正常启动界面在界面上方菜单栏点击“Flash Download Tool”→“About Flash Download Tool”版本号应显示为v3.12.2截至2024年7月最新版。若版本号为空或显示“无法检查更新”说明Java环境未就绪需单独安装Adoptium Temurin JDK 11官网adoptium.net。2.3 Linux平台udev规则决定你能不能看到/dev/ttyUSBxUbuntu/Debian系发行版默认不赋予普通用户访问串口设备的权限。即使你插上ESP32开发板ls /dev/ttyUSB*可能返回空或者sudo chmod 666 /dev/ttyUSB0能临时解决但重启后失效。根治方法是配置udev规则在终端执行lsusb | grep -i ch340或lsusb | grep -i cp210确认USB转串口芯片型号CH340对应ID 1a86:7523CP210x对应10c4:ea60创建规则文件sudo nano /etc/udev/rules.d/99-esp32.rules根据芯片型号粘贴对应内容对于CH340SUBSYSTEMtty, ATTRS{idVendor}1a86, ATTRS{idProduct}7523, MODE0666, GROUPdialout对于CP2102SUBSYSTEMtty, ATTRS{idVendor}10c4, ATTRS{idProduct}ea60, MODE0666, GROUPdialout保存退出执行sudo udevadm control --reload-rules sudo udevadm trigger将当前用户加入dialout组sudo usermod -a -G dialout $USER然后完全退出当前会话并重新登录不是重启是注销再登录。验证插拔开发板执行ls -l /dev/ttyUSB*应看到类似crw-rw---- 1 root dialout 188, 0 Jul 15 10:20 /dev/ttyUSB0的输出其中dialout组名和rw权限证明规则生效。这三套校验流程我已在27台不同配置的开发机上实测通过。记住烧录失败的80%原因不在固件本身而在工具链与操作系统的握手环节。跳过校验直接烧录就像没检查刹车就上高速——表面顺利实则危险。3. 四个核心参数的物理意义与错误配置的灾难性后果Flash Download Tool界面看似简单只有四个地址栏Bootloader、Partition Table、App0、App1和一堆下拉选项但每个字段背后都是ESP32芯片存储架构的硬性约束。我曾因一个参数填错导致200台设备在产线上集体变砖返工成本超3万元。下面逐个拆解这四个参数的物理本质、常见错误及修复逻辑。3.1 Flash Size不是容量而是寻址空间的“地图比例尺”在Tool的“SPI Flash”区域“Flash Size”下拉菜单里有4MB、2MB、1MB、512KB等选项。新手常误以为这是你买的flash芯片真实容量其实它是bootloader用来计算地址偏移的缩放因子。ESP32的ROM bootloader在启动时会读取flash首地址0x0000处的magic number然后根据这个值确定整个flash空间的“页大小”和“扇区数量”。如果实际flash是4MB0x000000–0x3FFFFF但你在Tool里选了2MBbootloader就会认为地址0x200000之后全是无效空间当它尝试加载存放在0x210000的app固件时直接触发Load Prog Bin Error异常重启。更隐蔽的错误是“混合使用”。比如你用ESP32-WROOM-32模组标配4MB flash但为了节省成本采购了二手2MB flash芯片焊接上去。此时必须同时做两件事在Tool里将Flash Size设为2MB在ESP-IDF项目中修改sdkconfig文件将CONFIG_ESPTOOLPY_FLASHSIZE2MB并重新编译固件。否则会出现“烧录成功但无法启动”的诡异现象Tool显示绿色进度条走完串口却无任何输出。因为bootloader按2MB解析分区表但固件编译时按4MB布局分区表里app分区的起始地址0x10000在2MB空间内是合法的可实际固件二进制数据被写到了0x1000004MB下的标准地址而2MB flash的0x100000地址早已超出物理边界读出来全是0xFF自然无法执行。实测技巧如何快速确认flash真实容量用esptool.py命令行检测esptool.py --port /dev/ttyUSB0 flash_id返回结果中的Manufacturer: c8GD或Manufacturer: efWinbond是flash芯片厂商再查其Datasheet即可确认容量。比凭经验猜测可靠一万倍。3.2 Flash ModeDIO/QIO/OPI——总线宽度决定数据吞吐生死线“Flash Mode”选项DIO/QIO/OPI控制ESP32与flash芯片之间的数据传输协议。它不是性能优化选项而是硬件电路连接方式的映射声明。QIOQuad I/O最常用模式使用4根IO线IO6-IO7, IO8-IO9同时传输数据理论带宽最高DIODual I/O使用2根IO线IO6-IO7带宽减半但兼容性更好OPIOctal I/O需ESP32-S3及以上芯片支持使用8根IO线带宽翻倍。错误配置的典型症状是“烧录成功但启动卡死”。比如你的开发板硬件设计是QIO模式flash芯片的WP和HD引脚接地但Tool里误选DIO。bootloader会尝试用DIO时序读取flash由于物理线路不支持DIO协议读出来的数据全是乱码校验失败后无限重启。修复方法不是改Tool设置而是检查硬件原理图若flash芯片的WP#Write Protect和HOLD#引脚均接地则必须用QIO若WP#接VCC、HOLD#接地则只能用DIOOPI模式要求flash芯片支持Octal DDR且ESP32芯片引脚复用配置正确如ESP32-S3的IO12-IO19需配置为OPI功能。关键经验永远以硬件设计为准不要相信模组标签。我拆过一批标称“QIO”的ESP32-WROVER-B模组实际PCB上WP引脚悬空必须设为DIO才能稳定启动。用万用表量WP引脚对地电阻1kΩ为接地1MΩ为悬空这是最可靠的判断依据。3.3 Flash Frequency40MHz/80MHz——时钟频率是信号完整性的临界点“Flash Frequency”设置40MHz/80MHz指SPI clock速率。它与Flash Mode共同决定数据传输稳定性。80MHz虽快但对PCB走线长度、阻抗匹配、电源纹波极其敏感。我在做一款工业级温湿度传感器时原型板用80MHz烧录一切正常但量产PCB因散热考虑加长了flash到ESP32的走线8cm烧录后设备在-10℃环境下频繁死机。示波器抓取SPI CLK信号发现80MHz时钟边沿已严重过冲和振铃导致flash芯片采样错误。解决方案是降频将Tool中Flash Frequency从80MHz改为40MHz同时在ESP-IDF项目中修改sdkconfig设置CONFIG_ESPTOOLPY_FLASHFREQ_40My重新编译固件。注意降频必须软硬协同。只改Tool设置固件仍按80MHz编译bootloader会尝试用80MHz时序读取依然失败只改固件编译参数Tool用80MHz烧录flash芯片可能因过载损坏。验证方法烧录后用esptool.py --port /dev/ttyUSB0 read_flash 0x0 0x1000 flash_dump.bin读取flash首4KB用hex编辑器查看前16字节。正常QIO/40MHz的magic header应为E9 03 00 00 00 00 00 00 ...若出现大量FF FF FF FF说明读取失败需立即降频。3.4 Boot ModeDownload/Boot from SPI Flash——启动模式决定你能否进入“手术室”“Boot Mode”下拉菜单只有两个选项Download和Boot from SPI Flash。这看起来像开关实则是芯片复位后执行的第一条指令的分支选择。Download强制芯片进入UART下载模式忽略flash内容等待PC发送固件Boot from SPI Flash正常启动模式从flash地址0x0000读取bootloader并执行。新手最大误区是烧录时选Download烧录完成后忘记切回Boot from SPI Flash结果设备上电后仍在等串口数据表现为“绿灯常亮、无任何串口输出”。更致命的是量产场景。某客户要求设备支持“按键强制进入下载模式”我们设计了GPIO0外接按键。但Tool烧录界面里Boot Mode始终设为Download导致产线工人误操作——本该烧录完直接测试却因Mode未切回设备永远卡在下载态测试工位报警灯狂闪。正确做法烧录前确保Boot Mode为DownloadTool会自动拉低GPIO0烧录完成后立即点击Tool界面上方的“Start”按钮右侧小箭头选择“Boot from SPI Flash”再点击“Start”此时Tool会发送复位指令芯片退出下载模式从flash启动。终极保险在固件中实现“双启动”逻辑。例如在app_main()开头加入if (gpio_get_level(GPIO_NUM_0) 0) { // GPIO0接地 esp_restart(); // 强制重启进入下载模式 }这样即使Tool设置错误长按开发板上的BOOT键通常连GPIO0也能手动触发下载。这四个参数不是孤立选项而是相互制约的物理系统。改一个必查其余三个。把它们当成ESP32的“DNA序列”错一位整个生命体就无法表达。4. 分区表Partition Table的实战配置与内存泄漏陷阱烧录失败的第二大根源不是flash参数而是分区表Partition Table配置错误。很多教程教你复制一个partitions.csv文件就完事却没人告诉你分区表不是静态配置文件而是动态内存管理的契约书。我曾因分区表里一行nvs, data, nvs, 0x9000, 0x6000的size写错导致设备运行72小时后WiFi连接突然中断日志显示nvs_open failed: ESP_ERR_NVS_NOT_FOUND——NVSNon-Volatile Storage分区被写满但固件还在拼命往里存WiFi密码。4.1 分区表的物理结构从CSV到二进制的不可逆转换ESP32的分区表是一个固定大小0x2000字节8KB的二进制区域位于flash地址0x8000默认。它由多个16字节的条目组成每个条目包含type1字节0x01data, 0x00app, 0x02ota, 0x04nvssubType1字节data子类型0x02nvs, 0x01otadataoffset4字节该分区起始地址如0x00009000size4字节该分区大小如0x0000600024KBlabel8字节ASCII字符串如nvs。关键点在于CSV文件只是人类可读的文本描述真正烧录到flash的是二进制格式。Tool在烧录时会调用gen_esp32part.py脚本将CSV编译成二进制再写入0x8000地址。如果CSV里size写成0x6000但实际flash剩余空间不足24KB编译脚本不会报错而是静默截断——导致分区表末尾被破坏后续所有分区地址错位。实操验证方法编写partitions.csv内容如下# Name, Type, SubType, Offset, Size, Flags nvs, data, nvs, 0x9000, 0x6000, otadata, data, otadata, 0xf000, 0x2000, factory, app, factory, 0x10000, 0x100000, storage, data, spiffs, 0x110000, 0x300000,在ESP-IDF目录下执行python $IDF_PATH/components/partition_table/gen_esp32part.py partitions.csv partitions.bin用xxd partitions.bin | head -n 10查看二进制头确认00000000: e903 0000 0000 0000 0000 0000 0000 0000magic header存在且每个条目offset/size与CSV一致。4.2 OTA分区的致命陷阱otadata大小必须为0x2000OTAOver-The-Air升级依赖otadata分区存储当前active app的索引。这个分区大小必须严格为0x20008KB且必须位于flash末尾附近如0xf000。原因在于ESP-IDF的ota_ops.c源码中硬编码了otadata的size为8KB#define OTA_DATA_SIZE 0x2000 static const uint32_t ota_data_size OTA_DATA_SIZE;如果在CSV里写成otadata, data, otadata, 0xf000, 0x10004KB烧录后OTA升级会失败日志显示esp_ota_begin failed: ESP_ERR_OTA_VALIDATE_FAILED。因为bootloader读取otadata时期望读取8KB数据进行CRC校验但只读到4KB校验值必然错误。修复方案永远用0x2000作为otadata size确保otadata offset size不超过flash总容量如4MB flash最大offset为0x3ff000在Tool烧录时必须将partitions.bin文件烧录到CSV中指定的offset如0x8000而非默认的0x8000——Tool会自动读取CSV里的offset字段。4.3 NVS分区的动态扩容从24KB到128KB的平滑演进NVS用于存储WiFi配置、设备ID、校准参数等关键数据。默认0x600024KB够用但当设备需要存储大量传感器历史数据如每分钟存一次温湿度保留30天24KB很快耗尽。扩容NVS不是简单改CSV里的size。NVS库在初始化时会扫描整个分区寻找空闲页页大小固定为4KB。如果分区size从24KB扩到128KB0x20000但旧固件仍按24KB扫描会遗漏后面104KB空间导致nvs_set_str返回ESP_ERR_NVS_NOT_ENOUGH_SPACE。正确扩容路径新固件中调用nvs_flash_init_partition(nvs)前先执行esp_err_t err nvs_flash_init_partition(nvs); if (err ESP_ERR_NVS_NO_FREE_PAGES || err ESP_ERR_NVS_NEW_VERSION_FOUND) { ESP_ERROR_CHECK(nvs_flash_erase_partition(nvs)); // 清空旧NVS ESP_ERROR_CHECK(nvs_flash_init_partition(nvs)); }在CSV中将nvs size改为0x20000重新编译烧录设备首次启动时会自动擦除整个NVS分区并重建后续写入即可使用全部128KB。避坑心得NVS擦除是阻塞操作耗时约200ms。若在WiFi连接回调里执行会导致连接超时。务必在app_main()开头、WiFi初始化前完成。4.4 自定义分区的实战案例为BLE Mesh预留专用存储区最近做的米家Mesh接入项目需要存储Mesh网络拓扑、节点密钥、组地址等数据这些数据量大且需频繁读写不能和WiFi配置混在同一个NVS里避免锁竞争。于是我们创建了独立分区mesh_nvs, data, nvs, 0x140000, 0x40000, mesh_storage, data, spiffs, 0x180000, 0x200000,关键点在于mesh_nvs的subType必须是nvs但label名任意不与系统nvs冲突即可初始化时用nvs_flash_init_partition(mesh_nvs)而非nvs_flash_init()读写时指定分区名nvs_open(mesh_nvs, NVS_READWRITE, handle)。这样WiFi配置和Mesh数据物理隔离互不影响。即使Mesh分区写满WiFi仍能正常工作。分区表不是配置清单而是内存疆域的划界碑。每一行都关乎设备能否长久存活。5. 烧录全流程实操从零开始烧录一个可联网的ESP32固件现在我们把前面所有知识点串联起来完成一次完整的、可验证的烧录流程。目标烧录一个基于ESP-IDF v5.1的WiFi Station固件让它连接家庭路由器并打印IP地址。整个过程不依赖Arduino IDE全部用Flash Download Tool和命令行完成确保每一步都可控、可复现。5.1 准备工作获取固件文件与硬件连接首先确认你的开发环境已安装ESP-IDF v5.1官网docs.espressif.com/projects/esp-idf/en/v5.1/并完成export.sh环境变量设置。然后克隆官方示例cd ~/esp git clone https://github.com/espressif/esp-idf.git cd esp-idf/examples/wifi/getting_started/station执行编译idf.py fullclean # 清理旧构建 idf.py set-target esp32 # 设置芯片型号 idf.py build # 编译编译完成后生成四个关键文件位于build/目录bootloader/bootloader.binbootloader固件地址0x1000partition_table/partition-table.bin分区表地址0x8000ota_data_initial.bin初始OTA数据地址0xf000firmware.bin主应用程序地址0x10000。提示firmware.bin是合并后的单一文件包含app和依赖的ROM code。若需分拆烧录如只更新app可用idf.py -p /dev/ttyUSB0 flash生成flash_args文件里面列出各文件地址。硬件连接ESP32开发板通过USB线连接电脑确认开发板上的BOOT按钮通常标为BOOT或IO0和RST按钮标为EN可触达不要连接任何外设如传感器、屏幕避免干扰串口通信。5.2 Flash Download Tool配置四步精准定位打开Flash Download Tool按顺序配置串口与波特率Port选择正确的COM端口Windows或/dev/ttyUSB0Linux/macOSBaudrate设为115200这是ESP32 ROM bootloader的默认速率921600需固件支持Flow ControlNone不启用流控。Flash参数Flash Size根据你的模组选择ESP32-WROOM-32选4MBFlash ModeQIO绝大多数开发板默认Flash Frequency40MHz兼容性优先Boot ModeDownload烧录前必须。固件文件导入点击“ADD”按钮四次依次添加bootloader.bin→ Address填0x1000partition-table.bin→ Address填0x8000ota_data_initial.bin→ Address填0xf000firmware.bin→ Address填0x10000。每次添加后Tool会自动计算文件大小并显示在Size列。高级选项“Download”区域勾选“Auto Download”自动下载模式“Config”区域勾选“Erase Flash Before Download”烧录前擦除整个flash——这是新手必选项避免旧固件残留干扰“SPI Speed”保持默认无需手动调整。注意Address必须与ESP-IDF编译时的链接脚本一致。可在build/config/sdkconfig中搜索CONFIG_PARTITION_TABLE_OFFSET确认分区表地址默认0x8000搜索CONFIG_BOOTLOADER_OFFSET_IN_FLASH确认bootloader地址默认0x1000。5.3 烧录执行三秒进入下载模式的手动同步法点击“Start”按钮前必须让ESP32芯片进入UART下载模式。自动模式Tool自动拉低GPIO0在某些USB转串口芯片上不可靠推荐手动同步法按住开发板上的BOOT按钮GPIO0接地不放按一下RST按钮EN引脚复位观察USB指示灯若闪烁一次后常亮说明已进入下载模式此时松开BOOT按钮立即点击Tool界面上的“Start”。Tool会显示绿色进度条依次烧录四个文件。总耗时约30秒。成功标志进度条走完状态栏显示“Download success”串口监视器如PuTTY打开同一端口波特率115200应看到类似输出I (0) cpu_start: Starting scheduler on PRO CPU. I (0) cpu_start: Starting scheduler on APP CPU. I (285) wifi:new:1,0, old:1,0, ap:255,255, sta:1,0, prof:1 I (455) wifi:state: init - auth (b0) I (465) wifi:state: auth - assoc (0) I (475) wifi:state: assoc - run (10) I (485) wifi:connected with YOUR_SSID, aid 1, channel 6, BW HT20, bssid xx:xx:xx:xx:xx:xx I (495) wifi:security: WPA2, phy: bgn, rssi: -45 I (495) wifi:pm start, type: 1 I (505) station: got ip:192.168.1.123, mask:255.255.255.0, gw:192.168.1.1如果卡在wifi:new:1,0说明WiFi连接失败检查main/station_example.c中SSID和密码是否正确如果无任何输出检查波特率是否为115200或尝试按RST按钮复位。5.4 验证与调试用esptool.py反向校验烧录结果烧录成功不等于固件正确。最可靠的验证是用esptool.py读取flash并比对# 读取bootloader区域 esptool.py --port /dev/ttyUSB0 read_flash 0x1000 0x10000 bootloader_read.bin # 读取app区域 esptool.py --port /dev/ttyUSB0 read_flash 0x10000 0x100000 app_read.bin # 与原始文件做二进制比对 cmp bootloader.bin bootloader_read.bin echo Bootloader OK || echo Bootloader MISMATCH cmp firmware.bin app_read.bin echo App OK
返回列表