我正在使用以下代码从Flash更新esp8266的固件:
RunBinary(const String& strFileName)
{
Debug("Flashing binary " + strFileName);
File file = SPIFFS.open(strFileName, "r");
uint32_t maxSketchSpace = (ESP.getFreeSketchSpace() - 0x1000) & 0xFFFFF000;
if (file)
{
if (!Update.begin(maxSketchSpace, U_FLASH))
{
Update.printError(Serial);
Debug("Failed to load the task binary");
}
else
{
while (file.available())
{
uint8_t ibuffer[128];
file.read((uint8_t *)ibuffer, 128);
Update.write(ibuffer, sizeof(ibuffer));
}
file.close();
if (Update.end(true))
{
Serial.println("Update Success" );
return true;
}
}
}
else
Serial.printf("Failed to open binary file");
Update.printError(Serial);
return false;
}
在上述返回true之后,我使用以下命令重新启动esp:
if (RunBinary("/Binary.bin") == true)
{
ESP.restart();
}
它随机运行,有时会启动新程序-但大多数情况下,它会带着一些垃圾返回
Flashing binary /Binary.bin
Update Success
?)²
ôDHB÷^HLlÿ
并永久挂起。
在哪里寻找原因?
SKETCH SIZE : 363264
FREE SKETCH SIZE: 2781184
APP START OFFSET: 1000
Sketch size: 363264
Free size: 2781184
Heap: 48056
Boot Vers: 31
CPU: 160MHz
SDK: 3.0.0-dev(c0f7b44)
Chip ID: 13586851
Flash ID: 1458400
Flash Size: 4194304
Vcc: 65535
在更新后进行编辑,我根据注释将串行速度更改为74880,这是输出
Flashing binary /Binary.bin
Update Success
@ŠZ-nPáM%ÌÍ %Y)Q
ãoxãÊN
ets Jan 8 2013,rst cause:2, boot mode:(3,6)
load 0x4010f000, len 1384, room 16
tail 8
chksum 0x2d
csum 0x2d
vffffffff
~ld
答案 0 :(得分:0)
rst cause:2
表示CPU由于“外部重置或从深度睡眠模式唤醒”而重新启动了
如果要加载的代码使用深度睡眠,或者如果您有任何连接到ESP8266复位引脚的代码,那将是查找问题的第一位。复位线可能被意外地保持为低电平。
如果不是,则另一个可能的原因是电源。 ESP8266有时会消耗大量电流,如果电源无法处理,可能会导致电压下降。这可能导致不稳定的崩溃,重启后报告为rst cause: 2
。
如果您有设备可以在更新后监视电压和电流,则可以尝试-您可能会看到电流尖峰或电压下降。
如果没有,您可以将其连接至更高电流的电源(例如稳压电源)-尝试使用至少3.3V,500mA的电流-您可能需要更多电流,具体取决于电路中使用的其他硬件。
如果这样做的话,也有可能在VCC和GND之间增加一个大电容(也许是470µF或类似的电容),可以使电源平滑。我也看到过建议在VCC和GND之间额外增加一个0.1pF的去耦电容,该电容应在物理上尽可能靠近ESP8266。
最后一种可能性不同-ESP8266中存在一个错误,该错误会导致在串行固件更新后OTA更新失败。串行更新解决此问题后,发出硬件重置。我认为您不会因为这个问题而看到rst cause:2
,但极有可能是造成您悲伤的原因。您可以在https://github.com/esp8266/Arduino/issues/2478
您可以在ESP8266 Reset Causes and Common Fatal Exception Causes中找到有关重置原因的更多信息。