这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » 【ESP-IDF系列】【ESP32】使用ESP32-S3基于ESP32-IDF进

共1条 1/1 1 跳转至

【ESP-IDF系列】【ESP32】使用ESP32-S3基于ESP32-IDF进行OTA升级

助工
2025-02-17 05:36:51     打赏

简介


OTA的全拼为Over the air , 其旨在于让用户通过非接触无感的方式来升级系统。它早已被广泛的应用到各行各业中, 比如说汽车中控的主程序升级。甚至是家里机顶盒的固件升级都可以通过OTA的方式来进行。它具体的操作逻辑分为两个方面,第一个方面是上位机方面(Server side)。 另一个则是硬件层次。简要的OTA工作流程为,首先硬件层次需要支持OTA升级。即在软件层次上已经划分好了多个分区,且支持启动的时候的分区检测和错误纠察回退机制。当软件启动的时候检测当前的固件版本是否存在新的更新, 如果存在更新的话, 那么将固件通过HTTP/HTTPS 协议下载到分区表的OTA分区中,然后修改其启动状态转换到从OTA分区进行启动。然后如果启动失败的话还具备回滚机制,允许当前的固件切换到之前正常的固件中。对于上位机程序很简单,只需要一个代理服务器使其固件可以被下载即可。那么在本篇文章中我将会借助ESP-IDF来带着大家完整的搭建一套OTA在ESP-32S3上的升级流程,并且包括上位机NGINX反向代理服务器的使用(用于静态资源的代理(固件))


分区表的使用


在进行OTA的正式使用之前,我们需要一点前置的知识即分区表的使用。简要而言分区表即规定了片上flash的分区信息。就像电脑的硬盘分区一样,分为A盘,B盘,C盘等。如下图所示即为我当前项目中的分区表信息, 它会在编译的时候被打印到控制台上。

image.png

其中的NVS为库专用分区,PHY_Init 分区则为了存储PHY的初始化数据。这两个分区为乐鑫官方初始化的默认设置,不建议进行修改。而下面的factory分区则实际上为存储程序代码的分区。 即保存固件信息, 每次烧录程序时,固件信息将会被烧录至此处。Type字段则表示当前分区的数据类型仅仅支持appdata,SubType则规定了具体分区的实际内容,即当当前的分区为app的时候,其subType的类型可以从下述列表中选择【factory,ota_0,...,ota_1f,test】。而type为data的时候,其subTypenv可以为【ota,phy,nvs,nvs_keys】当然它也支持其他的分区,比如说文件系统的spiffs等。这里不再进行赘述。详细使用文档可以参考上述链接。对于Offset则是相对于其实地址的偏移地址, 如果第一个nvs分区已经具备了偏移地址和Size(地址的长度), 那么下一个分区的偏移地址可以直接留空, ESP-IDF会自动根据当前分区的大小来帮助我们来计算分区的偏移地址。

对于上述的分区信息为ESP-IDF生成的默认分区,我们同时可以自定义我们自己的分区表信息。 即使用menuconfig工具在分区表配置选项中选择自定义分区表。

image.png

接着我们需要在项目的跟目录下创建一个名字为partitions.csv的分区表文件。同时拷贝官方示例中的分区表信息,然后我们做一点小小的修改。

image.png

下图为我新建的分区表信息

image.png

其中可以注意到我划分factory分区为2M,并且没有写偏移地址, 因为ESP-IDF会自动帮助我计算。但是在我编译的时候出现了分区表超出实际flash大小的错误,如下图所示。image.png

这是因为虽然我的flash大小是4MB(模组为esp32-s3-n4)但是在menuconfig中配置的flash大小仅仅为2mb导致的, 因此这里需要将menuconfig中的flash大小修改为实际的大小即4MB,如下图所示

image.png再次编译项目,此时便会发现程序的启动分区信息正如我们在分区表中设置的一摸一样

image.png

至此分区表的相关知识讲解完毕。接下来我们来看一下如何实现OTA升级的相关功能。


OTA升级


首先我们使用ESP-ID新建一个项目,项目新建时选择模板OTA项目

image.png

在项目新建之后我们便可以对其项目进行编译,在编译的过程中我们可以看到当前程序的分区表信息。 其中相对于我们原本的分区,它又额外划分了三个分区分别时ota_data分区,和ota_0以及ota_1,如下图所示

image.png

其中otadata分区保存的是分区的详细信息,其记录着当前需要从哪一个分区进行启动。(从ota_0或者ota_1)下文为官方的正式介绍。

image.png

之后我们可以打开menuconfig来进行ota固件下载地址的配置, 和相关的wifi参数的配置。

image.png

由于我们之后将会在本机上运行nginx服务器,因此需要将OTA固件的更新地址换成本地的IP,并且将请求方式换成http的方式。

image.png

修改menuconfig配置信息,并且保存

image.png

接下来我们重新编译固件,将程序烧录到开发板中。

image.png

此时打开监视程序可以发现程序会自动联网,并且尝试去从服务器下载更新固件,但是由于我并没有启动nginx服务器,因此本地下载更新失败,如下图所示。

image.png

接下来我们启动本地的nginx的服务器。并且将主程序进行一点小小的修改, 使其打印Hello eepw!用于测试OTA固件更新的效果。

void hello_world_task(void *pvParameter)
{    while (1)    
    {        
        printf("Hello EEPW!\r\n");        
        vTaskDelay(1000 / portTICK_PERIOD_MS);    
     }
 }

接下来启动这个task。

xTaskCreate(&hello_world_task, "helloEEPW", 2048, NULL, 5, NULL);

我们重新编译一下这个固件,并且将这个固件放到Nginx代理的目录下(这里不要直接烧录,否则测试不出来效果)。我们可以在build文件夹下找到这个bin文件,然后将其重命名,并且放到代理的目录下。

image.png如下图所示

image.png

接下来我们测试是否能够通过本机访问到这个bin文件。在浏览器中输入ip地址加文件名测试访问。

image.png

可以看到访问没问题,且已经触发了IDM的自动下载。接下来我们复位这个开发板。并且打开监视窗口。

image.png

从日志信息可以看到已经成功的从本地服务器下载了更新后的固件,并且OTA升级完成且触发了自动重启。并且控制台也开始打印了Hello EEPW!image.png

至此OTA升级完毕。


总结


OTA(Over-the-Air)是一种通过无线网络实现固件升级的技术,广泛应用于汽车中控系统、智能家居设备等领域。本文详细介绍了如何在ESP32-S3上实现OTA升级,包括分区表的配置、ESP-IDF项目的搭建、NGINX服务器的部署以及固件的更新流程。通过本文的实践,开发者可以轻松掌握OTA升级的核心技术,并应用于实际项目中,实现设备的远程无感升级。





关键词: OTA     ESP-IDF     ESP32-S3     分区表    

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]