AN3969
应用笔记
STM32F40x/STM32F41x 微控制器中的 EEPROM 仿真
简介
在工业应用中经常使用 EEPROM(电可擦除可编程只读存储器)来存储可更新的数据。
EEPROM 是用在复杂系统(例如计算机)和其它电子器件中的一种永久(非易失)存储器
存储系统,它可以在电源故障时存储和保留少量数据。
为降低成本,外部 EEPROM 可以用 STM32F40x/STM32F41x 的以下功能之一替代:
● 片内 4 KB 备份 SRAM
● 片内 Flash,具有特定软件算法
STM32F40x/STM32F41x 具有 4 KB 备份 SRAM,当主 VDD 电源断电时,可通过 VBAT 电源
为该 SRAM 供电。
借助 CPU 频率下的高速访问(通常在用电池供电的应用中)优势,只要 VBAT 存在,此备份
SRAM 就可以用作内部 EEPROM(不带任何附加软件)。
但是,当备份 SRAM 用于其它目的并且/或者应用不使用 VBAT 电源时,片内 Flash(具有特
定软件算法)可以用于仿真 EEPROM 存储器。
本应用笔记介绍了使用 STM32F40x/STM32F41x 器件的片上 Flash 通过仿真 EEPROM 机制
来取代独立 EEPROM 的软件解决方案。
要实现这种仿真,至少要使用 Flash 中的两个扇区。EEPROM 仿真代码会在扇区填满后,
以对用户透明的方式交换数据。
此应用笔记随附的 EEPROM 仿真驱动程序满足以下要求:
● 提供简单 API 的轻量级实现,这种 API 由初始化、读写数据和降低存储器占用量三种功
能构成。
● 简单且可轻松更新的代码模型
● 对用户透明的清除和内部数据管理
● 后台扇区擦除
● 至少使用两个 Flash 扇区,如果需要进行耗损均衡,则需要更多
要仿真的 EEPROM 大小可在扇区大小的限制范围内随意调整,并允许 EEPROM 使用扇区的
最大空间。
2011 年 10 月
文档 ID 022108 第 1 版
1/20
www.st.com
目录
目录
1
2
3
AN3969
外部 EEPROM 与仿真 EEPROM 之间的主要差异 . . . . . . . . . . . . . . . . . . . 5
1.1 写访问时间上的差异 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
1.2 擦除时间上的差异 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
1.3 写方法上的相似之处 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
实现 EEPROM 仿真 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.1 原理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.2 使用实例:应用示例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
EEPROM 仿真软件说明 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
2.3
EEPROM 仿真内存占用量 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
2.4
2.5
EEPROM 仿真时间 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
3.2.1
嵌入式应用的相关信息 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
3.1 数据粒度管理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
3.2 耗损均衡:增加 Flash 可擦写次数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
耗损均衡实现示例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
3.3 断电时的页头恢复 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
3.4 循环性能和页分配 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
循环性能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
Flash 页分配 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
3.5 实时注意事项 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
3.4.1
3.4.2
4
版本历史 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
2//20
文档 ID 022108 第 1 版
AN3969
表格索引
表格索引
表 1.
表 2.
表 3.
表 4.
表 5.
表 6.
表 7.
表 8.
表 9.
外部 EEPROM 与仿真 EEPROM 之间的差异. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
仿真页可能的状态和相应操作 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
STM32F40x/STM32F41x Flash 扇区 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
API 定义 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
EEPROM 仿真机制的内存占用量 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
系统时钟为 168 MHz 的 EEPROM 仿真时间 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
Flash 编程函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
应用设计 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
文档版本历史 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
文档 ID 022108 第 1 版
3/20
3
图片索引
图片索引
AN3969
图 1.
图 2.
图 3.
图 4.
图 5.
图 6.
在 page0 与 page1 之间切换的头状态 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
EEPROM 变量格式. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
数据更新流程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
WriteVariable 流程图 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
EEPROM 仿真的 Flash 占用情况(机制和存储) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
四页的页交换机制(耗损均衡) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
4/20
文档 ID 022108 第 1 版
AN3969
外部 EEPROM 与仿真 EEPROM 之间的主要差异
1
外部 EEPROM 与仿真 EEPROM 之间的主要差异
EEPROM 是许多需要非易失性数据存储的嵌入式应用的关键组件,它在运行期间以字节或
字为粒度。
这些系统中使用的微控制器通常是基于嵌入式 Flash 存储器的。为了避免使用这些组件、节
约 PCB 空间并降低系统成本,可使用 STM32F41x Flash 代替外部 EEPOM,模拟代码和数
据的存储。
但是与 Flash 不同的是,外部 EEPROM 在重写数据之前并不需要执行擦除操作来释放空
间。要将数据存储到嵌入式 Flash 中,需要执行特殊的软件管理。
这种仿真软件机制由许多因素决定,包括 EEPROM 可靠性、所使用的 Flash 的架构以及产
品要求等。
对于使用相同 Flash 技术的任何微控制器(不局限于 STM32F40x/STM32F41x 系列产品),
嵌入式 Flash 和外部串行 EEPROM 之间的主要差异完全一致。表 1 中汇总了这些主要差异。
表 1.
外部 EEPROM 与仿真 EEPROM 之间的差异
特性
写时间
外部 EEPROM
(例如,M24C64:
I²C 串行访问 EEPROM)
— 5 ms 内的随机字节写入。
字编程时间 = 20 ms
— 5 ms 内的页(32 字节)写
入。字编程时间 = 625 μs
擦除时间
N/A
写方法
— 启动之后即与 CPU 无关
— 只需要正确供电
读访问
— 串行:100 μs
— 随机字:92 μs
— 页:每字节 22.5 μs
写/ 擦除循
环次数
100 万次写循环
使用片上 Flash 仿真的
EEPROM
使用片上备份 SRAM 仿真的
EEPROM(1)
半字编程时间:30 μs 到
237.25 ms (2)
CPU 速度,0 等待周期
扇区(大页面)擦除时间:1 s 到
3 s(取决于扇区大小)
NA
启动之后即与 CPU 相关。
如果写操作因软件复位而中断,
EEPROM 仿真算法会停止,但是
当前的 Flash 写操作不会因 CPU
复位而中断。
可以按字节(8 位)、半字
(16 位)或全字(32 位)形式进
行访问。
可以按字节(8 位)、半字
(16 位)或全字(32 位)形式进
行访问。
软件复位会中断写操作。
并行:(@168 MHz) 半字访问时
间为 0.68 μs 到 251 μs (2)
CPU 速度,1 等待周期
每扇区(大页面)1 万次循环。
使用多个片上 Flash 页等同于增
加写循环次数。请参见第 3.4 节:
循环性能和页分配。
只要存在 VBAT,就没有限制
1. 有关备份 SRAM 用法的详细信息,请参见 STM32F40x/41x 参考手册 (RM0090) 的“电池备份域”部分。
2. 有关更多详细信息,请参见第 2.5 章: EEPROM 仿真时间。
文档 ID 022108 第 1 版
5/20
19
外部 EEPROM 与仿真 EEPROM 之间的主要差异
AN3969
1.1
写访问时间上的差异
由于 Flash 的写访问时间较短,所以对于一些关键参数,在仿真 EEPROM 中的存储速度要
比在外部串行 EEPROM 中更快,从而可以改善数据存储。
1.2
擦除时间上的差异
注:
1.3
擦除时间方面的差异是独立 EEPROM 与使用嵌入式 Flash 的仿真 EEPROM 之间的另一个
重大差异。与 Flash 不同,EEPROM 在写之前不需要执行擦除操作来释放空间。这就意味
着必须执行某种形式的软件管理,才能将数据存储到 Flash 中。此外,由于 Flash 中的块擦
除过程需要较长时间,所以在设计 Flash 管理软件时,应注意考虑可能会中断擦除过程的电
源关闭和其它一些意外事件(例如复位)。要设计强大的 Flash 内存管理软件,必须透彻了
解 Flash 擦除过程。
即使 CPU 复位,也不会中断正在对 STM32F40x/STM32F41x 嵌入式 Flash 执行的扇区擦除
或批量擦除操作。
写方法上的相似之处
外部 EEPROM 与具有 STM32F40x/STM32F41x 嵌入式 Flash 的仿真 EEPROM 之间的一个
相似之处是写方法。
● 独立外部 EEPROM:一旦 CPU 启动后,字的写操作便不能被 CPU 复位中断。只有供电
故障才会中断写过程,因此正确设置去耦电容的大小可以保护独立 EEPROM 中的整个
写过程。
● 使用嵌入式 Flash 仿真的 EEPROM:由 CPU 启动后,写过程可由电源故障中断。即使
CPU 复位,也不会中断正在对 STM32F40x/STM32F41x 嵌入式 Flash 执行的字写入操
作。EEPROM 算法会停止,但是当前的 Flash 字写入操作不会因 CPU 复位中断。
6/20
文档 ID 022108 第 1 版
AN3969
实现 EEPROM 仿真
2
实现 EEPROM 仿真
2.1
原理
EEPROM 仿真可以通过多种方式实现,但要注意 Flash 限制和产品要求。下面详述的方法
要求为非易失性数据分配至少两个相同大小的 Flash 扇区:一个在开始时擦除,支持逐字编
程;另一个在需要对前一扇区执行垃圾回收时接管工作。占用每扇区前半个字(16 位)的头
字段指示扇区的状态。在本文档的其余部分,将每一个扇区视为一页,这些页分别称为
Page0 和 Page1。
头字段位于每页的基准地址上,并提供该页的状态信息。
每个页都有三个可能的状态:
●
●
●
ERASED:页为空。
RECEIVE_DATA:页正在从另一个满页接收数据。
VALID_PAGE:页中包含有效数据,并且在将所有有效数据完全传输到已擦除页之前,
此状态不会改变。
图 1 显示页的状态如何改变。
图 1.
在 page0 与 page1 之间切换的头状态
文档 ID 022108 第 1 版
7/20
19
实现 EEPROM 仿真
AN3969
表 2.
仿真页可能的状态和相应操作
Page1
ERASED
无效状态
ERASED
操作:将两个页擦除并将
page0 格式化
RECEIVE_DATA 操作:擦除 Page0 并将
Page1 标记为 VALID_PAGE
VALID_PAGE
操作:将 page1 用作有效
页并擦除 page0
Page0
RECEIVE_DATA
VALID_PAGE
操作:将 Page1 擦除并将
Page0 标记为 VALID_PAGE
操作:将 page0 用作 有效 页 并
擦除 page1
无效状态
操作:将两个页擦除并将 page0
格式化
操作:将 page1 用作有效页并
将上次更新的变量从 page1 传
送到 page0,同时将 page0 标
记为有效页并擦除 page1
操作:将 page0 用作 有效 页 并
将上次更新的变量从 page0 传
送到 page1,同时 将 page1 标
记为有效页并擦除 page0
无效状态
操作:将两个页擦除并将 page0
格式化
通常,使用这种方法时,用户事先并不了解变量更新频率。
本文档所述的软件和实现方法使用两个大小为 16 KB 的 Flash 扇区(扇区 2 和扇区 3)来仿
真 EEPROM。
注:
由于扇区 2 和扇区 3 的大小比 STM32F40x/STM32F41x Flash 的其它扇区小,因此我们选择这
两个扇区(表 3:STM32F40x/STM32F41x Flash 扇区中介绍了 STM32F40x/STM32F41x Flash
的主存储器块划分)。根据具体应用和用户需要,可以选择更大的扇区。
表 3.
STM32F40x/STM32F41x Flash 扇区
名称
扇区 0 到扇区 3
扇区 4
扇区 5 到扇区 11
扇区大小
16 KB
64 KB
128 KB
每个变量元素都由一个虚拟地址和值来定义,它们将存储在 Flash 中,用于执行后续检索或
更新(在实施的软件中,虚拟地址和数据的长度均为 16 位)。如果修改了数据,与之前虚
拟地址相关联的已修改数据将会存储到新的 Flash 位置。数据检索会返回最新的数据值。
8/20
文档 ID 022108 第 1 版