图文手把手教程--ESP32 OTA空中升级(VSCODE+IDF)

2023-05-16

本文内容

1)使用hello_world例程,编译生成hello_world.bin文件,并且开启HTTP本地服务器。

2)使用simple_ota_example例程,通过HTTP服务器访问hello_world.bin,进行OTA升级。

一、首先完成集成开发环境搭建:

图文手把手教程(史上最强):windows下ESP32集成开发环境搭建和HelloWorld显示(乐鑫官方推荐方法-使用VSCode安装ESP-IDF插件)

二、创建hello_world例程,编译生成hello_world.bin文件。

1)创建示例项目hello_world:VSCODE中->"查看"->”命令面板“->输入:Show Examples projects->选择Use current ESP-IDF(E:\ESP32-IDF\esp\esp-idf)->弹出示例ESP-IDF Examples,选择get-started->hello_world->Create project using example hello_world->选择示例保存的路径。

 例如:E:\ESP32-IDF\project-example,因ESP-IDF框架与示例是分离的,所以示例保存的路径可以随意,但需要注意:路径不能有中文和空格,否则报错。

创建完后,如下图所示。 

2)一字不改,编译、下载到ESP32开发板。

 打开串口监控,显示信息如下图所示,这里说明这个,是因为后面OTA后,显示的信息要和这个一样,才证明OTA成功。

 展开build,可以看到生成了hello_world.bin文件。

 三、hello_world例程中运行HTTP本地服务器。

1)编译链内Python 有一个内置的 HTTP 服务器,我们使用命令运行即可。

python -m http.server 8070

2)hello_world例程中运行HTTP本地服务器,输入上面的命令后按Enter,如下图所示。

 3)打开浏览器,输入地址,例如我自己的地址是:http://192.168.31.107:8070/

注意:地址的组成是IP地址+端口号(8070),IP地址是自己电脑的IPv4地址,每个人都不同。

 打开成功,VSCODE中会显示GET请求。

 4)进入build目录,可以看到hello_world.bin文件,点击可以正常下载。

 5)右键hello_world.bin,在弹出框中“复制链接地址”,后面的OTA会用到,例如我的是:http://192.168.31.107:8070/build/hello_world.bin

 注意:关闭hello_world例程,会将HTTP本地服务器也关闭,后续OTA升级需要重新打开。

四、创建simple_ota_example例程,并修改代码。

1)创建过程,按上面hello_world的来,这里不再详述。

 2)创建完后,如下图所示。

 3)一字不改,编译、下载到ESP32开发板。

首次下载,需要设置COM口,UART。

可以看到,代码什么也不修改,会提示wifi没有连接,如下图所示。

 4)增加wifi连接代码。

#include "freertos/event_groups.h"  //增加头文件
//wifi连上事件定义
static EventGroupHandle_t wifi_event_group;
const static int CONNECTED_BIT = BIT0;

//wifi事件处理
static esp_err_t wifi_event_handler(void *ctx, system_event_t *event)
{
    switch (event->event_id) {
        case SYSTEM_EVENT_STA_START:
            esp_wifi_connect();
            break;
        case SYSTEM_EVENT_STA_GOT_IP:
            xEventGroupSetBits(wifi_event_group, CONNECTED_BIT);

            break;
        case SYSTEM_EVENT_STA_DISCONNECTED:
            esp_wifi_connect();
            xEventGroupClearBits(wifi_event_group, CONNECTED_BIT);
            break;
        default:
            break;
    }
    return ESP_OK;
}

//wifi初始化
static void wifi_init(void)
{
    tcpip_adapter_init();
    wifi_event_group = xEventGroupCreate();
    ESP_ERROR_CHECK(esp_event_loop_init(wifi_event_handler, NULL));
    wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
    ESP_ERROR_CHECK(esp_wifi_init(&cfg));
    ESP_ERROR_CHECK(esp_wifi_set_storage(WIFI_STORAGE_RAM));
    wifi_config_t wifi_config = {
        .sta = {
            .ssid = "Xiaomi_tao",    //路由器wifi帐号
            .password = "123456", //路由器wifi密码
        },
    };
    ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA));
    ESP_ERROR_CHECK(esp_wifi_set_config(ESP_IF_WIFI_STA, &wifi_config));
    ESP_LOGI(TAG, "start the WIFI SSID:[%s]", wifi_config.sta.ssid);
    ESP_ERROR_CHECK(esp_wifi_start());
    ESP_LOGI(TAG, "Waiting for wifi");
    //等待wifi连上
    xEventGroupWaitBits(wifi_event_group, CONNECTED_BIT, false, true, portMAX_DELAY);
}

