如果你的MCU的flash足够大。并且你的MCU提供自编程flash指令。则可以通过flash模拟出一片eeprom区域。用于存储数据。
本文参考ST公司的AN2594文档。使用ST提供的范例。旨在了解如何使用Flash模拟出一片eeprom。
由表我们得到擦除时间的比较。内部模拟的显然速度快了。然而我要提醒的是如果你存放于模拟EEPROM的数据需要频繁更改。这里的频繁指的是时间小于页擦除时间。由于模拟的eeprom是使用flash,所以只能整页进行擦除。所以建议频繁修改的数据不要使用模拟的eeprom。但是如果只是单纯存放掉电前的数据或者1s钟记录一段数据则是可以考虑的。这样可以节省外部eeprom的成本。
上图我们得到ST公司提供的例程是使用两页的flash进行模拟。为什么用两页呢。如果只用一页,我考虑了一下。由于只有一页。数据只能一直往下写。会有满的时候。而且更改数据后。前面的数据不会被擦除。当其中一页写满了。就会将该页不重复的数据由下到上得搬到第二页,同时擦除第一页。
这张图就是最关键的一张图。有利于了解如何存放数据和读取数据。模拟出的eeprom有两部分组成。分别是虚地址和数据。都为16bit。虚地址存在在高位。数据存在低位。
比如一开始在虚地址0x7777H写入数据0x1232H。数据存放如图所示。如果再在同一地址写入另外一个数,则数据存在下一个位置。但是前面的数据并不会马上被擦除掉。如果此时要使用ST的函数读取0x7777H虚地址的数据。那么读出来的是0X1245H而不是0x1232H。因为读取的时候是从下往上读取。读取到第一个符合该地址的数据。这样就很好理解了。
当数据写满的时候。这时写入的新数据将被存在第二页。此时会自动调用函数将第一页不重复的数据拷贝到第二页。比如我们的虚地址0X7777H和0X5555H的数据。如图所示。然后将第一页擦除。两页交替使用。说到这里,你也许明白为什么频繁修改的数据不适合存在模拟的eeprom里面了。如果频繁修改。那么很快一页就写满了。然后需要擦除这一页。需要20ms。后面的事你都明白啦?
由于我的知识有限,只能了解那么多。如果要将程序移植到别的单片机。可以参照这样的思路。呵呵。
下面是一点学习心得。
// Note By ChenFen
/*
1.使用STM32内部Flash 模拟EEPROM进行读写,定义两页Flash分别为page0 page1
Flash模拟的起始地址修改位置为eeprom.h中的EEPROM_START_ADDRESS
2.修改eeprom.h 文件中的 NumbOfVar 实现所需存储变量数量
3.修改 VirtAddVarTab[NumbOfVar] 实现虚拟地址的修改
4.写入时写入数据紧跟后面写入虚地址VirtAddVarTab(0<=i<NumbOfVar)
5.每个Page第一个地址写入该页状态(Earse,Reveice,Vild)
6.相同地址再次写入时不会把上次写的擦掉,而是在模拟EEPROM区尾部未写过的地方再次写入数据、 虚地址,
读的时候是从尾部开始匹配地址,也就是读取最后一次写的内容。
7.模拟EEPROM区分为2页,如果一页满了把这一页内地址不重复的数据复制到另一页后擦除,2页交替使用。
8.添加字符串存储函数,改变为1个16bit地址存储两位字符串的8bit ASCII码 |