3、急救前的准备工作:备份当前固件、准备救砖工具、下载官方分区表文件
说实话,我见过太多人一上来就急着刷机。结果刷到一半,串口断了,或者文件选错了。然后呢?砖了。这时候才想起来问:“我原来的固件呢?”——没了。所以这一章,咱们先把“后悔药”准备好。
急救前的准备工作,说白了就三件事:备份、备工具、备分区表。这三样齐了,你才有资格去碰那颗“砖头”。
3.1 备份当前固件——这是你最后的救命稻草
不管设备现在还能不能正常启动,只要它还能进烧录模式,第一件事就是备份。我个人习惯是:先备份,再动手。哪怕设备已经半死不活,只要串口还能输出信息,就有机会把固件拉出来。
核心原则:备份的固件必须包含完整的 Flash 内容,不仅仅是应用程序区。分区表、Bootloader、配置字,一个都不能少。
3.1.1 使用 esptool 备份(ESP32/ESP8266 系列)
如果你用的是 ESP 系列芯片,esptool 是标配。备份命令很简单:
# 读取整个 Flash,保存为 backup.bin
esptool.py --port COM3 --baud 115200 read_flash 0x0 0x400000 backup.bin
这里 0x400000 是 Flash 大小(4MB)。如果你的芯片是 2MB 或 16MB,记得改这个值。怎么知道大小?看芯片型号,或者直接读寄存器:
esptool.py --port COM3 flash_id
输出里会显示 Flash 容量。嗯,这一步别偷懒,我见过有人用 4MB 参数去读 16MB 的 Flash,结果只备份了四分之一,后面恢复时直接翻车。
3.1.2 使用 STM32 的备份方式(STM32 系列)
STM32 的情况稍微复杂一点。因为它的 Flash 通常分多个扇区,而且有读保护。我的做法是:
- 先用 STM32CubeProgrammer 连接设备,确认读保护等级(RDP)。
- 如果 RDP 是 0xAA(Level 0),直接读取全片 Flash。
- 如果 RDP 是 0xBB(Level 1),需要先解除读保护——但解除时会擦除全片!所以备份前一定要确认。
警告:解除 STM32 的读保护(Level 1 → Level 0)会触发全片擦除。如果你还没备份,千万别点“Remove Protection”。我曾经有个同事,一上来就点了解除保护,结果固件全没了,设备直接变砖——比原来还砖。
备份命令(STM32CubeProgrammer CLI):
STM32_Programmer_CLI.exe -c port=COM3 -r 0x08000000 0x100000 backup_stm32.bin
3.1.3 备份分区表本身
如果你不确定当前分区表是否损坏,但设备还能启动,建议单独把分区表区域读出来。以 ESP32 为例,分区表通常放在偏移 0x8000,大小 0x1000(4KB):
esptool.py --port COM3 read_flash 0x8000 0x1000 partition_table_backup.bin
这样即使后面刷错了,你手里还有一份原始分区表。我个人习惯把这个文件和全片备份放在同一个文件夹,命名加上日期,比如 backup_20250115_esp32.bin。别问我为什么强调日期——你一个月后面对一堆 backup.bin、backup2.bin、final_backup.bin 的时候,就知道后悔了。
3.2 准备救砖工具——工欲善其事,必先利其器
工具不对,努力白费。我列一个我常用的工具清单,你可以照着准备:
| 工具 | 用途 | 推荐版本 |
|---|---|---|
| esptool | ESP32/ESP8266 烧录与备份 | ≥ v4.0 |
| STM32CubeProgrammer | STM32 烧录与分区操作 | ≥ v2.12 |
| Putty / MobaXterm | 串口监视,查看启动日志 | 最新稳定版 |
| WinHex / HxD | 十六进制查看与编辑备份文件 | WinHex v20+ / HxD v2.5 |
| Python 3 | 运行 esptool 等脚本工具 | ≥ 3.8 |
| USB-TTL 转换器 | 串口通信硬件 | CH340G / CP2102 |
小提示:USB-TTL 转换器尽量选带 RTS/DTR 引脚的型号。因为很多芯片(比如 ESP32)需要硬件流控来自动进入下载模式。我手上有三四个不同牌子的转换器,最稳的还是 CP2102,从来没掉过链子。
3.3 下载官方分区表文件——别自己瞎编
分区表文件是救砖的核心。很多人喜欢自己写分区表,结果地址算错了,或者大小不对,刷进去直接不启动。我的建议是:能用官方的,就别自己写。
3.3.1 从哪里下载官方分区表
- ESP32:在 ESP-IDF 或 Arduino-ESP32 的 SDK 里,路径通常是
components/partition_table/。或者直接去 GitHub 仓库找partitions.csv示例文件。 - STM32:分区信息通常在 STM32CubeMX 生成的
.ioc文件里,或者参考芯片的 Reference Manual 里的 Flash 映射图。 - 其他芯片:去官网下载 SDK 包,里面一般都有默认的分区配置文件。
举个例子,ESP32 最常见的分区表(4MB Flash,出厂默认):
# ESP32 4MB 默认分区表 (partitions.csv)
# Name, Type, SubType, Offset, Size, Flags
nvs, data, nvs, 0x9000, 0x5000,
otadata, data, ota, 0xe000, 0x2000,
app0, app, ota_0, 0x10000, 0x1E0000,
app1, app, ota_1, 0x1F0000,0x1E0000,
spiffs, data, spiffs, 0x3D0000,0x30000,
这个文件就是你的“地图”。刷机时,必须保证烧录的固件和分区表匹配。否则,你想想看,固件写到 app0 位置,但分区表说 app0 在另一个地址——那肯定启动不了。
3.3.2 如何验证下载的分区表是正确的
下载后别急着用。先做两件事:
- 检查偏移和大小:用十六进制编辑器打开,确认每个分区的起始地址和长度是合理的。比如 app0 的偏移
0x10000,大小0x1E0000,加起来不能超过 Flash 总大小。 - 对比备份:如果你之前备份了原始分区表,用对比工具(比如 Beyond Compare)和官方文件比对一下。如果完全一致,那恭喜你,官方文件就是对的。如果有差异,说明你的设备可能用了定制分区表——这时候优先用备份文件。
注意:千万不要从百度网盘、论坛附件等不可信来源下载分区表文件。我遇到过有人从某个“技术论坛”下载了分区表,结果里面被植入了恶意代码,刷完后设备变成了矿机。官方渠道才是唯一可靠的。
3.4 本章知识体系总览
下面这张图把急救前的准备工作串起来了。你可以把它当作一个检查清单:
这三件事做完,你手里就有了“三张底牌”:一份完整的固件备份、一套趁手的工具、一份官方分区表。接下来不管遇到什么妖魔鬼怪,你都有退路。嗯,这才是急救该有的样子。