升级固件
从一个NodeMCU版本升级(或降级!)固件到另一个NodeMCU版本有三个潜在问题:
-
为一个NodeMCU版本(如0.9.x)编写的Lua脚本在最新的固件上可能无法正常工作。例如,Espressif将操作更改为
socket:send
异步,即非阻塞。有关详细信息,请参阅API文档。 -
NodeMCU闪存文件系统可能需要重新格式化,特别是如果其地址已更改,因为新固件的大小与旧固件不同。如果它不是自动格式化,那么它应该是有效的,并且具有与闪光操作之前相同的内容。您仍然可以
file.format()
手动运行以重新格式化您的Flash文件系统。你会知道如果你需要这样做,如果你的闪存文件存在,但似乎是空的,或者是数据不能写入新文件。但是,这应该是一个例外情况。在大型闪存设备上格式化文件系统(例如,16MB部分)可能需要一些时间。所以,在第一次启动,你不应该担心,如果没有什么似乎发生一分钟。有一条消息打印到控制台,让你知道这一点。 -
Espressif SDK初始数据可能在每个NodeMCU固件版本之间变化,并且可能需要被擦除或重新刷新。有关详细信息,请参阅SDK Init Data(下面的这个部分)。在升级固件之前完全擦除模块将避免此问题。
SDK Init数据
注意
通常,NodeMCU将在需要时处理写入SDK初始化数据。大多数用户可以忽略此部分。
NodeMCU版本针对特定版本的Espressif SDK进行编译。SDK在闪存中保留用于存储校准和其他数据的空间。此数据在SDK版本之间更改,如果它无效或不存在,则固件可能无法正确引导。症状包括消息,例如rf_cal[0] !=0x05,is 0xFF
,无尽的重新启动循环和/或快速闪烁模块LED。
如果您遇到上述一种或多种症状,请确保您的芯片在闪烁前完全擦除,例如:
esptool.py --port <serial-port-of-ESP8266> erase_flash
还要验证您使用的是最新的NodeMCU版本,因为某些早期版本的NodeMCU 1.5.4.1没有将SDK初始化数据写入新擦除的芯片。
Espressif将该区域称为“系统参数”,并且它驻留在闪存的最后四个4kB扇区中。从SDK 1.5.4.1开始,第五个扇区保留用于RF校准(并且其位置由NodeMCU控制),如本补丁通知所述。至少,Espressif指出,从末端开始的第4个扇区需要用“init数据”闪存,而从末尾开始的第2个扇区应该为空白。
默认的init数据作为SDK文件中的一部分提供esp_init_data_default.bin
。如果扇区显示为空,则NodeMCU将在首次引导时自动将此文件闪存到正确的位置。
如果您需要自定义init数据,那么首先下载Espressif SDK 2.0.0并解压缩esp_init_data_default.bin
。然后闪存(flash)该文件就像你刷新固件那样。init数据的正确地址取决于闪存芯片的容量。
0x7c000
对于512 kB,像大多数ESP-01,-03,-07模块等0xfc000
对于1 MB,如ESP8285,PSF-A85,一些ESP-01,-03模块等。0x1fc000
为2 MB0x3fc000
为4 MB,模块如ESP-12E,NodeMCU devkit 1.0,WeMos D1 mini
有关初始数据地址和自定义的详细信息,请参见“ ESP8266入门指南 ”的“4.1非FOTA闪存映射”和“6.3 RF初始化配置” 。
确定闪存大小
要确定安装固件之前闪存芯片的容量,您可以运行
esptool.py --port <serial-port> flash_id
它将返回制造商ID和芯片ID,如:
Connecting...
Manufacturer: e0
Device: 4016
芯片ID可以在https://code.coreboot.org/p/flashrom/source/tree/HEAD/trunk/flashchips.h中查找。可查找到制造商名称和芯片型号名称/编号例如AMIC_A25LQ032
。然后,可以输入该信息到您最喜欢的搜索引擎中,以查找芯片说明和数据表。
按照规定,模块名称中的最后两位或三位表示容量(兆位)。因此,A25LQ032
在上面的示例中是一个32Mb(= 4MB)模块。