OTA 流程步骤

← OTA | ← 主页

完整流程

APP收到下载请求
→ OTA任务通知下载确认
→ 用户确认后启动Ymodem
→ 双缓冲经AppData队列交给Flash写任务
→ 完成全部写入并持久化DOWNLOAD_COMPLETE
→ OTA任务通知安装确认
→ 持久化INSTALL_PENDING并复位
→ BootLoader校验元数据、解密、验证、备份、安装
→ 校验新APP;失败则回滚,成功则跳转

APP 逻辑状态

状态行为
WaitReqDownload等待 ota_request_notify()
OtaDownloadYmodem 接收,Flash 写任务按序写 A 区
WaitReqUpdate下载完成但尚未确认安装,不复位
OtaEnd安装状态已持久化,准备系统复位

下载确认和安装确认共用通用 confirm_notify(stage)、confirm_read(stage) 接口,可由按键、LVGL、蓝牙或 UART 适配。超时默认 100 秒;下载确认超时回到 WaitReqDownload,安装确认超时留在 WaitReqUpdate。

持久化状态机

状态BootLoader 动作掉电恢复
OTA_STATE_NO_UPDATE启动现有有效 APP,否则进入恢复入口不修改存储
OTA_STATE_DOWNLOAD_COMPLETEAPP 尚未确认安装,继续启动旧 APP保留 A 区升级包
OTA_STATE_INSTALL_PENDING解析镜像头,解密到 B 区并校验;完整备份旧 APP 后才覆盖运行区备份前失败继续旧 APP;备份后先落盘回滚状态
OTA_STATE_VERIFY_NEW_APP校验长度、向量表和完整性失败转入回滚
OTA_STATE_ROLLBACK_PENDING从 A 区恢复旧 APP并校验恢复失败进入恢复下载
OTA_STATE_APP_VALID关闭 BootLoader 资源并设置 VTOR、MSP,跳转复位入口APP 无效则进入恢复下载

元数据包含 A/B/当前 APP 长度、新旧版本、校验类型、新旧摘要和 CRC32。CRC、布局版本或状态损坏时不执行安装,直接进入目标工程提供的恢复入口。

镜像布局

st_ota_image_header_t
├── magic、header_size
├── image_size、image_version
├── verify_type、digest_size、digest[32]
├── crypto_type
└── AES加密正文或明文正文
  • CRC32 是内置实现;MD5、SHA-256 和数字签名通过镜像校验 Provider 接入。
  • AES-256-CBC 密钥和 IV 来自 Crypto Provider,可读静态配置、安全 EEPROM 或安全芯片。
  • A 区先保存升级包,B 区保存解密后的新 APP;旧 APP 备份完成后 A 区才被复用。
  • W25Q64 的 4 KB 缓冲、分页写入和尾部 flush 属于 Flash Handler/Backend,不进入 OTA 状态机。

长耗时操作

Ymodem 接收、Flash 擦写、AES 解密、镜像校验和区域复制均周期喂狗。APP 的 OTA 任务与 Flash 写任务使用不同监控项;BootLoader 通过平台回调喂狗。