STM32 Flash 擦写机制与应用设计:掉电存储与固件升级的底层保障

STM32 Flash 擦写机制与应用设计:掉电存储与固件升级的底层保障

编码文章call10242025-09-02 14:25:485A+A-

Flash 是 STM32 微控制器中最关键的非易失性存储介质,广泛应用于程序存储、掉电数据保存、参数配置以及在线升级(OTA)等场景。本文将从 STM32 Flash 的基本结构与擦写机制入手,分析其典型应用场景及注意事项,帮助开发者理解和正确使用 Flash,构建可靠的嵌入式系统。

一、STM32 Flash 存储结构概述

STM32 系列(如 F1、F4、G0、H7 等)内部 Flash 容量从几十 KB 到几 MB 不等。其特点包括:

  • 字节地址访问:可逐字节、半字、字或双字写入(取决于系列)
  • 按页(Page)或扇区(Sector)擦除:最小擦除单位为页/扇区,不能单字节擦除
  • 擦除后值为全 1(0xFF)
  • 写入时只能将 1 改为 0,不能将 0 改为 1

以 STM32F103 为例:

  • Flash 总容量:64KB/128KB/256KB
  • 最小擦除单位:1KB 页(Page)
  • 编程单位:半字(16位)

以 STM32F4 为例:

  • Flash 分为多个可变大小扇区(Sector),部分为 16KB,部分为 128KB
  • 支持并行擦除与双 Bank 操作(F4 高端系列)

二、Flash 操作流程与注意事项

1. Flash 写入流程

  1. 解锁 Flash 写保护
  2. 校验目标地址是否可写(不能跨页、不能写 0 覆盖已有 0)
  3. 写入数据(使用 HAL 库、裸写或 CMSIS 库)
  4. 校验写入结果
  5. 上锁 Flash,避免意外写操作
HAL_FLASH_Unlock();
HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, address, data);
HAL_FLASH_Lock();

2. 擦除流程

擦除必须以页(Page)或扇区(Sector)为单位,不能精确擦除某个变量。

FLASH_EraseInitTypeDef EraseInitStruct;
uint32_t PageError;
EraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES;
EraseInitStruct.PageAddress = start_addr;
EraseInitStruct.NbPages = pages;
HAL_FLASHEx_Erase(&EraseInitStruct, &PageError);

注意事项:

  • 擦除时间较长(几毫秒),建议使用独立任务或中断保护
  • 擦除操作中不能断电,建议加电压检测(PVD)

三、典型应用场景设计

1. 掉电参数保存(配置存储)

许多嵌入式应用需要将参数(如通信地址、校准值、工作模式等)写入 Flash,以便掉电后保存。

设计建议:

  • 将参数集中存储于某个特定页,避免与主程序混淆
  • 修改前必须擦除整页,更新时采用**“双区 + 标志位”机制**防止中途掉电损坏数据
  • 可采用 CRC 校验保证数据完整性

2. 日志与事件记录

Flash 也可用于保存报警日志、系统故障记录等数据,常见做法:

  • 环形缓冲区:按页或记录循环写入,记录满后覆盖旧记录
  • 标志头 + 数据区:先写入状态标志位,再写入数据,最后更新状态

注意控制写入次数:Flash 擦写寿命通常在 1~10 万次,可使用 wear leveling 技术延长寿命。

3. Bootloader + APP 架构(固件升级)

在线升级场景中,需要在 Flash 中预留空间给两个区:

  • Bootloader 区(通常放在起始地址 0x08000000):负责启动判断、跳转和升级逻辑
  • APP 区(如 0x08004000 开始):主程序存储区域

升级流程:

  1. Boot 判断是否进入升级(如串口接收升级指令)
  2. 擦除 APP 区
  3. 分包接收新固件并写入 Flash
  4. 校验后跳转至新程序

Bootloader 中的关键点:

  • 使用函数指针跳转(需清除中断、重设向量表)
  • 校验程序完整性(如 CRC、MD5)
  • Flash 写入必须避开 Bootloader 自身区域

四、防止误操作与 Flash 使用陷阱

1. 电压问题

Flash 编程对电压要求高,掉电过程中若执行写操作,极可能写坏数据甚至锁死 Flash。

对策:

  • 开启 PVD(Programmable Voltage Detector)功能,在低压时禁止擦写
  • 写前检测供电电压是否充足

2. 写入对齐与编程单位问题

不同 STM32 系列要求的数据写入单位不同:

  • F1/F3:16 位半字(必须地址对齐)
  • F4/H7:32 位或 64 位
  • 写入单位不对齐会导致写入失败或异常

3. 频繁擦写问题

Flash 擦写有寿命限制,频繁操作会加速损耗。

优化建议:

  • 合理设置数据存储周期(如参数变动才写入)
  • 使用 EEPROM 仿真机制(ST 提供 EEPROM Emulation 库)
  • 使用外部 EEPROM 或 FRAM 替代 Flash 作为频繁写入区域

五、仿真与调试技巧

  • 使用 STM32CubeProgrammer 或 ST-Link Utility 工具:可查看 Flash 各扇区状态
  • 打开 Flash 操作日志:调试过程中监控 Flash 写入、擦除地址是否正确
  • 单步调试时避免停在擦除代码处:可能导致假死

六、结语

Flash 的正确使用直接关系到嵌入式系统的稳定性和可维护性。本文从结构原理、擦写机制、典型应用场景到使用注意事项,为开发者提供了一套系统性的指导。无论是参数存储、故障记录还是在线升级,实现 Flash 操作的安全性与可靠性,都是打造高质量产品不可或缺的一环

点击这里复制本文地址 以上内容由文彬编程网整理呈现,请务必在转载分享时注明本文地址!如对内容有疑问,请联系我们,谢谢!
qrcode

文彬编程网 © All Rights Reserved.  蜀ICP备2024111239号-4