单片机的几种ota内存分区表介绍

前言

在做项目时,现在越来越多被要求单片机要支持升级功能。需求变化快,固件要不断支持新的功能,手动人工去烧固件越来越显得麻烦,已经操作成本高。

典型的方式是通过单片机外接的蓝牙、wifi等无线模块,或者通过单片机的上位机通过网络接收升级固件等方式来实现单片机升级的硬件通路。

单片机升级,就涉及到了单片机的内存分区。这里介绍下,常用的几种典型的分区方式。

1、BootLoader+APP方式

这种方式是将单片机的flash划分为3个分区。如下图。
在这里插入图片描述
涉及到升级,BootLoader分区都是必需的。参数区用于保存app需要用到的一些参数,已经升级相关参数。

开机启动过程

BootLoader 启动,跳转到APP分区的main函数运行。

升级过程
1、APP程序收到升级命令,将要升级的标志位存入parameter分区,然后跳转到BootLoader的main函数执行。
2、BootLoader运行后检测到parameter分区的升级标志位后,就将APP分区擦除。
3、BootLoader一帧一帧接收升级数据,然后写入APP分区
4、所有升级数据写入完成后,清除升级标志位,再跳转到App分区
5、固件升级完成。

这种方式的缺点很明显,APP分区容易挂掉,如果升级过程中掉电,或者通信异常了,单片机将不能正常运行到app分区。

应用场景
只适用于flash非常小的单片机,且如果升级过程有bug,还是需要人工刷BootLoader。除非万不得已,不要采用这种分区方式,可以直接更换flash更大的单片机。

2、BootLoader+APP+OTA分区方式

在这里插入图片描述
OTA分区存放最新的固件。其升级过程如下:
1、APP中收到升级命令,然后擦除OTA分区。
2、APP中接收升级固件,并一帧一帧写入OTA分区。
3、写入完毕后,将升级标志位写入Parameter分区。
4、APP只直接调用系统重启函数,通过触发复位来重启。
5、BootLoader读取到升级标志位,然后擦除APP分区。
6、擦除完毕后,将OTA分区固件搬运到APP分区
7、搬运完毕后,清除升级标志位,然后跳转到APP分区

这种方式是APP来接收固件,更为方便,修复升级bug,只需要升级一个版本即可,不需要人工刷BootLoader

如果要实现实时版本回滚,可以再增加一个OTA1分区用于存储升级前的固件。

3、BootLoader+APP+Backup分区方式

在这里插入图片描述

Backup分区存放升级前的固件。其升级过程如下:
1、1、APP程序收到升级命令,将要升级的标志位存入parameter分区,然后跳转到BootLoader的main函数执行。
2、BootLoader运行后检测到parameter分区的升级标志位后,就将Backup分区擦除。
3、擦除完毕后,将APP分区搬运到Backup分区。
4、搬运完毕后,擦除APP分区。
5、BootLoader读取到升级标志位,然后擦除APP分区。
3、BootLoader一帧一帧接收升级数据,然后写入APP分区
4、所有升级数据写入完成后,清除升级标志位,再跳转到App分区。

该方式的优势是,可以实现回滚功能。如果升级失败,重启会把backup分区再次搬运到APP分区。

3、BootLoader+APP+APP1分区方式

在这里插入图片描述
这种方式采用的双APP的方式。升级的过程如下:
1、当前运行在APP分区,收到升级命令后,就把APP1分区擦除掉
2、APP中将收到的固件写入APP1分区
3、写入完毕后跳转到APP1分区。
同理如果当前是在APP1,就会把固件写入APP然后跳转到APP运行。

这种方式比较复杂,每次编译都需要编译两个固件,固件版本一致,唯一的区别是中断向量表的首地址不一样,分别对应APP和APP1分区,且APP分区的固件不能放入APP1,否会会因为中断向量表与实际位置不符,造成运行出错。

这种方式优势也很明显,回滚,不需要操作flash,只需要跳转分区即可。同时这种可靠性最高,不存在挂掉的可能性,因为任何一个时候都有一个分区是可以正常运行的。只有升级完成后,才会跳转到新分区,否则就继续在当前分区运行。并且升级完成后,直接跳转,不需要重启单片机。

这种方式一般用于可靠性要求非常高的场合。