5)修改OTA任务函数--simple_ota_example_task(),将url改为自己本机IP地址。

//http客户端配置
    esp_http_client_config_t config = {
        //.url = CONFIG_EXAMPLE_FIRMWARE_UPGRADE_URL,  //注释掉
        .url = "http://192.168.31.107:8070/build/hello_world.bin",//增加
        .cert_pem = (char *)server_cert_pem_start,
        .event_handler = _http_event_handler,
        .keep_alive_enable = true,
#ifdef CONFIG_EXAMPLE_FIRMWARE_UPGRADE_BIND_IF
        .if_name = &ifr,
#endif
    };

6)修改app_main()函数。

void app_main(void)
{
    // Initialize NVS.
    esp_err_t err = nvs_flash_init();
    if (err == ESP_ERR_NVS_NO_FREE_PAGES || err == ESP_ERR_NVS_NEW_VERSION_FOUND) {
        // 1.OTA app partition table has a smaller NVS partition size than the non-OTA
        // partition table. This size mismatch may cause NVS initialization to fail.
        // 2.NVS partition contains data in new format and cannot be recognized by this version of code.
        // If this happens, we erase NVS partition and initialize NVS again.
        ESP_ERROR_CHECK(nvs_flash_erase());
        err = nvs_flash_init();
    }
    ESP_ERROR_CHECK(err);

    get_sha256_of_partitions();

    ESP_ERROR_CHECK(esp_netif_init());
    ESP_ERROR_CHECK(esp_event_loop_create_default());

    /* This helper function configures Wi-Fi or Ethernet, as selected in menuconfig.
     * Read "Establishing Wi-Fi or Ethernet Connection" section in
     * examples/protocols/README.md for more information about this function.
     */
    //ESP_ERROR_CHECK(example_connect());//注释掉原来的
     wifi_init();//增加wifi初始化

#if CONFIG_EXAMPLE_CONNECT_WIFI
    /* Ensure to disable any WiFi power save mode, this allows best throughput
     * and hence timings for overall OTA operation.
     */
    esp_wifi_set_ps(WIFI_PS_NONE);
#endif // CONFIG_EXAMPLE_CONNECT_WIFI

    xTaskCreate(&simple_ota_example_task, "ota_example_task", 8192, NULL, 5, NULL);
}

7)打开SDK可视化配置,检查flash大小设定和“partition table”分区表设定。

左下角,点击SDK可视化配置按钮,进入配置。flash大小为4MB,Partition Table选择Factory app, two OTA definitions,分区表烧写偏移地址0x8000,如果默认是这样,则不用修改,直接关闭窗口即可。

分区表的说明见官方文档:分区表 - ESP32 - — ESP-IDF 编程指南 latest 文档

 关于分区表所在IDF路径:E:\ESP32-IDF\esp\esp-idf\components\partition_table

 ESP32启动后,所打印的分区表。

8)重新编译、下载到ESP32开发板。

打开串口监控,可以看到wifi连接成功了,但是连接HTTP服务器失败,原因是hello_world项目被关闭了,所以运行的HTTP服务器也跟着关闭了。

五、设置VSCODE打开多个项目文件夹,并开启HTTP服务器。

1)VSCODE打开多个项目文件夹的设置方法。

文件->首选项->设置->窗口>>新建窗口->Open Folders In New Window,这里设置为on即可。

 

2)打开hello_world例程,开启HTTP本地服务器。

在simple_ota_example例程中,文件->打开文件夹->选择hello_world例程,这时可以看到两个例程各占一个窗口,这样在确保hello_world例程中开启HTTP本地服务器,可以同时串口监控OTA升级的过程。

 hello_world例程中开启HTTP本地服务器,终端中输入命令:python -m http.server 8070

六、simple_ota_example例程中串口监控OTA升级的过程。

simple_ota_example例程中,打开串口监控,打开时会复位ESP32,如下图所示。

至此,使用本地HTTP服务器,进行OTA升级的已全部完成,愉快的玩耍吧!

完整的例程代码下载:https://download.csdn.net/download/felix_tao/86268442

使用例程,报错怎么办,解决办法如下:

1)打开VSCODE报错,c_cpp_properties.json无法找到E:\\ESP32-IDF...

解决办法:点击.vscode->c_cpp_properties.json,修改盘符即可,例如将E盘改为D盘。

2)编译工程报错:

[0/1] Re-running CMake...
FAILED: build.ninja 
CreateProcess failed: The system cannot find the file specified.
ninja: error: rebuilding 'build.ninja': subcommand failed

