对stm32 flash 模拟eeprom的一些理解

目录

一、简介

二、使用外部eeprom和仿真eeprom之前的差异

三、实现eeprom仿真的原理

四、数据丢失的异常处理

五、代码及原文文档下载地址


本文参考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

 

猜你喜欢

转载自blog.csdn.net/zhuimeng_ruili/article/details/112630215