<think>嗯,用户想了解ESP32 IDF中OTA分区的配置方法。我需要先回忆一下相关的知识。首先,OTA升级在ESP32中是通过分区来管理不同的固件区域的。分区决定了各个分区的位置和大小,比如OTA数据分区、工厂分区、OTA应用分区等。 记得ESP-IDF提供默认的分区,但用户可能需要自定义。比如调整分区大小或者增加新的分区。配置分区通常是通过CSV文件来定义的,然后在menuconfig中指定使用哪个分区文件。用户可能需要修改这个CSV文件,然后编译时将其包含到项目中。 还需要考虑OTA数据分区的作用,它保存OTA升级的状态和当前选择的应用程序分区。应用分区通常是两个,用于交替存储新旧固件,确保升级失败时可以回滚。另外,在代码中可能需要配置分区的路径,以及使用哪个分区文件。 用户可能需要具体的步骤,比如如何创建自定义分区,如何在menuconfig中设置,以及如何验证配置是否正确。还有可能需要示例代码或配置片段,比如分区的具体内容,比如工厂分区、OTA数据分区、OTA应用分区0和1的定义。 另外,引用中的信息提到ESP-IDF提供了API支持OTA升级,比如esp_https_ota_begin等,但用户的问题是关于分区配置,所以重点应该放在分区的设置上,而不是API的使用。不过可能需要提到分区配置与OTA API的关系,确保分区正确才能正常使用这些API。 还有,用户可能对分区的格式不太清楚,需要解释各个字段的含义,比如名称、类型、子类型、偏移地址、大小、标志等。例如,工厂分区的类型是app,子类型是factory,OTA应用分区的子类型是ota_0到ota_15,而OTA数据分区的类型是data,子类型是ota。 可能还需要提到如何通过idf.py menuconfig来设置分区的路径,以及如何编译和烧写分区。比如在menuconfig的Partition Table选项中选择自定义分区文件,并设置其路径。然后编译时,分区会被编译并烧写到设备中。 验证配置是否正确可能需要使用命令读取分区信息,比如通过esptool.py或者idf.py partition-table命令来查看当前的分区信息。 示例部分,可能需要给出一个具体的分区CSV内容,展示工厂分区、OTA数据分区、两个OTA应用分区的定义,以及可能的其他分区如nvs、phy等。同时,解释各个分区的作用和配置参数。 用户还可能关心分区的偏移地址和大小计算,如何避免分区之间的重叠,以及如何根据项目需求调整分区大小。例如,应用程序的大小增加后,需要调整OTA应用分区的大小,同时确保后续分区的偏移地址正确。 另外,引用中提到的官方文档和示例可能需要作为参考,引导用户查阅ESP-IDF编程指南中的相关章节,或者提供的示例代码。比如引用[1]和[4]中的内容,提到OTA的实现和WebServer的例子,可能与分区配置有关联,但需要集中在分区的配置步骤上。 总结下来,回答的结构应该是先介绍分区的作用,然后详细说明配置步骤,包括创建自定义分区文件、修改内容、menuconfig设置、编译和烧写,最后给出示例分区和验证方法。同时,相关问题可以涉及分区调整的注意事项、OTA分区的选择机制、如何恢复出厂固件等。</think>### ESP32 IDF OTA分区配置方法 在ESP-IDF中,分区决定了固件的存储布局,OTA升级功能依赖于特定的分区配置。以下是配置步骤及示例: #### 1. **分区基础结构** ESP32的分区包含以下关键分区: - **工厂分区**:存储初始固件,子类型为`factory` - **OTA数据分区**:存储OTA升级状态,子类型为`ota` - **OTA应用分区**:存储交替升级的固件(至少需要两个),子类型为`ota_0`、`ota_1`等 #### 2. **配置步骤** **a. 创建自定义分区文件** 新建一个CSV文件(如`partitions_ota.csv`),内容示例如下: ``` # Name, Type, SubType, Offset, Size, Flags nvs, data, nvs, 0x9000, 0x6000, phy_init, data, phy, 0xf000, 0x1000, factory, app, factory, 0x10000, 2M, ota_0, app, ota_0, , 2M, ota_1, app, ota_1, , 2M, otadata, data, ota, , 0x2000, ``` **注意**:`Offset`字段为空时,系统会自动计算[^4]。 **b. 修改工程配置** 通过`idf.py menuconfig`进入配置界面: - **Partition Table → Partition Table**:选择`Custom partition table CSV` - **Partition Table → Custom partition CSV file**:输入文件路径(如`partitions_ota.csv`)[^2] **c. 编译与烧写** 执行以下命令,分区将自动编译并烧录到设备: ```bash idf.py build idf.py -p PORT flash ``` #### 3. **验证分区** 烧录后通过以下命令查看分区信息: ```bash idf.py partition-table ``` #### 4. **OTA分区的运行时选择** 代码中需通过`esp_ota_get_next_update_partition()`动态选择目标分区[^2],示例: ```c const esp_partition_t *update_partition = esp_ota_get_next_update_partition(NULL); ``` ### 示例分区解析 | 分区名 | 类型 | 子类型 | 大小 | 作用 | |----------|-------|---------|---------|--------------------------| | factory | app | factory | 2MB | 初始固件备份 | | ota_0 | app | ota_0 | 2MB | 第一个OTA应用分区 | | ota_1 | app | ota_1 | 2MB | 第二个OTA应用分区 | | otadata | data | ota | 8KB | 存储当前激活的OTA分区信息| ### 注意事项 1. **分区大小**:应用分区需大于实际固件体积(建议留20%余量) 2. **地址对齐**:偏移地址必须为`0x1000`的整数倍 3. **回滚机制**:至少需要两个OTA应用分区以实现安全升级[^1]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值