「STM32 Flash 操作全解析」擦除、写入、读取一网打尽!附完整源码

「STM32 Flash 操作全解析」擦除、写入、读取一网打尽!附完整源码
2025年07月15日 14:08 电子产品世界

在嵌入式开发中,MCU 内部的 Flash 常用于存储配置信息、日志数据或用于 OTA 升级。STM32F4 系列 MCU 提供了对 Flash 的灵活操作能力,包括按扇区擦除、字节或半字写入等。本文将围绕一段实际使用的 Flash 操作代码进行讲解,主要涉及 Flash 的擦除、写入与读取功能。

STM32F4 MCU 的 Flash 存储器按照扇区(Sector)划分,每个扇区大小不一,例如在 STM32F407 中,前四个扇区大小为 16KB,第五个为 64KB,之后为若干个 128KB 的大扇区。片上 Flash 支持:

  • 扇区级擦除(Sector Erase)

  • 多种对齐方式的编程(如 Byte、Halfword、Word、Double Word)

  • 擦写需先解锁并清除相关标志位

操作前需解锁 Flash 控制器,完成后应及时锁定以防意外写入。

代码中的扇区映射表 sec_map[] 采用结构体 sec_info_t 维护每个扇区的起始地址、大小及编号:

这是一个结构体类型,表示每个扇区的起始地址、扇区大小和扇区编号。接着通过一个常量数组 sec_map[] 列出 Flash 不同扇区的信息:

该映射表根据 STM32F4 的 Flash 布局列出了常用的 8 个扇区。

函数 mcu_flash_erase() 实现对 Flash 指定地址范围的擦除。

  • addr: 要擦除的起始地址

  • size: 要擦除的范围(单位为字节)

函数先计算扇区数量:

然后依次遍历扇区,找出与 addr 和 size 匹配的扇区范围,并执行擦除:

在执行擦除之前必须解锁 Flash:

擦除完成后锁定 Flash:

最后返回 1 表示成功,返回 0 表示擦除失败。

写入函数为:

  • addr: 写入的起始地址

  • buf: 待写入的数据缓冲区

  • size: 写入数据的字节数

写入之前,同样要进行 Flash 解锁,并清除标志位:

然后进入一个循环,按字节或半字方式逐步写入 Flash:

写入完成后更新地址和缓冲区指针:

如果写入中某次操作返回错误,则提前跳出,最后执行锁定操作并返回是否写入成功:

读取函数的接口为:

该函数直接通过内存拷贝读取 Flash 数据:

其中 addr 是 Flash 的起始地址,buf 是目标缓存区,size 是读取字节数。由于 STM32 的 Flash 可以直接映射为内存读取,因此可以像访问普通内存一样操作。

本篇文章介绍了 STM32F4 MCU 内部 Flash 的基础操作实现,包括:

  • 使用结构体映射 Flash 扇区信息

  • 实现 Flash 擦除函数,通过匹配地址范围擦除对应扇区

  • 实现 Flash 写入函数,按字节或半字逐步写入 Flash

  • 实现 Flash 读取函数,通过 memcpy 方式直接读取 Flash 内容

以上代码适用于裸机开发,也可作为 STM32 Flash 操作的基础模板,配合上层协议或文件系统进行扩展应用,如参数存储、数据记录、Bootloader 固件升级等功能。

flash字节
新浪科技公众号
新浪科技公众号

“掌”握科技鲜闻 (微信搜索techsina或扫描左侧二维码关注)

创事记

科学探索

科学大家

苹果汇

众测

专题

官方微博

新浪科技 新浪数码 新浪手机 科学探索 苹果汇 新浪众测

公众号

新浪科技

新浪科技为你带来最新鲜的科技资讯

苹果汇

苹果汇为你带来最新鲜的苹果产品新闻

新浪众测

新酷产品第一时间免费试玩

新浪探索

提供最新的科学家新闻,精彩的震撼图片