# stm32_http_ota **Repository Path**: BE132360A7/stm32_http_ota ## Basic Information - **Project Name**: stm32_http_ota - **Description**: 基于野火挑战者V2,主控:STM32F429IGT6 的 FreeRTOS LWIP 的 http OTA 升级代码。 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 0 - **Created**: 2026-02-09 - **Last Updated**: 2026-03-04 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # STM32 HTTP OTA ## 基于野火挑战者V2,主控:STM32F429IGT6 的 FreeRTOS LWIP 的 http OTA 升级代码。 ### 设计思路: STM32F429IGT6 拥有 1024Kb的FLASH,分为3个区域, 1. 64Kb 的 bootloader扇区 2. 448Kb 的 app扇区 3. 512Kb 的 固件扇区 (可以替换成 spi flash) ### 运行流程: #### bootloader应用运行流程: 1. 上电后,先运行 bootloader 程序 2. bootloader 会检查 固件扇区 是否有新的固件包 3. 如果有新的固件包,会先校验固件包的完整性,如:CRC32 和 魔数 等 4. 如果固件包的完整性校验通过,先擦除 app扇区 5. 然后将 固件扇区 拷贝到 app扇区 6. 关闭 全局中断 ,SysTick 7. 跳转到 app扇区 启动。app程序。 #### app应用运行流程: 1. app 程序 启用 全局中断,初始化外设。 2. 进入 FreeRTOS 调度器。启动 3个任务, 1. 任务1: 默认任务,没有特殊功能,只是为了占用一个任务槽位。 2. 任务2: 监听 key 事件,如:key1 按下,触发 OTA 升级。 3. 任务3: 使用lwip http协议,从阿里云OSS下载 固件包。存放在 固件扇区。 3. 校验 固件包的完整性,如:CRC32 和 魔数 等 4. 如果固件包的完整性校验通过,就重启,否则就 删除 固件包。 5. 进入 bootloader 的流程。 ### 注意事项: 1. 固件包分为 2 部分 2. 头部信息,包括 魔数,版本号,固件包大小,构建时间,描述信息,共占 128 个字节。 ``` typedef struct { uint32_t magic_number; // 魔数:0x46575550,快速识别合法固件头 uint32_t fw_version; // 固件版本:0xMMNNPPBB(主/次/修订/构建) uint32_t fw_total_len; // 固件总长度:固件头 + 固件数据的总字节数 uint32_t crc32; // CRC32:仅校验固件数据(不含头),确保完整性(必选) uint32_t build_timestamp; // 构建时间:Unix时间戳(如1694502400) char description[108]; // 描述信息:更新的内容 } __attribute__((packed)) FirmwareHeader_t; ``` 3. 固件包的 数据部分,从 128 字节开始,后面是 真实的 .bin 文件。 4. fw_add_header.c 是一个工具,用于在 .bin 文件前面添加 头部信息。