58 ESP32 OTA升级(双OTA分区无factory APP)

本文介绍了在ESP32资源有限(4M flash)的情况下,如何通过使用双OTA分区而非factoryAPP,成功实现固件的远程升级,包括分区划分、升级机制和下载写入过程。作者提供了详细的模块化代码示例和关键步骤。

1 引言

        产品功能实现后,就要对产品的维护进行考虑。产品出来后,卖了N台出去,如果突然发现自己一行代码写错了,怎么办,肯定不能去现场吧N台设备,免费出差旅游也累啊,所以一般需要有远程升级设备的功能,此篇为对ESP32 OTA实验经验总结。

2 问题

        当前ESP32官方例程,以及网络上的经验例程,都是factory APP + 双OTA_x 方式。我选用的esp32是4M flash的,现在编译的固件大小是1.3M,按照上述的方式,需要用到的空间是:1.3M * 3 =3.9M。

        只有4M大小flash的我,很明显,这看起来马上就不能用,也不够用了。所以,按照网上或官网那种分区的方式,肯定不行。

        然后在继续查找经验过程中,发现有人没有用官方的factory APP+双OTA_X方式,而是直接双OTA_0和OTA_1,没有factory这个东东,省下了1倍固件大小的空间,所以只有4M flash的我,就采用这个方案了。

3 双OTA no factory APP实现

要做OTA升级,需要了解的内容是:

        1.如何对flash划分分区?

        2.升级机制是怎样的?

        3.如何将固件从网络上download下来并写到flash中,以及标记相关参数?

对于问题1:如何对flash进行分区划分?

        对这个问题,我一开始比较迷惑。因为esp32给出的ota升级的demo,是需要三个分区,即factory app+OTA1+OTA2,按照这算法,所需flash的大小是单个app的三倍。

        然后我固件大小是1.3M,整块flash大小4M,这样算下来3*1.3 = 3.9M,显然不够,所以一开始迷惑了。官方怎么不给只有两个的,完全两个就搞定了,然后经过资料搜索,和尝试,最后确认两个OTA分区,不需要factory app也是可以的,所以就敲定了以下的分区划分。

对于问题2:升级机制是怎样的? 

        esp32 OTA的升级机制跟传统的机制是一样的,来回切换,就这样。。。。

对于问题3:如何将固件从网络上download下来并写到flash中,以及标记相关参数?

        下载的话,我采用了httpget方式,将文件从http服务器下载下来。至于下载下来的文件写入flash和如何标记OTA_data相关参数,直接参考官方例程即可。整个搞下来其实不难,要花一点时间调试而已。 

        本实验采用的方式是模块化编程,所以下面给出的代码都是模块独立的,稍微移植就可以用。

#includ
<think>好的,我现在需要帮助用户了解如何在ESP-IDF框架中实现OTA分区OTA升级。首先,我得回忆一下ESP-IDF的OTA机制。根据引用[1]、[2]、[3],ESP-IDF支持OTA升级,允许设备通过网络更新固件。OTA分区通常意味着有两个OTA分区,比如ota_0和ota_1,这样可以实现无缝回滚和更安全的升级。用户提到OTA分区,我需要确认ESP-IDF是否原生支持。根据引用[3],原生API如esp_ota_begin和esp_ota_write用于处理OTA流程,而引用[4]提到自定义分区表,可能涉及定义多个OTA分区。所以,可能需要配置分区表来包含两个OTA分区。接下来,步骤可能包括:1.修改分区表,定义两个OTA分区;2.配置引导程序选择正确的分区;3.实现OTA逻辑,交替使用两个分区。引用[2]提到两种方法,使用app_update组件或esp_https_ota,这里可能需要使用app_update的API来管理分区。还要考虑OTA流程中的验证,比如检查新固件是否正确,再切换启动分区。引用[4]提到验证更新,所以可能需要计算校验和或签名验证。此外,确保在写入新固件时选择正确的OTA分区,这涉及到esp_ota_get_next_update_partition函数,如引用[3]中的函数。用户可能需要示例代码,特别是如何交替写入两个分区。例如,每次升级时检查当前活动分区,然后选择另一个作为目标。同时,引导加载程序(bootloader)需要知道如何选择最新的有效固件,这可能需要设置OTA数据分区来存储当前状态。可能的问题包括分区表配置错误,导致无法识别两个OTA分区,或者升级后无法正确切换。需要指导用户如何调试,比如查看分区表和日志信息。另外,引用[4]的自定义分区方法可能适用于OTA,但需要调整分区大小和地址。 最后,生成相关问题时,要考虑用户可能的后续疑问,比如性能优化、安全机制或具体代码示例。确保回答结构清晰,分步骤解释,并引用相关文档或示例。</think>在ESP-IDF框架中实现OTA分区OTA升级,需遵循以下步骤和原理: ### 一、OTA分区实现原理 1. **分区表定义**:需在`partitions.csv`中定义两个OTA分区(如`ota_0`和`ota_1`),并设置`ota_data`分区存储升级状态[^4] $$ # Name | Type | SubType | Offset | Size ota_0, 0, ota_0, 0x20000, 1M ota_1, 0, ota_1, 0x120000, 1M ota_data, data, ota, 0x220000, 8K $$ 2. **启动逻辑**:`bootloader`通过`ota_data`分区判断当前活跃的OTA分区[^3] ### 二、实现步骤 1. **修改分区表** ```c // partitions.csv factory, app, factory, 0x10000, 1M ota_0, app, ota_0, , 1M ota_1, app, ota_1, , 1M ota_data, data, ota, , 8K ``` 2. **OTA升级核心代码** ```c const esp_partition_t *update_partition = esp_ota_get_next_update_partition(NULL); esp_ota_handle_t ota_handle; ESP_ERROR_CHECK(esp_ota_begin(update_partition, firmware_size, &ota_handle)); // 写入数据循环 while ((n = esp_http_client_read(client, ota_buf, BUFFER_SIZE)) > 0) { esp_ota_write(ota_handle, ota_buf, n); } // 验证并切换分区 ESP_ERROR_CHECK(esp_ota_end(ota_handle)); ESP_ERROR_CHECK(esp_ota_set_boot_partition(update_partition)); ``` 3. **安全验证(可选)** - 使用`esp_ota_get_app_elf_sha256()`验证固件哈希 - HTTPS加密传输(需启用`esp_https_ota`组件)[^2] ### 三、关键API说明 1. `esp_ota_get_next_update_partition()`:自动选择非活跃OTA分区[^3] 2. `esp_ota_set_boot_partition()`:设置下次启动的分区[^3] 3. `esp_ota_mark_app_valid_cancel_rollback()`:确认固件有效[^3] ### 四、调试要点 1. 使用`idf.py partition-table`查看分区布局 2. 通过`esp_ota_get_running_partition()`获取当前运行分区 3. 串口日志中关注`OTA sequence number`验证切换逻辑
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值