ESP32 自定义实现OTA
- 一 相关头文件
- 二 OTA流程
- 三 初始化过程
- 四 OTA过程注意事项
一 相关头文件
//----------------------------// OTA
#include "esp_ota_ops.h"
#include "esp_app_format.h"
#include "esp_flash_partitions.h"
#include "esp_partition.h"
二 OTA流程
//第一步:启动OTA开始
configured = esp_ota_get_boot_partition();
running = esp_ota_get_running_partition();
update_partition = esp_ota_get_next_update_partition(NULL);
assert(update_partition != NULL);
err = esp_ota_begin(update_partition, OTA_WITH_SEQUENTIAL_WRITES, &update_handle);//第二步:写BIN文件
err = esp_ota_write(update_handle, (const void *)ota_buffer, pack_len);
if (err != ESP_OK)
{esp_ota_abort(update_handle);ESP_LOGI(GATTS_TABLE_TAG, "esp_ota_write error!");
}
//第三步:OTA完成收尾工作
err = esp_ota_end(update_handle);
if (err != ESP_OK)
{if (err == ESP_ERR_OTA_VALIDATE_FAILED){ESP_LOGE(TAG, "Image validation failed, image is corrupted");}else{ESP_LOGE(TAG, "esp_ota_end failed (%s)!", esp_err_to_name(err));}
}
err = esp_ota_set_boot_partition(update_partition);
if (err != ESP_OK)
{ESP_LOGE(TAG, "esp_ota_set_boot_partition failed (%s)!", esp_err_to_name(err));
}
//第四步:重启MCU
esp_restart();
三 初始化过程
void OTA_init(){uint8_t sha_256[HASH_LEN] = {0};esp_partition_t partition;// get sha256 digest for the partition tablepartition.address = ESP_PARTITION_TABLE_OFFSET;partition.size = ESP_PARTITION_TABLE_MAX_LEN;partition.type = ESP_PARTITION_TYPE_DATA;esp_partition_get_sha256(&partition, sha_256);print_sha256(sha_256, "SHA-256 for the partition table: ");// get sha256 digest for bootloaderpartition.address = ESP_BOOTLOADER_OFFSET;partition.size = ESP_PARTITION_TABLE_OFFSET;partition.type = ESP_PARTITION_TYPE_APP;esp_partition_get_sha256(&partition, sha_256);print_sha256(sha_256, "SHA-256 for bootloader: ");// get sha256 digest for running partitionesp_partition_get_sha256(esp_ota_get_running_partition(), sha_256);print_sha256(sha_256, "SHA-256 for current firmware: ");
}
四 OTA过程注意事项
第一: 必须初始化ESP32 的flash
第二:需要修改分区表,并进入menuconfig 使能自定义分区表,或者选择 APP+two OTA