OTA 流程步骤
完整流程
APP收到下载请求
→ OTA任务通知下载确认
→ 用户确认后启动Ymodem
→ 双缓冲经AppData队列交给Flash写任务
→ 完成全部写入并持久化DOWNLOAD_COMPLETE
→ OTA任务通知安装确认
→ 持久化INSTALL_PENDING并复位
→ BootLoader校验元数据、解密、验证、备份、安装
→ 校验新APP;失败则回滚,成功则跳转APP 逻辑状态
| 状态 | 行为 |
|---|---|
WaitReqDownload | 等待 ota_request_notify() |
OtaDownload | Ymodem 接收,Flash 写任务按序写 A 区 |
WaitReqUpdate | 下载完成但尚未确认安装,不复位 |
OtaEnd | 安装状态已持久化,准备系统复位 |
下载确认和安装确认共用通用 confirm_notify(stage)、confirm_read(stage) 接口,可由按键、LVGL、蓝牙或 UART 适配。超时默认 100 秒;下载确认超时回到 WaitReqDownload,安装确认超时留在 WaitReqUpdate。
持久化状态机
| 状态 | BootLoader 动作 | 掉电恢复 |
|---|---|---|
OTA_STATE_NO_UPDATE | 启动现有有效 APP,否则进入恢复入口 | 不修改存储 |
OTA_STATE_DOWNLOAD_COMPLETE | APP 尚未确认安装,继续启动旧 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 通过平台回调喂狗。