简介
本文介绍了使用 HT32 系列微控制器的嵌入式 Flash 内存来模拟 EEPROM 的软件方法。
外部 EEPROM 是一种非挥发性储存器,通常以 byte、half-word 或word 为单位来写入数据,在许多嵌入式应用中常被使用。将数据写入 EEPROM 很简单,可以连续对同一个内存地址 写入新值,不像 Flash 内存,还需要穿插擦除操作才能完成。
对于一些使用嵌入式 Flash 内存的微控制器,其应用只有很少的信息需要保存在 EEPROM 中。在这种情况下,使用软件模拟 EEPROM,可以减少一些外部芯片、元件和 PCB 空间来降低系统成本。
主要差异
EEPROM 的写入/擦除次数高于 Flash 内存,但 Flash 内存的访问时间比 EEPROM 快。此外, Flash 内存需要穿插擦除操作才能完成数据覆写。外部 EEPROM 和嵌入式 Flash 内存之间的主要差异如表 1 所示。
| 外部 EEPROM (HT24LC64)
| 嵌入式 Flash 内存 (HT32 系列) | 写入时间
| 5ms
| 字编程时间:40μs
| 擦除时间
| N/A
| 页/整片擦除时间:20ms
| 写入/擦除次数
| 10,000K
| 20K
|
表 1 EEPROM 和Flash 内存之间的差异
外部 EEPROM 和模拟 EEPROM 的写入方法也不同。对于外部 EEPROM,CPU 复位不会中断写入操作,只有断电才会造成数据的丢失。对于模拟 EEPROM,CPU 复位和断电都将中断写入操作。产品应用的系统设计师应分析这些差异,决定异常发生时的处理程序。
使用寿命问题
虽然 Flash 内存的使用寿命比 EEPROM 短,本文件中所述的软件方法可以通过平均分散 Flash
内存页面的写入/擦除次数,提高模拟 EEPROM 的使用寿命,达到 1,000K 次。
实施
方法
EEPROM 模拟至少需要两个相同大小的 Flash 内存页面来储存非挥发性数据。一个页面最初 处于 ACTIVE 状态,提供应用程序读取和写入有效数据。另一个页面处于 ERASED 状态,在 ACTIVE 页已满时接替它。每个页面都有三种可能的状态:
图 3 模拟 EEPROM 的操作流程
数据格式
模拟EEPROM的数据格式是由一个16位的数据索引和一个16位的数值所组成。每笔写入的资料是依次放置的。连续写入相同索引的数据不会覆盖原来的数据,但会附加上去。扣掉用来记录页面状态的32位,以一个1KB的Flash内存页面为例,总共可容纳255笔16位的数据直到页满。
操作流程
下图显示了模拟EEPROM的操作流程。在本例中,会写入四个不同索引值的数据,不包括0xFFFF。
数据格式的位长度
上述例子中的数据格式是 16/16 位的数据索引和数值。根据应用程序的不同需求,可以调整 数据格式的位长度。例如:8/8 位,8/24 位或 32+32 位数据索引和数值。
初始化和错误回复
在断电发生后,应考虑 EEPROM 模拟软件的初始化和错误回复。上电后,初始化函数应该在任何数据被写入或从模拟 EEPROM 读取之前运行。当断电导致页面状态或数据异常,初 始化函数必须先修正这些问题。
| Page 1 | ERASED
| TRANSFER
| ACTIVE |
Page 0
|
ERASED
| [无效] TODO:擦除两个页, page 0 设为 ACTIVE | [有效] TODO:擦除 page 0, page 1 设为 ACTIVE | [有效] TODO:擦除 page 0, page 1 设为 ACTIVE |
TRANSFER
| [有效] TODO:擦除 page 1, page 0 设为 ACTIVE | [无效] TODO:擦除两个页, page 0 设为 ACTIVE | [有效] TODO:重做转移到 page 0,擦除 page 1 |
ACTIVE
| [有效] TODO:擦除 page 1, page 0 设为 ACTIVE | [有效] TODO:重做转移到 page 1,擦除 page 0 | [无效] TODO:擦除两个页, page 0 设为 ACTIVE | 表 2 有效页面状态和无效页面状态
擦写循环能力
擦写循环能力取决于应用程序使用的数据量/大小,模拟 EEPROM 的寿命是有限的,由最频繁写入的数据的更新速率决定。
在这个例子中使用了两个 1KB 页面,写入 16/16 位的数据索引和数值。最大的写入/擦除次 数可达 10,200K(2 页面×20K 次×255 笔数据)。对于一个使用 4 个数据的应用程序,每个数据的更新速率是 20 次/小时,它的寿命是127,500 小时,也就是 14.55 年。如果使用四个页面来模拟 EEPROM,寿命将是双倍。
|