1396|21

98

帖子

0

资源

一粒金砂(中级)

NVM区数据备份机制 [复制链接]

 

上一篇主要说明NVM区操作注意事项,本文针对上篇提到的NVM区数据备份方法进行补充讲解。

NVM区主要特性是写入数据掉电不丢失,可以永久的保存数据,一般用作存放不经常修改的数据,此功能类似FLASH。向NVM区写入数据可分为3步:第一步,将目标扇区内原有数据读出到RAM中;第二步,擦除NVM目标扇区内数据;第三步,将新数据和RAM中的旧数据写入到该扇区中。基于以上写操作的特点可以看出,若执行写NVM区操作的第二步或第三步时芯片断电了,就会造成NVM区内原有数据丢失,而新数据写入失败,表现出NVM区内数据错乱的现象。虽然这只是小概率事件,但出于稳定性和产品健壮性考虑也要加入数据备份机制。

数据备份有两套基本方案,分别适用于小数据量和大数据量的应用场景。本期介绍小数据量备份方案,即要求每次更新数据量小于一个扇区大小减1,本例扇区大小256字节,因此更新数据量最大255字节。(注意:不同型号芯片NVM扇区大小会有差异,可以联系凌科技术确认)。实现思路是:从NVM区选取两块区域,每个区域的最后一字节记录该区域的操作次数。以该标志决定更新数据应选用哪个区域。依次循环操作两个区域,操作区域1的时候,区域2就充当了备份作用,反之同理。

第一次写入数据

第一步:将NVM区地址0x0000~0x00FF定义为Block1,将0x0200~0x02FF定义为Block2。

#define Block1 0x0000

#define Block2 0x0200

第二步:定义一个256字节的数组databuf和一个标志位变量cnt,并将cnt赋值0。

unsigned char databuf[256];

Unsigned char cnt = 0;

第三步:将目标数据(待写入数据)拷贝到databuf数组中,并将cnt+1拷贝到databuf+255的位置。

databuf[255] = cnt+1;

第四步:调用WriteNVM函数向Block1写入数据databuf,写入长度256字节。调用WriteNVM函数向Block2+255位置写入cnt,写入长度1字节

WriteNVM(Block1,databuf,256);

WriteNVM(Block2+255,&cnt,1);

更新数据

第一步:调用ReadNVM函数分别读取Block1和Block2的标志位(最后一字节)。

unsigned char flag1,flag2;

ReadNVM(Block1+255,&flag1,1);

ReadNVM(Block2+255,&flag2,1);

第二步:判断两个Block的标志位大小,选取标志位数值小的Block进行更新。将目标数据(待写入数据)拷贝到databuf数组中,并将标志位加2后拷贝到databuf+255的位置。

if(flag1 > flag2)

{

cnt = flag2 + 2;

databuf[255] = cnt;

WriteNVM(Block2,databuf,256);
}else{

cnt = flag1 +2;

databuf[255] = cnt;

WriteNVM(Block1,databuf,256);

}

读取数据

第一步:读取Block1和Block2的标志位数据。

ReadNVM(Block1+255,&flag1,1);

ReadNVM(Block2+255,&flag2,1);

第二步:判断标志位大小,数值大的Block内为新数据,数值小的Block内为旧数据。

if(flag1 > flag2)

{

ReadNVM(Block1,databuf,255);

}else{

ReadNVM(Block2,databuf,255);

}


回复

6805

帖子

19

资源

纯净的硅(中级)

楼主继续,,,

很实用


回复

112

帖子

0

资源

一粒金砂(中级)

能来点干货吗?期待楼主的更新

回复

17

帖子

0

资源

一粒金砂(中级)

太专业了,不明觉厉。


回复

30

帖子

0

资源

一粒金砂(中级)

太棒啦,有了NVM区数据备份机制,芯片断电的时候,就不用担心NVM区内原有数据丢失和新数据写入失败了,赞!
 


回复

110

帖子

0

资源

一粒金砂(中级)

虽然感觉操作有点复杂,但是能解决数据掉电不丢失的情况,麻烦点也能接受,下次可以试一下
 


回复
miniminimin 该用户已被删除
提示: 作者被禁止或删除 内容自动屏蔽

回复

112

帖子

0

资源

一粒金砂(中级)

如此操作的好处是什么?会不会导致可用数据区变小呢?

回复
邓女士 该用户已被删除
提示: 作者被禁止或删除 内容自动屏蔽

回复
114w1 该用户已被删除
提示: 作者被禁止或删除 内容自动屏蔽

回复

102

帖子

0

资源

一粒金砂(中级)

读写速度相比没有备份机制的速度慢了


回复

109

帖子

0

资源

一粒金砂(中级)

读写速度应该是存储的数据大小有关系,如果数据很大,读写的速度肯定会变慢一些
 


回复

17

帖子

0

资源

一粒金砂(中级)

哪款产品有nvm区呢?楼主推荐一下


回复
邓女士 该用户已被删除
提示: 作者被禁止或删除 内容自动屏蔽

回复

30

帖子

0

资源

一粒金砂(中级)

看完楼主最近这几篇文章,大概了解啦NVM区数据备份机制,文章不错!

回复
miniminimin 该用户已被删除
提示: 作者被禁止或删除 内容自动屏蔽

回复
114w1 该用户已被删除
提示: 作者被禁止或删除 内容自动屏蔽

回复

109

帖子

0

资源

一粒金砂(中级)

这么搞的话,太局限了,超过256字节就没法用了,太理想化


回复

102

帖子

0

资源

一粒金砂(中级)

文中的小概率事件能不能避免
 


回复

17

帖子

0

资源

一粒金砂(中级)

楼上同问。


回复
您需要登录后才可以回帖 登录 | 注册

关闭
站长推荐上一条 1/1 下一条

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区知春路23号集成电路设计园量子银座1305 电话:(010)82350740 邮编:100191

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表