原创 心得体会:如何使用STM32的Flash来模拟eeprom

2010-8-30 11:24 16726 9 20 分类: MCU/ 嵌入式

ST原版模拟eeprom范例


//我的模拟eeprom范例


       如果你的MCU的flash足够大。并且你的MCU提供自编程flash指令。则可以通过flash模拟出一片eeprom区域。用于存储数据。


 


       本文参考ST公司的AN2594文档。使用ST提供的范例。旨在了解如何使用Flash模拟出一片eeprom。


 


64f8197d-b8d8-4477-b3e8-7c44be59f5d4.jpg


       由表我们得到擦除时间的比较。内部模拟的显然速度快了。然而我要提醒的是如果你存放于模拟EEPROM的数据需要频繁更改。这里的频繁指的是时间小于页擦除时间。由于模拟的eeprom是使用flash,所以只能整页进行擦除。所以建议频繁修改的数据不要使用模拟的eeprom。但是如果只是单纯存放掉电前的数据或者1s钟记录一段数据则是可以考虑的。这样可以节省外部eeprom的成本。


 


473a4c21-f3d8-4f26-a2e1-d478570857a5.jpg


 


       上图我们得到ST公司提供的例程是使用两页的flash进行模拟。为什么用两页呢。如果只用一页,我考虑了一下。由于只有一页。数据只能一直往下写。会有满的时候。而且更改数据后。前面的数据不会被擦除。当其中一页写满了。就会将该页不重复的数据由下到上得搬到第二页,同时擦除第一页。


5a783746-c1ab-4d86-aede-e5fc3567566e.jpg


        这张图就是最关键的一张图。有利于了解如何存放数据和读取数据。模拟出的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码


 


 

PARTNER CONTENT

文章评论11条评论)

登录后参与讨论

用户186657 2015-12-2 11:23

很不错,很需要

用户1331924 2015-10-28 15:44

正好可以用到,感谢楼主!

用户1647909 2015-3-2 21:32

支持

用户430774 2013-3-22 09:52

自己看data update flow的时候没看懂,惭愧

用户377235 2013-3-14 08:27

非常感谢!!!!!!!!!!!!!!!!!!!!

用户1392571 2012-11-15 11:31

正在学习很有用

用户1112023 2012-6-5 00:29

不错 也写了备注便于理解

用户1580415 2011-11-7 17:20

谢谢分享

用户221467 2011-10-24 11:50

请问楼主,如果第二页也满了呢?是不是再把第二页也写到第三页去??请指教下,谢谢

用户285095 2010-9-7 09:07

真的太感谢了
相关推荐阅读
用户377539 2010-10-01 22:05
[转帖收藏]浅析μC/OS-II v2.85内核OSTimeDly()函数工作原理
此贴转载:http://hi.baidu.com/hhbolin/blog/item/273de952ee950b688535240e.html //-------------------------...
用户377539 2010-10-01 12:09
[收藏转帖]uCOS任务堆栈的深入分析
uCOS任务堆栈的深入分析| 2008-10-04 作者:tigerletEDN博客精华文章  作者:TIgerlet堆栈作用的就是用来保存局部变量,从本质上讲也就是将CPU寄存器的值保存到RAM中。...
用户377539 2010-09-06 15:27
实现一个8bit的二进制数反转
如何实现一个8bit的二进制数反转呢。有以下方法:=================我是华丽的分割线===================uint8 bin8_rev(uint8 data) {   ...
用户377539 2010-09-01 14:03
热转印PCB的那些你该知道的事
               我写这个仅为了纪念多年热转印PCB的过程,转印PCB需要的是经验的时间积累。         首先是将PCB打印到转印纸上。转印纸尽量选择质量好的。如果PCB面积较小,可...
用户377539 2010-08-30 17:11
关于格雷码和自然码的转换问题
       刚从网上看到一道题目,要求将二进制自然码转换为格雷码。一看蒙了。完全不会。把数电给回老师了。没办法。上万能的搜索引擎。一搜居然就出来了。原来使用简单的或非门电路就可以实现。      下...
EE直播间
更多
我要评论
11
9
关闭 站长推荐上一条 /3 下一条