一、前言
在STM32嵌入式开发中,内部Flash是掉电存储参数、日志记录、OTA固件升级的核心载体。很多开发者只会调用封装好的读写函数,却不懂底层原理,经常遇到以下问题:
-
Flash写入失败、数据错乱、重复写入异常
-
忘记解锁/上锁,导致程序卡死或读写报错
-
不懂中断读写机制,无法实现非阻塞Flash操作
-
不清楚Flash错误类型,bug无法定位
本文将基于ST官方 stm32f4xx_hal_flash.c 完整源码,从零拆解F4系列Flash的硬件特性、锁机制、读写逻辑、中断处理、错误排查,带你彻底吃透内部Flash驱动。
二、STM32F4 Flash 核心硬件特性
2.1 Flash 外设核心功能
F4系列Flash接口主要负责CPU对Flash的读写访问,核心能力:
-
支持Flash读取、编程(写入)、扇区擦除操作
-
自带读写保护机制,防止数据误篡改
-
指令预取 + 缓存机制,加速代码执行
-
I-Code:64行128bit缓存;D-Code:8行128bit缓存
2.2 关键硬件规则
Flash 硬件固有特性,所有读写代码都必须遵循:
Flash只能写0,不能直接写1:原有数据非0时,必须先擦除(擦除后数据全为0xFF),再写入新数据
操作必须解锁:Flash控制寄存器默认锁定,禁止读写修改,需密钥解锁
电压适配不同写入位宽:8/16/32/64位写入对供电电压要求不同
同一时间仅支持一次Flash操作:忙状态(BSY)未清零时,禁止新操作
三、HAL库Flash整体架构梳理
3.1 模块功能划分
编程操作模块:字节/半字/字/双字写入、查询式/中断式写入
外设控制模块:Flash解锁/上锁、选项字节解锁/启动
状态与错误模块:操作等待、错误码获取、错误标志清零





