如何使用FLASH模拟EEPROM存储大量的全局变量存储位置

在使用FLASH模拟EEPROM时要注意几点
近期在使用FLASH模拟EEPROM,为了节省一块EEPROM的钱,其实不然,我主要是刚开始时,没有考虑设备的一个参数要掉电可存储,所以才出此下策,为了加快项目进度,节约调试时间,
1.注意在某地址写入数据时,要注意不可以写入自己的代码段。
2.要注意是2的倍数
在开发STM32时,要注意是小、大、中容量,大的是每页2K,小、中为每页1k。
虽然很简单,但是,真的不要忽略呀,吃了大亏。
第二个问题,竟然忽略了数据溢出
u8 tele_num0[13];测试为13字节
//u8 tele_num[12]="";//这里严重溢出啦
u8 tele_num0[
]=="";;测试为13字节
有一个程序,u8 tele_num[12]="";一直执行的很好,很诧异,就没在意
,知道一天在另一个
程序里,除了卡死,研究了半天,用小灯进行测试,发现在一个函数的“return 2”后卡死,不知道何因,后来
才发现,是数据越界溢出,程序员不容易,+1 &-1 很严重的,切记。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。【图文】基础篇 32. STM32 FLASH模拟EEPROM实验_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
基础篇 32. STM32 FLASH模拟EEPROM实验
&&众想科技STM32免费视频教程课件
大小:2.88MB
登录百度文库,专享文档复制特权,财富值每天免费拿!
你可能喜欢3138人阅读
原始文件ST 官方有例子和文档:AN2594
看到不少网上使用官方例子程序不成功的问题,我估计大概是没详细阅读官方文档的原因吧,也许很多人没理
解官方例子的原理。那么下面就详细说明一下原理再说如何优化。
原理如下:
首先使用2 页FLASH 空间,如果0 页空间写满数据,那么把0 页空间里面的【有效数据】复制到1 页,如果1
页数据满那么把1 页空间里面的【有效数据】复制到0 页,这样循环使用,当然如果你想增加使用寿命可以增
加多页循环,官方例子只是按2 页实现的例子。每页前面4 字节保留,其中前2 字节是该页状态标志
下面的图显示数据在FLASH 中的保存格式:
保存数据是16 位的,后面16 位是该数据的虚拟地址,注意:1 个数据有唯1 个虚拟地址,地址必须为:0~0xfffe
范围内(每页将按4 字节分块,1 块保存1 个16 位数据)。下面继续说明16 位虚拟地址的作用。
Figure 3 显示了数据更新的过程:
假设保存的数据虚拟地址是0X7777,那么程序写数据是从当前有效页页首地址开始查询虚拟地址位置为
0XFFFF 的空间,如果是0XFFFF 那么该位置可以保存数据;如果不是,那么继续找下1 个位置,如果本
页无0XFFFF 的空间那么表示本页已满,那么将本页【有效数据】复制到另外1 页继续保存数据。
当两次保存同一虚拟地址的数据时如下图所示:从上到下,第2 个虚拟地址是0X7777 对应的数据1245 才
是有效的。清楚了这点,那么读数据要怎么处理基本就明白了。
读数据时是从有效页的末尾地址开始检测是否是有效数据,如果是那么立即返回,程序是通过虚拟地址判断有
效数据的,第1 个匹配的虚拟地址的数据才是有效的
3. 页满时处理数据
说到这里,看到不少使用例子程序不成功的问题,那么就请注意下面了,他们的错误估计是下面的原因造成的。
当1 页写满时其实里面有很多无效数据,你只需要将【有效数据】复制到另外1 页就成。如何复制有效数据呢?
我想很多人估计忽略了 【#define NumbOfVar ((uint8_t)0x03) /* Variables' number */】,NumbOfVar 就是你程
序中实际要保存的数据量,这个必须与实际保持一致,不能多也不能少,这个如果不一致,那么在换页时将出
错,没换页之前倒是没问题的,原因在于:程序在换页时将根据NumbOfVar 的值复制有效数据的个数,如果比
实际少,那么换页时将丢失数据,如果比实际多那么将出现旧数据覆盖最新数据
错误的例子:
/* Variables' number */
#define NumbOfVar ((uint8_t)0x05)
uint16_t VirtAddVarTab[NumbOfVar] = {0, 1, 2};
//NumbOfVar 定义的比用的多实际是{0, 1, 2, 0, 0},虚拟地址0 的数据换页后将出现旧数据覆盖最新数据
int main(void)
for (VarValue = 0; VarValue & 100; VarValue++)
EE_WriteVariable(VirtAddVarTab[0], VarValue+10);
for (VarValue = 0; VarValue & 500; VarValue++)
EE_WriteVariable(VirtAddVarTab[1], VarValue);
EE_ReadVariable(0, &temp);//不换页读出数据是对的,换页后读出数据错误
//====================================================================================
/* Variables' number */
#define NumbOfVar ((uint8_t)0x03)
uint16_t VirtAddVarTab[NumbOfVar] = {0, 1, 2};
//NumbOfVar 定义为3,下面用到虚拟地址超过VirtAddVarTab 表里面的值
int main(void)
for (VarValue = 0; VarValue & 100; VarValue++)
EE_WriteVariable(VirtAddVarTab[0], VarValue);
for (VarValue = 0; VarValue & 50; VarValue++)
EE_WriteVariable(3, VarValue+2);
for (VarValue = 0; VarValue & 200; VarValue++)
EE_WriteVariable(2, VarValue);
EE_ReadVariable(3, &temp);//不换页读出数据是对的,换页后读出数据错误
STM32 FLASH 模拟EEPROM 使用注意:
不少人问该程序的FLASH 保存数据多少和使用寿命
保存数据多少跟FLASH 页大小有关,如果页大小是1K 那么只能保存=256-1 个16 位数据,如果你保
存8 位数,你可以2 个8 位数据组合后保存或者直接保存,如果保存32 位数据那就拆成2 个16 位保存,当然
现在STM32 的FLASH 寿命是10000 次,
如果你保存255 个数据那么每次修改1 个数据FLASH 就要擦写1 次,如果你保存1 个数据,那么你修改255
次该页才擦1 次,继续用另外1 页,建议保存数据个数不要超过50%,当然如果你的数据基本都不修改你保存
255 个也是没有任何问题(你的数据都不修改根本不用关心寿命问题了:)。
STM32 FLASH 模拟EEPROM 优化
官方例程中读写数据每次要查询读写位置,写数据是从页首地址开始查询,读地址是从页末地址查询。
假如只有1 个数据,读数据时效率是很低的,要查到最后才能找到有效数据,
如果页快满了写数据效率也很低,读效率反而好一点了。
实际程序中记录下一个可以写数据的位置将提高数据的读写效率,这样的话:写数据就是立即写不用查询,读
数据不从页末地址查询,而是从最后1 个写入数据处查询,这样特别在页数据少时效率提高不少。优化过的例
子代码只需要增加很少部分就能实现。
增加关键代码
uint32_t CurWrA
//初始化写地址,减少每次读写时查询时间
uint16_t InitCurrWrAddress(void)
详细请看修改后的例子,读写函数也做了相应更改
STM32 FLASH 模拟EEPROM 进一步优化
上面优化过的例子在写数据无须查询直接写入就可,但是读数据在页数据少是效率提升明显,在页数据多时效
率不明显,特别是页数据快满时就跟原来一样的。
说明:不管是官方还是优化过的例子在页交换时这个模拟EEPROM 程序都将耗费不少时间的
如果你对时间要求不高完全不用考虑下面的了。
下面就进一步提升它的效率,方法如下:
为每1 个保存的变量定义1 个映射地址,就是在写数据时将写数据的地址偏移保存起来。比如
第1 次的数据映射地址是0,第2 次的数据映射地址是1,那么读数据时就可以立即计算出地址。
此方法对于1K 页大小的每个数据将增加1 个8 位映射地址,对于2K 页大小的每个数据将增加
1 个16 位映射地址.
这里只提供方法,当然方法不是唯一的,有兴趣的自己去玩。
个人觉得,模拟固然是一根不错的方法,但风险也很大。如果模拟程序出错的话,数据很难恢
复,并且问题定位也不是很容易。用来保存关键数据的存储区的读写应该尽量使用简单的方案,
以确保数据的可靠性。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:98107次
积分:1572
积分:1572
排名:千里之外
原创:48篇
转载:38篇
(1)(24)(2)(1)(1)(1)(10)(6)(1)(6)(4)(13)(15)(2)
(window.slotbydup = window.slotbydup || []).push({
id: '4740881',
container: s,
size: '200,200',
display: 'inlay-fix'& 【助学例程13】STM32 Flash模拟EEPROM 存储数据例程
管理员:??人数:1014小组积分:12429简介:学习单片机,请加入“单片研习”。该组从实践出发,从点亮一个灯开始,循序渐进玩转单片机。当前话题:循序渐进玩转stm32从制作最小系统开始,由易到难,逐步掌握基于stm32的开发方法。小组将实时跟踪报道成员学习stm32的进展情况,赶快加入讨论吧。小组公告小组暂无公告.??|????|??
需要确认注册邮箱后才能下载,
楼主??[其他]?
【助学例程13】STM32 Flash模拟EEPROM 存储数据例程
6年会员勋章目前未领取。领取条件:?凡是注册时间六年以上的活跃用户即可领取该勋章。
积分:3027分
总积分:5804分
发表于 17:08
STM32 Flash模拟EEPROM 存储数据例程:?/********************************************************************??????????????????????????? 单片研习??????? *********************************************************************例程名称:STM32 Flash模拟EEPROM 存储数据作??? 者:阿勇(jshmlly)实验硬件:DP-miniSTM32硬件连接:将DP-miniSTM32的串口J2与PC机相连????????? 功能描述:在Flash的0x处写入数据,并读出,将读出的数据用串口发送????????????????? ?试着改变写入的数据,看PC机接收是否和你所该的数据一样。---------------------------------------------------------------------使用Flash方式存储数据,可以在不常修改数据的场合替代EEPROM,它的优点是抗干扰能力比EEPROM强,不易被冲掉数据。缺点是擦除次数比EEPROM少,且不支持对单个字的修改功能。在通常情况下,由于保存的参数基本修改频率不是很高,有些时候一天也就1次,甚至一个月才一次,所以擦除次数不是问题。????????? ********************************************************************/
jshmlly 编辑于 17:49
1楼??[其他]?
Re:【助学例程13】STM32 Flash模拟EEPROM 存储数据例程
6年会员勋章目前未领取。领取条件:?凡是注册时间六年以上的活跃用户即可领取该勋章。
积分:428分
总积分:855分
发表于 16:20
2楼??[其他]?
Re:【助学例程13】STM32 Flash模拟EEPROM 存储数据例程
6年会员勋章目前未领取。领取条件:?凡是注册时间六年以上的活跃用户即可领取该勋章。
积分:103分
总积分:206分
发表于 11:18
下载学习stm32
3楼??[其他]?
Re:【助学例程13】STM32 Flash模拟EEPROM 存储数据例程
6年会员勋章目前未领取。领取条件:?凡是注册时间六年以上的活跃用户即可领取该勋章。
总积分:190分
发表于 06:24
4楼??[其他]?
Re:【助学例程13】STM32 Flash模拟EEPROM 存储数据例程
6年会员勋章目前未领取。领取条件:?凡是注册时间六年以上的活跃用户即可领取该勋章。
积分:177分
总积分:354分
发表于 11:00
5楼??[其他]?
Re:【助学例程13】STM32 Flash模拟EEPROM 存储数据例程
5年会员勋章目前未领取。领取条件:?凡是注册时间五年以上的活跃用户即可领取该勋章。
总积分:148分
发表于 13:38
6楼??[其他]?
Re:【助学例程13】STM32 Flash模拟EEPROM 存储数据例程
6年会员勋章目前未领取。领取条件:?凡是注册时间六年以上的活跃用户即可领取该勋章。
积分:139分
总积分:278分
发表于 17:08
have a look
7楼??[其他]?
Re:【助学例程13】STM32 Flash模拟EEPROM 存储数据例程
6年会员勋章目前未领取。领取条件:?凡是注册时间六年以上的活跃用户即可领取该勋章。
积分:153分
总积分:306分
发表于 09:22
8楼??[其他]?
Re:【助学例程13】STM32 Flash模拟EEPROM 存储数据例程
5年会员勋章目前未领取。领取条件:?凡是注册时间五年以上的活跃用户即可领取该勋章。
积分:102分
总积分:204分
发表于 16:40
谢谢楼主分享!
9楼??[其他]?
Re:【助学例程13】STM32 Flash模拟EEPROM 存储数据例程
6年会员勋章目前未领取。领取条件:?凡是注册时间六年以上的活跃用户即可领取该勋章。
积分:548分
总积分:1093分
发表于 10:04
10楼??[其他]?
Re:【助学例程13】STM32 Flash模拟EEPROM 存储数据例程
6年会员勋章目前未领取。领取条件:?凡是注册时间六年以上的活跃用户即可领取该勋章。
积分:112分
总积分:224分
发表于 15:38
11楼??[其他]?
Re:【助学例程13】STM32 Flash模拟EEPROM 存储数据例程
6年会员勋章目前未领取。领取条件:?凡是注册时间六年以上的活跃用户即可领取该勋章。
积分:1001分
总积分:2225分
发表于 18:39
12楼??[其他]?
Re:【助学例程13】STM32 Flash模拟EEPROM 存储数据例程
5年会员勋章目前未领取。领取条件:?凡是注册时间五年以上的活跃用户即可领取该勋章。
总积分:118分
发表于 09:27
13楼??[其他]?
Re:【助学例程13】STM32 Flash模拟EEPROM 存储数据例程
6年会员勋章目前未领取。领取条件:?凡是注册时间六年以上的活跃用户即可领取该勋章。
积分:267分
总积分:534分
发表于 07:28
14楼??[其他]?
Re:【助学例程13】STM32 Flash模拟EEPROM 存储数据例程
5年会员勋章目前未领取。领取条件:?凡是注册时间五年以上的活跃用户即可领取该勋章。
总积分:108分
发表于 15:13
--- 现有 147个主题,共 10页,目前第 1页 ---??
1...??到第页??
点击,立即回复。
EDN China官方微信
扫一扫关注,获取电子新知,设计灵感
IC厂商小组
在线研讨会
赞助商链接
2016 EDN China -- Use of this website is subject to its terms of use.
京ICP备号-4 |
京公网安备37 |
新版社区已上线,旧版论坛、博客将停用
1、为防数据丢失,旧版论坛、博客不再接受发帖;
2、老用户只需重设密码,即可直接登录新平台;
3、新版博客将于8月底完美归来,敬请期待;
4、全新论坛、问答,体验升级、手机阅读更方便。

我要回帖

更多关于 oracle 存储过程 变量 的文章

 

随机推荐