嵌入式 OTA 升级 + 全场景存储:FAL 分区表实战配置详解(含 W25Q128+STM32F407)
·
在嵌入式物联网设备开发中,OTA 固件升级和分区分工存储是核心需求 —— 既要支持远程更新程序,又要妥善保管环境变量、日志、文件等数据。本文基于 RT-Thread FAL 组件,结合 STM32F407(1MB 片内 Flash)和 W25Q128(16MB 片外 Flash),详解一套覆盖「OTA 升级、环境配置、文件管理、日志存储」的完整分区表设计,附实际场景落地逻辑。
一、分区表核心背景
硬件基础
- 主控:STM32F407ZGT6(内置 1MB 片内 Flash,速度快,适合运行核心程序)
- 外接存储:W25Q128(16MB 串行 NOR Flash,容量大,通过 SPI 总线连接,负责扩展存储)
- 核心组件:FAL(Flash 抽象层)—— 统一管理片内 / 片外 Flash,通过分区表定义各区域功能,避免地址冲突和空间浪费。
设计目标
4. 支持 OTA 远程升级(需下载区、备份区);
5. 分类存储不同类型数据(程序、配置、文件、日志);
6. 空间分配合理,不浪费 W25Q128 的 16MB 容量;
7. 便于后期维护和功能扩展。
二、完整分区表代码 + 逐区拆解
先上最终可用的 FAL 分区表配置,再逐个解析每个分区的「定位 + 用途 + 设计逻辑」:
// env放环境变量和服务器的token(短期的license,用于连接服务器),filesys放文件系统,eflash存系统日志
#define FAL_PART_TABLE \
{ \
{FAL_PART_MAGIC_WORD, "app", "onchip_flash", 0, 896*1024, 0}, \
{FAL_PART_MAGIC_WORD, "download", NOR_FLASH_DEV_NAME, 0, 1024*1024, 0}, \
{FAL_PART_MAGIC_WORD, "factory", NOR_FLASH_DEV_NAME, 1*1024*1024, 1024*1024, 0}, \
{FAL_PART_MAGIC_WORD, "env", NOR_FLASH_DEV_NAME, 2*1024*1024, 1024*1024, 0}, \
{FAL_PART_MAGIC_WORD, "filesys", NOR_FLASH_DEV_NAME, 3*1024*1024, 4*1024*1024, 0}, \
{FAL_PART_MAGIC_WORD, "eflash", NOR_FLASH_DEV_NAME, 7*1024*1024, 9*1024*1024, 0}, \
}
解释如下:
| 分区名称 | 分区配置代码 | 核心定位 | 关联设备 | 空间分配 | 实际地址范围(逻辑/物理) | 关键说明与核心细节 |
|---|---|---|---|---|---|---|
| app 分区 | {FAL_PART_MAGIC_WORD, "app", "onchip_flash", 0, 896*1024, 0} |
存储「用户应用程序」(业务逻辑、外设驱动、OTA升级逻辑等) | 片内 Flash | 896KB | 片内 Flash 0x08000000 ~ 0x080DFFFF | 1. 片内Flash读写快、稳定性高,适合运行核心程序; 2. 预留128KB给Bootloader; 3. 大小需大于编译后程序体积(预留充足余量) |
| download 分区 | {FAL_PART_MAGIC_WORD, "download", NOR_FLASH_DEV_NAME, 0, 1024*1024, 0} |
OTA升级「临时下载区」,存储从服务器/串口下载的「新固件文件」 | W25Q128(片外) | 1MB | W25Q128 0x00000000 ~ 0x00100000(FAL逻辑地址) | 1. 容量需≥app分区大小,确保能放下完整新固件; 2. 工作流程:下载→校验→Bootloader刷入app分区→重启 |
| factory 分区 | {FAL_PART_MAGIC_WORD, "factory", NOR_FLASH_DEV_NAME, 1*1024*1024, 1024*1024, 0} |
存储「出厂默认固件」,设备的「系统备份」 | W25Q128(片外) | 1MB | W25Q128 0x00100000 ~ 0x00200000(FAL逻辑地址) | 1. 与app、download分区大小一致,确保固件完整性; 2. 用途:OTA升级失败恢复、恢复出厂设置 |
| env 分区 | {FAL_PART_MAGIC_WORD, "env", NOR_FLASH_DEV_NAME, 2*1024*1024, 1024*1024, 0} |
存储「短期/静态配置数据」,重点是服务器交互关键信息 | W25Q128(片外) | 1MB | W25Q128 0x00200000 ~ 0x00300000(FAL逻辑地址) | 1. 存储内容:服务器Token、静态IP、功能开关; 2. 修改频率低,无需复杂磨损均衡; 3. 预留扩展空间 |
| filesys 分区 | {FAL_PART_MAGIC_WORD, "filesys", NOR_FLASH_DEV_NAME, 3*1024*1024, 4*1024*1024, 0} |
挂载文件系统(LittleFS/FatFS),用于「文件级数据管理」 | W25Q128(片外) | 4MB | W25Q128 0x00300000 ~ 0x00700000(FAL逻辑地址) | 1. 存储:自定义配置文件、离线缓存、小型日志; 2. 支持标准文件操作API(fopen/fwrite等); 3. 灵活管理文件/目录 |
| eflash 分区 | {FAL_PART_MAGIC_WORD, "eflash", NOR_FLASH_DEV_NAME, 7*1024*1024, 9*1024*1024, 0} |
专门存储「系统运行日志」,依赖EasyFlash组件管理 | W25Q128(片外) | 9MB | W25Q128 0x00700000 ~ 0x01000000(FAL逻辑地址) | 1. 存储:运行状态日志、业务操作日志、故障报警日志; 2. 高频写数据,EasyFlash自动做磨损均衡; 3. 大空间支持日志循环覆盖,无需手动清理 |
三、分区表设计核心原则(避坑关键)
- 无重叠、不超容:
所有分区的「偏移 + 大小」不能交叉,且总和不能超过对应 Flash 容量(片内 896KB ≤ 1MB,片外 1+1+1+4+9=16MB,刚好满容,无浪费); - 按「读写频率 + 数据类型」分区:
高频写数据(日志)→ 单独大分区 + EasyFlash 磨损均衡;
低频写数据(环境变量、出厂固件)→ 小分区即可;
程序类数据(app、download)→ 大小匹配程序体积; - OTA 相关分区大小一致:
app、download、factory分区大小保持 1MB 左右(app 896KB 接近 1MB),确保新固件能顺利存储和刷写; - 设备名匹配:“
onchip_flash” 和NOR_FLASH_DEV_NAME必须与 FAL 配置的 Flash 设备名一致(比如NOR_FLASH_DEV_NAME对应W25Q128的设备名norflash0),否则 FAL 无法识别分区。
四、OTA 升级 + 数据存储完整工作流程
结合该分区表,设备的核心工作流程如下:
- 设备启动:Bootloader 从片内 Flash 的
app分区加载应用程序,运行后通过env分区的 Token 连接服务器; - OTA 升级触发:服务器推送新固件 → 设备下载新固件到
download分区 → 校验固件完整性; - 固件更新:设备重启 → Bootloader 读取 download 分区的新固件 → 写入
app分区 → 再次重启,运行新程序; - 数据存储:
运行中产生的日志 → 自动写入eflash分区(EasyFlash 管理);
配置修改(如 IP 变更,服务器的token)→ 写入env分区;
需要持久化的文件(如校准文件)→ 存入filesys分区(文件系统管理); - 故障恢复:若
app分区固件损坏 → Bootloader 自动读取factory分区的出厂固件,刷入app分区,恢复设备正常运行。
五、总结
这套分区表完美适配「STM32F407 + W25Q128」的硬件组合,覆盖了嵌入式设备的核心需求:
- OTA 升级:download(下载)+ factory(备份)+ app(运行),确保升级可靠;
- 数据分类:env(配置)+ filesys(文件)+ eflash(日志),避免数据混乱;
- 空间优化:16MB 片外 Flash 全利用,无浪费,且预留扩展空间。
如果后期需要新增功能(比如增加「用户数据分区」存储自定义文件),只需在 eflash 分区前调整偏移和大小(确保不重叠),无需重构整个分区表,维护成本极低。
记住核心逻辑:按数据类型和读写频率分区,OTA 相关分区大小匹配,高频写数据配大空间 + 磨损均衡,就能设计出稳定、易用的 FAL 分区表!
更多推荐



所有评论(0)