单片机
返回首页

ESP32-简单OTA升级

2025-09-10 来源:cnblogs

基于ESP-IDF4.1


  1 #include 'freertos/FreeRTOS.h'

  2 #include 'freertos/task.h'

  3 #include 'esp_system.h'

  4 #include 'esp_event.h'

  5 #include 'esp_log.h'

  6 #include 'esp_ota_ops.h'

  7 #include 'esp_http_client.h'

  8 #include 'esp_https_ota.h'

  9 #include 'protocol_examples_common.h'

 10 #include 'string.h'

 11 

 12 #include 'nvs.h'

 13 #include 'nvs_flash.h'

 14 #include 'protocol_examples_common.h'

 15 

 16 #if CONFIG_EXAMPLE_CONNECT_WIFI

 17 #include 'esp_wifi.h'

 18 #endif

 19 

 20 static const char *TAG = 'simple_ota_example';

 21 extern const uint8_t server_cert_pem_start[] asm('_binary_ca_cert_pem_start');

 22 extern const uint8_t server_cert_pem_end[] asm('_binary_ca_cert_pem_end');

 23 

 24 #define OTA_URL_SIZE 256 

 25 

 26 //http事件处理程序

 27 esp_err_t _http_event_handler(esp_http_client_event_t *evt)

 28 {

 29     switch (evt->event_id) {

 30     case HTTP_EVENT_ERROR:

 31         ESP_LOGD(TAG, 'HTTP_EVENT_ERROR');

 32         break;

 33     case HTTP_EVENT_ON_CONNECTED:

 34         ESP_LOGD(TAG, 'HTTP_EVENT_ON_CONNECTED');

 35         break;

 36     case HTTP_EVENT_HEADER_SENT:

 37         ESP_LOGD(TAG, 'HTTP_EVENT_HEADER_SENT');

 38         break;

 39     case HTTP_EVENT_ON_HEADER:

 40         ESP_LOGD(TAG, 'HTTP_EVENT_ON_HEADER, key=%s, value=%s', evt->header_key, evt->header_value);

 41         break;

 42     case HTTP_EVENT_ON_DATA:

 43         ESP_LOGD(TAG, 'HTTP_EVENT_ON_DATA, len=%d', evt->data_len);

 44         break;

 45     case HTTP_EVENT_ON_FINISH:

 46         ESP_LOGD(TAG, 'HTTP_EVENT_ON_FINISH');

 47         break;

 48     case HTTP_EVENT_DISCONNECTED:

 49         ESP_LOGD(TAG, 'HTTP_EVENT_DISCONNECTED');

 50         break;

 51     }

 52     return ESP_OK;

 53 }

 54 

 55 //OTA任务

 56 void simple_ota_example_task(void *pvParameter)

 57 {

 58     ESP_LOGI(TAG, 'Starting OTA example');

 59 

 60     esp_http_client_config_t config = {

 61         .url = CONFIG_EXAMPLE_FIRMWARE_UPGRADE_URL,

 62         .cert_pem = (char *)server_cert_pem_start,

 63         .event_handler = _http_event_handler,

 64     };

 65 

 66 #ifdef CONFIG_EXAMPLE_FIRMWARE_UPGRADE_URL_FROM_STDIN

 67     char url_buf[OTA_URL_SIZE];

 68     if (strcmp(config.url, 'FROM_STDIN') == 0) {

 69         example_configure_stdin_stdout();

 70         fgets(url_buf, OTA_URL_SIZE, stdin);

 71         int len = strlen(url_buf);

 72         url_buf[len - 1] = '';

 73         config.url = url_buf;

 74     } else {

 75         ESP_LOGE(TAG, 'Configuration mismatch: wrong firmware upgrade image url');

 76         abort();

 77     }

 78 #endif

 79 

 80 #ifdef CONFIG_EXAMPLE_SKIP_COMMON_NAME_CHECK

 81     config.skip_cert_common_name_check = true;

 82 #endif

 83 

 84     esp_err_t ret = esp_https_ota(&config);

 85     if (ret == ESP_OK) {

 86         esp_restart();

 87     } else {

 88         ESP_LOGE(TAG, 'Firmware upgrade failed');

 89     }

 90     while (1) {

 91         vTaskDelay(1000 / portTICK_PERIOD_MS);

 92     }

 93 }

 94 

 95 void app_main(void)

 96 {

 97     // 初始化非易失性存储

 98     esp_err_t err = nvs_flash_init();

 99     if (err == ESP_ERR_NVS_NO_FREE_PAGES || err == ESP_ERR_NVS_NEW_VERSION_FOUND) {

100         //1.OTA应用程序分区表的NVS分区大小比非OTA分区表小。这种大小不匹配可能导致NVS初始化失败.

101         //2.NVS分区包含新格式的数据,此版本的代码无法识别。如果发生这种情况,我们将擦除NVS分区并再次初始化NVS.

102         ESP_ERROR_CHECK(nvs_flash_erase());

103         err = nvs_flash_init();

104     }

105     ESP_ERROR_CHECK(err);

106 

107     ESP_ERROR_CHECK(esp_netif_init());

108     ESP_ERROR_CHECK(esp_event_loop_create_default());

109 

110     //连接网络

111     ESP_ERROR_CHECK(example_connect());

112 

113 #if CONFIG_EXAMPLE_CONNECT_WIFI

114     //确保禁用低功耗模式,这样可以提供最佳的吞吐量,从而为整个OTA操作节省时间

115     esp_wifi_set_ps(WIFI_PS_NONE);

116 #endif

117 

118     xTaskCreate(&simple_ota_example_task, 'ota_example_task', 8192, NULL, 5, NULL);

119 }


进入单片机查看更多内容>>
相关视频
  • 【TI MSPM0 应用实战】智能小车+工业角度编码器+血氧仪+烟雾探测器!硬核参考设计详解!

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

  • 直播回放: Microchip Timberwolf™ 音频处理器在线研讨会

  • 基于灵动MM32W0系列MCU的指夹血氧仪控制及OTA升级应用方案分享

精选电路图
  • 1瓦线性调频增强器

  • 1瓦四级调频发射机

  • 500W MOS场效应管电源逆变器,12V转110V/220V

  • 红外开关

  • LM317过压保护

  • 0-30V/20A 大功率稳压电源(采用LM338)

    相关电子头条文章