序言
esp32的官方例程中提供了通過通過wifi連接網絡的OTA例程。例程雖然方便未必適用於所有情況,有時我們希望通過藍牙,串口,或者別的方式進行OTA操作。下面會對OTA相關的函數進行解析,是的開發者可以通過不同的方式繼續OTA。
OTA原理
簡單的來說:OTA的基本過程如下:
1、接收程序
2、寫入Flash
3、修改引導,使得下次開機的時候從新寫入的程序啟動。
esp32的具體實現中會一般有2個區域用來寫入程序。下圖是一個,OTA功能下程序在flash中的燒錄情況。詳細參見:https://blog.csdn.net/qq_24550925/article/details/85857351
圖1
綜上,從原理上來看只要能接收到數據,就可以進行OTA升級。而具體的數據來源可以是多種多樣的。
需要的相關配置
1、ota功能需要對分區表進行適當的划分,可以自行划分也可以使用官方已經提供好的典型划分方式。使用官方分區表的具體設置如下:
輸入make menuconfig 中:Partition Table -> Partition Table 選擇 Factory app, two OTA definitions。
2、需要確保flash空間充足並且被正確配置,根據自己的芯片情況進行選擇。官方典型的芯片為4M,以下是典型的配置方法:
輸入make menuconfig 中:Serial flasher config -> Flash size 選擇4 MB
OTA相關函數及程序流程
一下剖析的函數wifi升級中使用的OTA相關函數,具體的來說就是在esp-idf/components/esp_https_ota/src/esp_https_ota.c文件中,esp_https_ota(const esp_http_client_config_t *config)函數所使用的OTA函數。具體流程如下。其中可以通過接收完成后收尾工作中的2個函數返回值可以判斷升級是否成功。
#include "esp_ota_ops.h" //准備工作 esp_err_t err = ESP_OK; esp_ota_handle_t update_handle = 0; const esp_partition_t *update_partition = NULL; update_partition = esp_ota_get_next_update_partition(NULL); err = esp_ota_begin(update_partition, OTA_SIZE_UNKNOWN, &update_handle); //數據接收 while(接收數據中) { err = esp_ota_write( update_handle, (const void *)data, len); } //接收完成后收尾工作 err = esp_ota_end(update_handle); err = esp_ota_set_boot_partition(update_partition); //軟件復位 esp_restart();