目录
本文参考st官方文档
AN4061 STM32F0xx 微控制器中的EEPROM 仿真
AN2594 EEPROM emulation in STM32F10x microcontrollers
一、简介
在工业应用中经常使用 EEPROM(电可擦除可编程只读存储器)来存储可更新的数据。EEPROM 是用在复杂系统(例如计算机)和其它电子器件中的一种永久(非易失)存储器
存储系统,它可以在电源故障时存储和保留少量数据。为了降低成本,可以使用特定的软件算法用片上 Flash 替代外部 EEPROM
二、使用外部eeprom和仿真eeprom之前的差异
三、实现eeprom仿真的原理
首先使用 2 页 FLASH 空间,如果 0 页空间写满数据,那么把 0 页空间里面的【有效数据】复制到 1 页,如果 1页数据满那么把 1 页空间里面的【有效数据】复制到 0 页,这样循环使用,当然如果你想增加使用寿命可以增加多页循环,官方例子只是按 2 页实现的例子。每页前面 4 字节保留,其中前 2 字节是该页状态标志。
下面的图显示数据在 FLASH 中的保存格式:
每个变量元素都由一个虚拟地址和值来定义,它们将被存储在 Flash 中,用于执行后续检索
或更新(在实施的软件中,虚拟地址和数据的长度均为 16 位)。如果修改了数据,与之前虚拟地址相关联的已修改数据将会存储到新的 Flash 位置。数据检索会返回最新的数据值。
图 3 显示了数据更新的过程:
1. 写数据
假设保存的数据虚拟地址是 0X7777,那么程序写数据是从当前有效页页首地址开始查询虚拟地址位置为 0XFFFF 的空间,如果是 0XFFFF 那么该位置可以保存数据;如果不是,那么继续找下 1 个位置,如果本页无 0XFFFF 的空间那么表示本页已满,那么将本页【有效数据】复制到另外 1 页继续保存数据。当两次保存同一虚拟地址的数据时如上图第一列第二个方框所示:从上到下,第 2 个虚拟地址是 0X7777 对应的数据 1245 才是有效的。清楚了这点,那么读数据要怎么处理基本就明白了。
2. 读数据
读数据时是从有效页的末尾地址开始检测是否是有效数据,如果是那么立即返回,程序是通过虚拟地址判断有效数据的,第 1 个匹配的虚拟地址的数据才是有效的
3. 页满时处理数据
说到这里,看到不少使用例子程序不成功的问题,那么就请注意下面了,他们的错误估计是下面的原因造成的。当 1 页写满时其实里面有很多无效数据,你只需要将【有效数据】复制到另外 1 页就行。
简单的说就是写的时候从头至尾写,读的时候从尾至头读,保证获取到最新的数据。。。。
四、数据丢失的异常处理
在flash数据擦写中,如果碰到启动的瞬间,电源不稳定,在数据擦除之后,芯片可能出现复位,导致数据的丢失。或者是在flash擦写过程中被中断打断,可能也会造成flash的数据丢失。所以需要做一些机制来防止该问题。
下图的流程图是使用两个空间来进行数据的存放,一个位置作为数据的主存储区,数据的读取全部从该块flash来进行读取。另一个位置作为数据备份区,当主存储区数据擦写异常时,用来恢复主存储区的数据。
五、代码及原文文档下载地址
https://www.stmcu.org.cn/document/detail/index/id-200203