ESP32 启动引导程序

ESP32 launch bootloader

我有一块 ESP32 板 GPIO0 通过开关接地。我的想法是,如果我按下按钮并发出 ESP.restart(),电路板将进入闪光模式。 相反,ESP.restart() 只是重新启动应用程序,忽略 GPIO0 状态。

是否可以强制执行整个引导过程,也许可以使用直接 JMP 到硬件重置向量?

根据Ivan Grokhotkov

On ESP32 there are 3 reset reasons which cause strapping GPIOs to be sampled: power-on, RTC WDT reset, brownout reset.

所以在代码方面,见下文。如果引脚被绑住,它将永远不会脱离等待串行同步的引导加载程序。

#include "soc/rtc_wdt.h"
void hardReset() {  
  rtc_wdt_protect_off();      //Disable RTC WDT write protection
  //Set stage 0 to trigger a system reset after 1000ms
  rtc_wdt_set_length_of_reset_signal(RTC_WDT_SYS_RESET_SIG, RTC_WDT_LENGTH_3_2us);
  rtc_wdt_set_stage(RTC_WDT_STAGE0, RTC_WDT_STAGE_ACTION_RESET_SYSTEM);
  rtc_wdt_set_time(RTC_WDT_STAGE0, 10000);
  rtc_wdt_enable();           //Start the RTC WDT timer
  rtc_wdt_protect_on();       //Enable RTC WDT write protection
}

更好的解决方案是不使用固件更新模式以编程方式进行软件更新,仅将其用于引导加载程序更新。将您的代码分成两部分引导加载程序和逻辑程序部分。

要更新您的逻辑程序部分,您的引导加载程序应该处理烧录除引导加载程序之外的剩余地址。 (您的引导加载程序代码可以在微控制器上刻录任何地址,文件系统库可以做到这一点)所以不要尝试切换到可用于整个固件更新的固件更新模式。更高级的解决方案是尽可能使用 OTA 更新功能。

通过这种方式,您可以保证在现场始终拥有可启动设备,它已准备好更新任何损坏的逻辑部分。在现场烧录引导加载程序时的任何错误都可能导致您的设备运费。