You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ESP32 OTA Data分区字节填充与更新方法技术咨询

ESP32 OTA Data分区原理与自定义更新实现

一、OTA Data分区的字节填充格式

ESP32的OTA Data分区由两个连续的4K(0x1000字节)Flash扇区组成,总大小0x2000字节,采用冗余存储设计避免单扇区写入损坏导致启动失败。每个扇区的结构规则如下:

每个扇区起始位置存储一个OTA状态结构体,剩余字节以0xFF填充(Flash擦除后的默认值),结构体定义如下:

typedef struct {
    uint32_t magic;          // 固定魔数:0x5041544F(对应ASCII反转的"ATOP")
    uint32_t crc;            // 结构体(除crc字段外)的CRC32校验值
    uint32_t seq;            // 启动序列号,数值越大优先级越高
    uint8_t state;           // 固件状态:0=未定义(OTA_UNDEFINED),1=待验证(OTA_PENDING_VERIFY),2=已验证(OTA_VALID),3=废弃(OTA_INVALID)
    uint8_t reserved[16];    // 预留字段,填充0xFF即可
} otadata_entry_t;

Bootloader启动时的扫描逻辑:

  1. 优先选择seq最大且state为OTA_VALID的固件分区
  2. 若两个扇区数据冲突,会校验CRC,选择CRC正确的扇区数据

二、自定义更新OTA Data分区的步骤

直接操作Flash更新该分区需遵循Flash擦写规则(仅能从1写为0,修改前必须擦除扇区),步骤如下:

1. 获取OTA Data分区的Flash起始地址

可通过ESP-IDF的esp_partition_find_first接口查找label为ota_data的分区,获取其起始地址;不建议硬编码地址,避免分区表变更导致错误。

2. 构造有效状态结构体

  • 魔数magic固定设为0x5041544F
  • seq设为当前已存在的最大序列号+1(确保新状态优先级更高)
  • state根据场景设置:
    • 写入新固件后,先设为OTA_PENDING_VERIFY(待验证),等固件启动并验证通过后,再更新为OTA_VALID
    • 若切换到已验证的固件,直接设为OTA_VALID
  • 计算CRC32:对结构体中除crc外的所有字段计算校验值,填入crc字段
  • 预留字段reserved全部填0xFF

3. 擦除OTA Data扇区

依次擦除两个4K扇区,确保写入前扇区为全0xFF状态。

4. 写入状态结构体

将构造好的结构体分别写入两个扇区的起始位置,剩余字节无需额外处理(擦除后已是0xFF,符合填充要求)。

5. 验证写入结果

读取两个扇区的结构体数据,对比CRC和字段内容,确保写入正确。

三、关键注意事项

  • 必须保证两个扇区的数据完全一致,否则Bootloader可能无法识别有效状态
  • 禁止直接修改单个字节,必须擦除整个扇区后重新写入
  • seq字段是启动优先级的核心,每次更新必须递增,确保Bootloader选择目标固件
  • 若设置state为OTA_PENDING_VERIFY,目标固件启动后需手动将state更新为OTA_VALID,否则下次启动会回退到之前的有效固件

内容的提问来源于stack exchange,提问作者user20602609

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 12:05:26