如何将Flash模拟成EEPROM (EEPROM Emulation)

如何将Flash模拟成EEPROM (EEPROM Emulation)

温馨提示:
本文参考《EEPROM Emulation with Qorivva MPC55xx, MPC56xx, and MPC57xx Microcontrollers》
关注公众号“嵌入式软件实战派”,并回复“EEP”可获得本文PDF版和《EEPROM Emulation with Qorivva MPC55xx, MPC56xx, and MPC57xx Microcontrollers》文档。

EEPROM与Flash Memory 特性

EEPROM 和Flash都是非易失性存储器,这意味着它们在断电后仍保留其数据。 它们都由一组存储单元(memory cells )组成,其中每个存储单元保存一位或多位信息。 在一些设计中,多个单元组合形成一个位。

在每个存储单元保存一位信息的 EEPROM 和Flash中,(对于Qorivva MPC55xx/MPC56xx/MPC57xx 等芯片)存储单元的默认擦除状态读取为二进制 1。对存储单元进行编程会将其值从二进制 1 更改为二进制 0,并且擦除存储单元会更改其值 值从 0 到 1。编程不能反向工作:只有擦除操作才能将存储单元的值从 0 更改为 1。

如何将Flash模拟成EEPROM (EEPROM Emulation)_第1张图片

EEPROM通常是以一个Byte或者Word为单位写入和擦除的,即擦写是以Byte或Word为边界,这样就使得EEPROM擦写比较独立自由,也不会影响其他数据。另外,EEPROM的擦写寿命(PE cycles)是比较高的,达百万次。

而Flash(以Qorivva Device为例)通常是以Word或Double-Word为写入单位,但是擦除却以Block为单位,这个Block大小往往又是以KB衡量的。这些都是半导体制造工艺或设计特性有关,这也使得Flash的容量非常大,但擦写寿命很短(通常只有十万次PE cycles)。

使用Flash Memory模拟EEPROM

将Flash模拟成EEPROM来使用,会遇到两个问题:

  1. 修改Flash中存储的值需要擦除整个内存块。
  2. 频繁更新数据的应用程序必须注意PE cycles要求。

那么,怎么可以完美解决这两个问题呢?

可以通过Record(记录)列表的方式来实现,每个Record都是一个或多个变量的组合。每条Record还有一个标签(Tag),用于标识Record中包含的变量、Record的大小以及Record是否有效。

一组Flash Block被设定为 EEPROM emulation block。从这组块中,选择一个块作为Active Block。Record被编程到Active Block中的连续内存位置。为了更新Record,软件将Record的更新版本添加到Active Block中的下一个可用位置。读取Record是通过检索带有匹配标记的最近写入的Record(即最后一条Record)来完成的。

当Active Block变满时,软件将Active Block内的所有有效Record复制到其他 EEPROM emulation block之一中。这个新Block成为Active Block,然后擦除前一个Active Block。由于此块交换过程会清除过时的Record,因此新的Active Block将有空间用于进一步的Record更新。

Record结构

Record分为两个主要部分:

  • Data Segment,即数据部分,其中保存应用程序变量,
  • Metadata Segment,即元数据部分,其中包含管理和检索Record中数据所需的所有信息。

Metadata Segment进一步细分为其他字段:

  • Record Status Field,即Record状态字段,该字段用于从错误中恢复和保持数据一致性。
  • ID Field,即ID 字段,此字段用于标识Record中包含的数据。
  • Size Field,即大小字段,该字段用于确定数据段内的数据字节数。

以上的ID Field和Size Field的长度是可以根据应用而设置不一样的,但是Record Status Field却不能随意设置,这个跟Flash的ECC有关。

下图,根据Flash的ECC不同,有两种不同的设计:

如何将Flash模拟成EEPROM (EEPROM Emulation)_第2张图片
如何将Flash模拟成EEPROM (EEPROM Emulation)_第3张图片

你可能感兴趣的:(计算机,stm32,c语言,单片机)