解决方法:清除编译产生的所有文件,左下角->点击垃圾桶图标(ESP-IDF Full Clean)->清除后,接着重新编译即OK。

本文参考了以下博客,鸣谢!

2022.05 ESP32 空中升级 OTA_事在人wёi的博客-CSDN博客_esp32空中升级

第二十章 ESP32的空中升级(OTA)_开源一小步的博客-CSDN博客_esp32 ota

ESP32分区表图解_SimonLiu009的博客-CSDN博客_esp32分区详解

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

图文手把手教程--ESP32 OTA空中升级(VSCODE+IDF) 的相关文章

  • ChatGLM-6B本地cpu部署

    ChatGLM 6B是清华团队研发的机器人对话系统 xff0c 类似ChatGPT xff0c 但是实际相差很多 xff0c 可以当作一个简单的ChatGPT ChatGLM部署默认是支持GPU加速 xff0c 内存需要32G以上 普通的机
  • java通过HttpServletRequest获取post请求中的body内容

    在java web应用中 xff0c 我们如何获取post请求body中的内容 xff1f 以及需要注意的问题 通常利用request获取参数可以直接通过req getParameter name 的方式获取url上面或者ajax data
  • Your password does not satisfy the current policy requirements解决办法

    mysql5 7 x安装以后 xff0c 想修改随机生成的密码为简单容易记忆的密码 xff0c 如root 123456等 xff0c 这时候通过修改密码的几种方式都不行 xff0c 出现密码不符合当前安全策略要求 为了解决这种问题 xff
  • 用一条SQL语句查询出每门课都大于80分的学生姓名

    两道sql题 xff1a 1 用一条SQL语句查询出每门课都大于80分的学生姓名 2 删除除了自动编号不同 xff0c 其他都相同的学生冗余信息 第一题数据如下 xff1a 分析 xff1a 每门课都大于80分 xff0c 就是说学生最低分
  • ajax通过post方法传数组

    ajax在web项目开发中经常会用到 xff0c 平时我们传递数据 xff0c 基本都是一个参数名对应一个参数值 xff0c 后端通过参数名就可以得到参数 xff0c 从而进行相关逻辑处理 xff0c 但是有时候我们会遇到批量操作 xff0
  • “操作无法完成因为其中的文件夹或文件已在另一个程序中打开”解决办法

    在windows系统中 xff0c 我们经常会遇到这样一个问题 xff1a 删除某一个文件或者文件夹 xff0c 被提醒 xff1a 操作无法完成 xff0c 因为其中的文件夹或文件已在另一个程序中打开 这个时候我们一般会先检查是否真的有程
  • 几种常见mybatis分页实现

    mybatis框架分页实现 xff0c 有几种方式 xff0c 最简单的就是利用原生的sql关键字limit来实现 xff0c 还有一种就是利用interceptor来拼接sql xff0c 实现和limit一样的功能 xff0c 再一个就
  • curl发送POST方法类型带body参数请求以及发送上传文件请求

    curl在实际中会被postman等替代 xff0c 但是他仍然是一个快速的模拟http请求的工具 xff0c 而且也有他不可替代的理由 xff0c 使用简单 xff0c 在命令行下就可以完成 今天不是介绍如何使用curl模拟各种GET P
  • 第45章 DCMI—OV2640摄像头—零死角玩转STM32-F429系列

    第45章 DCMI OV2640摄像头 全套 200 集视频教程和 1000 页 PDF 教程请到秉火论坛下载 xff1a www firebbs cn 野火视频教程优酷观看网址 xff1a http i youku com firege
  • 技术分享|探究群体智能—基于UWB定位技术的无人机集群协同

    随着无人机性能水平提高 xff0c 无人机在民用类和军事类活动中的使用越来越广泛 由于无人机飞行环境和任务难度不同 xff0c 单架无人机因为自身动力和负荷能力很难独自完成任务 xff0c 无人机集群协同作业则是当前科技现代化的任务要求 集
  • 技术分享 | 基于室外RTK/GPS定位系统下的无人机集群协同

    在自然界中 xff0c 为弥补个体能力的不足 xff0c 诸多生物种群能通过个体相互之间的交流与合作呈现出某种群体行为 xff0c 比如鱼群结群游弋 鸟群聚集迁徙以及蚂蚁协同搬运等 受此激励 xff0c 人们希望开发像鸟群 鱼群一样自由集结
  • STL学习系列之一——标准模板库STL介绍

    说明 xff1a 此文为连载版 xff0c 今天学习STL的介绍 1 STL介绍 标准模板库STL是当今每个从事C 43 43 编程的人需要掌握的技术 xff0c 所有很有必要总结下 本文将介绍STL并探讨它的三个主要概念 xff1a 容器
  • 如何在cmakelist中,find_package取指定路径中查找

    在开发中 xff0c 最常遇到环境问题 xff0c 这个opencv版本不对 xff0c 那个pcl版本不对 xff0c 如果将原系统目录下的库卸载后重装新的版本 xff0c 往往会出现一些意想不到的事 xff0c 费时费力 我常常这样做
  • MFC模型树控件TreeCtrl实现按下Ctrl键多选,按下Shift键连选

    MFC模型树控件TreeCtrl实现按下Ctrl键多选 xff0c 按下Shift键连选 MFC的List Box只需要将控件属性中的Selection项设置为Extended xff0c 即可实现Ctrl键多选和Shift键连选 xff1
  • PCL点云库——欧式聚类分割

    欧式聚类分割 pcl EuclideanClusterExtraction是基于欧式距离提取集群的方法 xff0c 仅依据距离 xff0c 将小于距离阈值的点云作为一个集群 具体的实现方法大致是 xff1a 1 找到空间中某点p10 xff
  • PCL点云库——旋转平移矩阵

    旋转平移矩阵 点云摆正 点云配准等点云操作实质上是对点云进行旋转平移 xff0c 使点云变换至目标位姿 PCL中使用的是矩阵乘列向量的计算方法 下面分别给出了点A x y z 绕X轴 Y轴 Z轴逆时针旋转角度 的示意图与旋转矩阵 xff08
  • PCL点云库——点云法线估计

    点云法线估计 PCL中的所有点云的法线都是指向视点的 xff0c 视点坐标默认为 0 0 0 xff0c 对视点进行设置 xff0c 则可对法线进行定向 如图1与图2所示 xff0c 分别为斯坦福兔子在视点坐标为 10 10 10 与 10
  • PCL点云库——PCA粗配准

    PCA粗配准 主成分分析法 Principal Component Analysis xff0c 简称PCA 是使数据简化的算法 xff0c 通过揭露数据内部的主要分布方向 xff0c 减少了数据集的维数 xff0c 从而保留了点云集中贡献
  • MFC按钮(Button)上的文字与图标显示

    MFC按钮 xff08 Button xff09 上的文字与图标显示 一 新建对话框 MFC中使用以下两种方法可以得到对话框 xff1a 1 1 使用如图1所示的方法 xff0c 新建一个基于对话框的应用程序 xff1b 1 2 在已有的项
  • 第44章 MPU6050传感器—姿态检测—零死角玩转STM32-F429系列

    第44章 MPU6050传感器 姿态检测 全套 200 集视频教程和 1000 页 PDF 教程请到秉火论坛下载 xff1a www firebbs cn 野火视频教程优酷观看网址 xff1a http i youku com firege

