ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

NVM区数据备份机制

2019-08-09 10:01:38  阅读:194  来源: 互联网

标签:databuf cnt Block2 Block1 数据备份 NVM 机制 255


上一篇主要说明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);
}

标签:databuf,cnt,Block2,Block1,数据备份,NVM,机制,255
来源: https://blog.51cto.com/13520299/2427963

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有