在嵌入式物联网设备开发中,OTA 固件升级分区分工存储是核心需求 —— 既要支持远程更新程序,又要妥善保管环境变量、日志、文件等数据。本文基于 RT-Thread FAL 组件,结合 STM32F407(1MB 片内 Flash)和 W25Q128(16MB 片外 Flash),详解一套覆盖「OTA 升级、环境配置、文件管理、日志存储」的完整分区表设计,附实际场景落地逻辑。

一、分区表核心背景

硬件基础

  1. 主控:STM32F407ZGT6(内置 1MB 片内 Flash,速度快,适合运行核心程序)
  2. 外接存储:W25Q128(16MB 串行 NOR Flash,容量大,通过 SPI 总线连接,负责扩展存储)
  3. 核心组件: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. 大空间支持日志循环覆盖,无需手动清理

三、分区表设计核心原则(避坑关键)

  1. 无重叠、不超容:
    所有分区的「偏移 + 大小」不能交叉,且总和不能超过对应 Flash 容量(片内 896KB ≤ 1MB,片外 1+1+1+4+9=16MB,刚好满容,无浪费);
  2. 按「读写频率 + 数据类型」分区:
    高频写数据(日志)→ 单独大分区 + EasyFlash 磨损均衡;
    低频写数据(环境变量、出厂固件)→ 小分区即可;
    程序类数据(app、download)→ 大小匹配程序体积;
  3. OTA 相关分区大小一致:
    app、download、factory 分区大小保持 1MB 左右(app 896KB 接近 1MB),确保新固件能顺利存储和刷写;
  4. 设备名匹配:onchip_flash” 和 NOR_FLASH_DEV_NAME 必须与 FAL 配置的 Flash 设备名一致(比如 NOR_FLASH_DEV_NAME 对应W25Q128的设备名 norflash0),否则 FAL 无法识别分区。

四、OTA 升级 + 数据存储完整工作流程

结合该分区表,设备的核心工作流程如下:

  1. 设备启动:Bootloader 从片内 Flash 的 app 分区加载应用程序,运行后通过 env 分区的 Token 连接服务器;
  2. OTA 升级触发:服务器推送新固件 → 设备下载新固件到 download 分区 → 校验固件完整性;
  3. 固件更新:设备重启 → Bootloader 读取 download 分区的新固件 → 写入 app 分区 → 再次重启,运行新程序;
  4. 数据存储
    运行中产生的日志 → 自动写入 eflash 分区(EasyFlash 管理);
    配置修改(如 IP 变更,服务器的token)→ 写入 env 分区;
    需要持久化的文件(如校准文件)→ 存入 filesys 分区(文件系统管理);
  5. 故障恢复:若 app 分区固件损坏 → Bootloader 自动读取factory分区的出厂固件,刷入app分区,恢复设备正常运行。

五、总结

这套分区表完美适配「STM32F407 + W25Q128」的硬件组合,覆盖了嵌入式设备的核心需求:

  • OTA 升级:download(下载)+ factory(备份)+ app(运行),确保升级可靠;
  • 数据分类:env(配置)+ filesys(文件)+ eflash(日志),避免数据混乱;
  • 空间优化:16MB 片外 Flash 全利用,无浪费,且预留扩展空间。

如果后期需要新增功能(比如增加「用户数据分区」存储自定义文件),只需在 eflash 分区前调整偏移和大小(确保不重叠),无需重构整个分区表,维护成本极低。
记住核心逻辑:按数据类型和读写频率分区,OTA 相关分区大小匹配,高频写数据配大空间 + 磨损均衡,就能设计出稳定、易用的 FAL 分区表!

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