随机推荐

  • 通过哪些性能参数选择手持式激光扫描仪?

    选择手持式激光扫描仪 激光主动成像系统有诸多优点 xff0c 譬如抗干扰性强 xff0c 能很好地适应不同的测量现场 xff0c 但是它的图像会受到散斑噪声和其他一些高斯噪声的影响 如图1所示 xff0c 分别用红 蓝激光扫描点距0 1mm
  • 函数使用笔记——ShellExecute

    函数使用笔记 ShellExecute API函数 ShellExecute的功能是运行一个外部程序 xff08 或者是打开一个已注册的文件 打开一个目录 打印一个文件等等 xff09 xff0c 并对外部程序有一定的控制 有几个API函数
  • 使用Selenium和Chrome浏览器获取诗词网站搜索结果

    在进行信息检索时 xff0c 我们通常会使用搜索引擎来查找相关的文章 图片 音乐等资源 而在特定的领域中 xff0c 也有一些针对特定内容的搜索引擎或网站 xff0c 比如古诗文网 诗词库等 在本篇博客中 xff0c 我们将介绍如何使用Py
  • 使用Selenium和Chrome浏览器获取图片网站搜索结果

    在进行信息检索时 xff0c 我们通常会使用搜索引擎来查找相关的文章 图片 音乐等资源 而在特定的领域中 xff0c 也有一些针对特定内容的搜索引擎或网站 xff0c 比如百度图片 Pixabay等 在本篇博客中 xff0c 我们将介绍如何
  • 使用python定时抓取个人邮箱数据(通过邮件数量判断)

    在进行信息收集时 xff0c 我们通常会使用电子邮件来接收最新的消息 文档 数据等资源 而在特定场景下 xff0c 也有一些需要自动化获取和处理邮件数据的需求 在本篇博客中 xff0c 我们将介绍如何使用Python的imaplib库连接到
  • 使用Python从邮件中下载附件和提取元数据

    在本篇博客中 xff0c 我们将解析一段Python代码 xff0c 该代码可以从电子邮件中下载附件并提取发送人 主题和日期等元数据 这段代码包含两个函数 xff1a download file 和 get email title 其中 x
  • 使用python提取噪声信号中的有效信息

    本文算法的原始论文出处 xff1a Algorithms Free Full Text An Efficient Algorithm for Automatic Peak Detection in Noisy Periodic and Qu
  • 射频信号对喇叭的影响

    这个问题是在测试能控器中发现的 当时测试时 xff0c 示波器偶尔会发出声音 xff0c 声音有大有小 xff0c 频率还不一样 xff0c 当时测试环境中还有衰减器 xff0c 用手捂住衰减器 xff0c 声音会变小 xff0c 一度以为
  • Code Composer Studio的配置及下载事项

    SDK版本 xff1a SIMPLELINK CC13X2 26X2 SDK v5 20 0 52 适用场景 xff1a 首次将工程文件配置到本地时 xff1b 有bim工程 oad工程 协处理器程序多个部分混杂 xff1b 异常问题 xf
  • 《无线神经调节的微创技术治疗慢性顽固性疼痛:初步观察报告》

    全文概况 xff1a 该文件讨论了一种新型无线和微创神经调节设备 xff0c 用于治疗之前曾经失败的患者慢性顽固性疼痛 该设备通过经皮植入的电极远程控制 xff0c 进行高频背根节神经刺激或周围神经刺激 该系统对于患有腰腿疼痛的患者有重要潜
  • 第27章 LTDC/DMA2D—液晶显示

    本章参考资料 xff1a STM32F76xxx参考手册 2 STM32F7xx 规格书 库帮助文档 STM32F779xx User Manual chm 关于开发板配套的液晶屏参数可查阅 5 0寸液晶屏数据手册 配套资料获知 27 1
  • GB 9706.1-2020 医用电气设备第1部分:基本安全和基本性能的通用要求-1

    这是份什么文件 这是一份中华人民共和国国家标准 xff0c 具体为GB9706 1 2020 xff0c 标准适用于医用电气设备 xff0c 并规定了医用电气设备基本安全和基本性能的通用要求 主要涵盖了医疗电器设备与患者接触的各种要求 xf
  • 关于图床使用

    安装windows终端 Windows 终端安装 Microsoft Learn 安装oh my posh 安装scoop xff08 后续都使用PowerShell 7 2 10 xff09 xff1a gt Set ExecutionP
  • 关于pyqt的一些用法

    QT原生是C 43 43 xff0c pyqt基于python语言 关于插件 xff1a 安装一个PyUIC xff0c 一个Qt Designer 点击Qt Designer可以出来ui配置页面 xff0c 和qt原生IDE基本一样 上面
  • python从单独的文件中获取配置信息

    可以新建一个configure json文件 xff0c 里面放置json格式的字符串 比如 xff1a deviceMAC1 12412421413 deviceMAC 12413232 name 123123 使用下述程序即可获取jso
  • 解决串口工具串口号改变的问题(借助python和ch344/8)

    串口工具一般在插不同usb口的时候 xff0c 识别出来的串口号不一致 xff0c pl2303可以固定 xff0c 但是更换电脑后也会变化 xff0c 可以借助沁恒家的一款串口一转多的工具 xff0c ch344或ch348 xff0c
  • python将监听到的串口信息实时保存到日志

    尽量在一个单独的线程中运行 stim thread span class token operator 61 span threading span class token punctuation span Thread span clas
  • 技能梳理37@stm32+按键+光耦+锁存+串行转并行+继电器

    技能梳理37 64 stm32 43 按键 43 光耦 43 锁存 43 串行转并行 43 继电器 1 项目简介 2 实现逻辑 3 应用场景 主从机有线控制 开关操作 4 核心代码梳理 span class token comment 根据
  • 技能梳理38@stm32+CC2530+超声波+光敏+oled

    技能梳理38 64 stm32 43 CC2530 43 超声波 43 光敏 43 oled 1 项目简介 2 实现逻辑 主从机使用zigbee通信 主机oled显示当前停车场位置图 从机通过超声波和光敏一起检测是否有车 当某位置车辆进出
  • 图文手把手教程--ESP32 OTA空中升级(VSCODE+IDF)

    本文内容 1 xff09 使用hello world例程 xff0c 编译生成hello world bin文件 xff0c 并且开启HTTP本地服务器 2 xff09 使用simple ota example例程 xff0c 通过HTTP