15_片内flash模拟EEPROM
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
L
e i
)
LTK
女娲STM32开发板使用手册
修订历史
L T
K (L
e i
T e
k )
目录
第15 片内flash 模拟EEPROM (3)
章 Flash 和EEPROM (3)
15.1 Flash 和EEPROM 对比 .......................................................... 3 15.1.1 内部Flash 模拟EEPROM 原理.............................................. 3 15.1.2 Flash 掉电数据恢复 ................................................................ 5 15.1.3 内部flash 应用实例 ----- 模拟EEPROM .. (6)
15.2 实例描述 ................................................................................ 6 15.2.1 实验效果 ................................................................................ 6 15.2.2 硬件设计 ................................................................................ 6 15.2.3 软件设计 .. (6)
15.2.4
k )
片内flash 模拟EEPROM
第15章 Flash 和EEPROM
15.1 Flash 和EEPROM 对比
15.1.1为了节省成本,STM32内部没有集成EEPROM ,当我们需要存储一些数据时,可使用内部flash 来模拟EEPROM 。
不像flash 存储器,EEPROM 在向存储空间重新写入数据时,不需要做擦除操作。
由于外部EEPROM 和内部flash 模拟的EEPROM 的写入方式有所不同,所以使用内部flash 模拟EEPROM 时,要使用掉电恢复机制。 以下表格是他们的主要区别。
内部Flash 模拟EEPROM 原理
15.1.2考虑到flash 存储器的局限性以及产品的需求,模拟EEPROM 至少需要两页容量大小完全相等的flash ,其中第0页已经擦除过,可以进行写操作。当第0页写满了以后,第1页需要回收第0页内的有效数据,若此时需要新写入的数据,也会写入第1页。每一页的开头16位都有一个状态标志,描述当前页的状态。
每页的状态可能为下面3个状态中的一个: ERASED: 该页为空
L T
K
(L
e i
T e
k )
● RECEIVE_DATA: 该页正在从另外一个已满的页接收数据
● VALID_PAGE: 该页包含有效数据,该页的状态一直保持不变,直到所
有有效数据完全传输到另外一个 ERASED 的页。 第0页和第1页的状态转换如下图所示:
每个存储在flash 内变量都定义了一个虚拟地址和一个数值,该数值以后可以读取和更新,当该数值改变后,该数值连同其对应的虚拟地址一起存储到一个新的flash 存储地址。当需要读取该数值时,返回的是最近修改的数值。在本实
例中,虚拟地址和该数值都是16位。其格式如下:
下图描述了内部flash 模拟EEPROM 存储三个变量的流程,其中三个变量名及其对应的值分别为: var1(0x5555),var2(0x6666),var3(0x7777)。
L T
K (L
e i
T e k )
Flash 掉电数据恢复
15.1.3当正在更新flash 数据时,这时候掉电,有可能会损坏flash 数据。
为了检测到这种数据损坏,并且恢复数据,在开机的时候立马执行
ltk_ee_init ,其原理是,该函数使用存储数据页的状态,来判断该页数据是否
已经损坏,如果数据损坏了,则修复数据。页头的状态有9个可能的组合,其中
的3个组合为有效组合,如下图所示:
L T
K (L
e i
T e
k )
内部flash 应用实例 ----- 模拟EEPROM
15.2 实例描述
15.2.1本实例使用STM32内部的flash 来模拟EEPROM 。解锁flash 后,便可以操作内部flash ,一开始要做掉电恢复,通过函数ltk_ee_init 来实现,然后向内部flash 写入/读取三个变量,通过串口输出变量的值来检测flash 模拟EEPROM 读写是否成功。
实验效果
15.2.2烧录该软件后,用USB 线连接到开发板上标有UART 的USB 口,在电脑的串口终端工具(如 secureCRT )内会输出该三个变量的值。
硬件设计
15.2.3该实例使用内部flash 来模拟EEPROM ,无需外部电路。
软件设计
15.2.4我们先从main 开始,该函数在应用层文件eeprom_emulation_main.c 内实现,主函数首先初始化串口。要读写内部flash ,首先要解锁flash ,然后做掉电检测,通过调用函数ltk_ee_init 来检测flash 的内容是否有损坏。最后调用函数
ltk_ee_write_variable 来向内部flash 写入数据,再调用函数
ltk_ee_read_variable 读取内部
flash 内保存的变量的值,通过串口打印出来。
1 /**
2 * 描述: 主函数,连续保存多个数据到 EEPROM ,然后读出,检查保存和读取出来的数据
3 * 是否一致
4 * 参数: 无
5 * 返回: 无
6 */
7 int main(void )