利用基于闪存的MCU实现用户数据存储

发布者:乡村乐园最新更新时间:2015-04-15 来源: eechina关键字:闪存  MCU  数据存储 手机看文章 扫描二维码
随时随地手机看文章
采用微控制器的大多数设备还需要某种机制来存储在断电时仍要被记住的那些设置数据。例如,在更换电池后记不住预设电台的收音机肯定不会在市场上取得很大的成功。用户希望喜爱的电台、预设温度、参数选择和其他永久性信息能长久保存下来供每次开机时直接取用。

为了满足这种用户需求,设计师一般使用串行EEPROM。这些器件又小又便宜,具有很长的历史,设计工程师用起来得心应手。但在今天对成本极其敏感的市场下,即使这样一个廉价的器件也可能突破成本预算。因此许多设计师试图寻求并利用已经包含在微控制器芯片中的资源:程序闪存中剩余的空间。

过去,许多微控制器使用ROM或可紫外线擦除的EPROM来存储程序指令。但现在越来越多的微控制器转用闪存技术存储代码。选择闪存的主要理由是,如果在程序代码中发现错误,闪存数据很容易被擦除和更新。

大多数微控制器具有读取程序空间中存储数据的机制。基于冯·诺伊曼架构的处理器,如TI MSP430,可以使用任何寻址模式读取程序闪存。哈佛架构处理器一般利用特殊的机制将数据从程序空间传送到数据空间。具有闪存管理功能的其他MCU包括:

1. 包含MOVEC(移动常数)指令的非常流行的8051处理器系列;

2. 包含TBLRD和TBLWR(表读和表写)指令的Microchip PIC18系列;

3. 具有伪冯·诺伊曼架构的美信MAXQ微控制器系列,它们允许通过简单的MOVE指令访问闪存程序存储空间(见图1)。

1.jpg 
图1:在像美信MAXQ2000这样的伪冯·诺伊曼MCU中采用的数据交换允许任何存储器块被用作代码或数据存储器。

但即使能够从随机闪存位置读取数据,完整的非易失性存储器子系统也必须能够随机修改闪存中的数据。这意味着需要解决两个问题:首先,一旦某个闪存位置被写入,那个位置的数据只能通过擦除整个闪存块(通常128字节或以上)进行修改;其次,闪存的读写次数非常有限。

本文将介绍如何构建一个能够解决这些问题、并使用闪存块模拟随机写入的机制。虽然本文的用例是MAX2000,但原理适用于支持读写和擦除闪存的用户代码的任何处理器。本文讨论的方案已经被用于采用MAXQ3180三相模拟前端和MAXQ2000的三相电表参考设计。

闪存管理的基本知识

闪存是一种电可擦除的存储器,通常主要用于读操作,也就是说,虽然是可写的,但它不希望很频繁地更新数据,因此对这种存储器的操作大部分是读操作。大多数闪存器件是以字(word)为单位写入数据的,但一次只能擦除整个块。这使得它们不适用于频繁变化的存储应用,只适合存储那些永远不变的常数表。

一共有两种闪存:NAND闪存和NOR闪存。NAND闪存经常用于存储卡和闪盘。一般来说,从NAND器件读取数据需要几个周期,并且大部分是用串行方式完成的。

因此NAND闪存不适于存储程序代码,因为存取时间太长。而NOR闪存更像是传统的字节或字宽的存储器。可以像读ROM器件那样读NOR闪存中的数据:使片选和地址线有效,然后等待一段访问时间后从总线上读取数据。

闪存块通常被擦除到“1”状态,因此经过擦除后,块中的每个位置都是0xFFFF。“编程”一个闪存位置是把某些位从“1”状态改变为“0”状态。为了使编程过的位返回到“1”状态,整个块必须被擦除。

任何电可擦除的存储器件都面临寿命的问题。根据所用技术的不同,一个闪存单元在永久失效以前可以承受的擦除-编程次数少则1000次,多则100万次。使用闪存存储数据的任何方案都必须确保写入次数在整个单元阵列上获得均匀分布,没有一个位置会出现太多的擦除和编程次数。

大多数闪存器件都允许将前次编程中那些未被编程的位从“1”改为“0”状态。例如,大多数器件允许用0xFFFE编程过的那个位置再用0x7FFE进行编程,因为这种操作不会将任何位从“0”改变到“1”。然而如图1所示的处理器架构中使用的闪存不允许这样做。这种写入操作的结果是失败,内存中的数据仍然是0xFFFE。

理由很简单:因为要被编程的存储块主要用作代码空间,通常禁止对前面写过的位置作任何写操作。因为指令0xFFFF代表的是无效的源子译码(source sub-decode),不可能出现在有效的代码块中。这样,阻止向以前编过程的位置写入数据有助于保持代码块的完整性。

提供非易失性存储器服务

以下是提供非易失性存储器服务的两种方案。第一种方案侧重于简单性,第二种方案比较灵活,但代价是较复杂。

方案1

问题:校准信息、MAC地址或制造数据等配置数据必须要存储在产品中。虽然这些通常是固定不变的信息,但在整个产品生命周期内配置数据需要多次更新的可能性还是存在的。

解决方案:下面是实际中最容易想到的例子。有两个块,一个块在字地址0x7E00处,另一个在0x7F00处,都用于数据存储。在第一次收到保存配置数据的命令时,处理器会检查这两个块,在发现它们都是空块后,配置数据被就存入第一个块。

保存配置数据的第二条命令同样会使处理器再一次检查这两个块。当发现块0已经有数据后,它就将配置数据拷贝到块1,然后擦除块0中的数据。

当收到恢复配置的请求时(比如在上电时),处理器会同时读取两个块的数据并确定哪个块在用。只要是没被擦除的块就是在用块。

这种方案的主要优点是简单:如果设备在上电(或其他配置恢复事件)时需要块中的配置数据,这是很好的一种方案。读数程序会接受一个字长的指针,返回该地址的数值,写入程序则接受一个字长的指针,然后尝试向该地址进行写入操作。擦除程序只是同时擦除两个块。

这种方案的主要缺点就是主要优点的反面:程序的思路太过简单。没有操作去判断写入数据是否成功—在发出写入命令后,如果写入失败,处理器不会做任何事去解决问题。这也是为什么这个方案只是用来写入已知是空的闪存块的原因。

方案2

问题:要求用非易失性存储技术来跟踪用电量和其他经常变化的数据。更新经常是一周数次或一天数次发生。

解决方案:这是即使传统EEPROM也需要寻求帮助的场合。问题是:更新的频率和所有非易失性存储器有限的写入寿命这样的事实不允许反复写入和擦除单个 EEPROM单元。考虑一个小时更新一次的情况,具有1万次写入-擦除次数限制的EEPROM只需一年时间就会失效,这个时间比电表所需的十年设计目标少得太多了。

解决这个问题的方法之一是实现某种形式的“损耗均衡”。这意味着不会有单个位置被反复写数据。相反,写入操作将呈类似合理指数分布的方式分散到整个存储器阵列。

损耗均衡是一种很好理解的技术,在闪存器件中使用就是出于这个目的。但它的算法非常复杂和难以理解,不过对我们来说,一个更简单的原理介绍就足够了。[page]

存储阵列中的数据项是由数据单元(data element)号引用的,而不是地址。

数据单元号是一个唯一识别数据单元的任意8位数,因此在这种方案中,最多有255个数据单元(数据单元0是保留单元)。

每个数据单元有一个双字节的头部(见图2),包含了数据单元号和数据单元长度以及留给差错管理使用的足够空间,其中长度是一个两位代码,可表示1个、2个、3个或4个16位的字。

2.jpg 
图2:数据单元的头部结构。

写一个数据单元需要知道写入数据的地址、写入数据的单元号和长度。写函数先寻找阵列结尾,然后紧跟最后一个记录之后写入新的数据单元。

如果闪存页中没有足够的空间容纳指定长度的记录,一个表示结尾的页标记将被写入,并会打开一个新的页。有关典型数据页的结构请见图3。

3.jpg 
图3:典型的数据页。

在展开的数据页中,先写入经常要更新的数据单元1,再写入从不更新的数据单元4,然后写入需要多次更新的数据单元3。最后,写入从不更新的数据单元2。

出现页的结尾标记表明过进行过一次数据写入尝试,但由于数据单元太长而无法将数据单元装进该页,因此打开了一个新页来容纳该数据单元。整个数据结构的结尾设定为空白单元,这个位置有望成为单元头部。

值得注意的是,我还没有说明重复记录的问题。这是因为在这种方案中重复记录不是问题。事实上,读写程序是完全忽略重复记录的。

在写数据时,新的记录会写在阵列的最后,而不管是否有相同号码的记录存在。在读数据时,只有匹配请求记录号的最后,也就是最近的记录被读出来。

从阵列中读出一个数据单元要比写入稍微复杂一些。读函数首先接受应被写入数据单元内容的单元号码和地址。当被调用时,读函数从头开始搜索阵列。

当它找到与请求数据单元相匹配的记录时,它将对应的地址先存起来,然后继续搜索。如果它找到另外一条匹配的记录,它就用新的地址代替刚才存储的地址。

当到达阵列结尾时,最终存储的地址将指向最近写入拷贝的请求记录。读函数随即在被调用时将这个数据拷贝到缓存。

复用存储器空间

现在,我们已经有了一种以读取为主的可行机制用于从存储阵列中存取记录。剩下只有一个问题:我们还没有建立起复用被废弃的记录拷贝占用的空间。(我们也还没有建立删除记录的机制,但由于是用在嵌入式应用中,这可能不是一个很重要的特性)

如果不恢复空间,分配的空间将很快用完。恢复空间意味着擦除整个页,因为闪存只能一次擦除一整页。但闪存页被随意擦除时将会出现删除有用信息的风险。唯一的方法是在擦除旧页时将有效信息拷贝到新的页。

从废弃记录恢复空间要分三步走:首先,打开新的闪存页,将每个数据单元的最新版拷贝到新的页;然后,删除旧页;最后,在新页上放置页标记以便读程序能找到它们。

第一步有些技巧,因此我们稍详细地进行介绍。执行这一步的简单方法是将它分成两小步:第一步,使用RAM阵列存储记录号和阵列中最新记录的地址;第二步,穿过RAM阵列将最新的记录拷贝到新的闪存页。这个过程很快,相对也比较顺利。

这种方案的问题是所用处理器(见图1)的RAM为1K字。这种方案将限制可存储进 RAM中的单一数据数量,因为这个RAM还要节省下来用作缓存。这是明显不能接受的。

这种解决方案非常耗时,但不管存储阵列多大(在合理范围内)都能正常工作。该方案不会在RAM中创建一份指针列表,而是针对每个单一条目(entry)在源阵列中作多次穿越。因此压缩算法变为:

1. 从源阵列中读一个单元;

2. 在目标阵列中寻找该单元。如果找到了,表示这个单元已经被写入。增加源指针值,回到第(1)步;

3. 扫描源阵列寻找单元的最新拷贝;

4. 将数据单元的最新拷贝写入目标阵列;

5. 增加源指针,并回到第(1)步。

最终,在目标阵列中每个数据单元都有一个唯一的条目。图4描述了一个已填满的页。源页现在可以被安全地删除,页的头部被写入到目标阵列。

4.jpg 
图4:在空间恢复之后的图2所示数据页内容

这个过程的构建使得存储的数据非常安全。在使用闪存器件时必须面对的危险是写入或擦除操作期间发生电源故障。

如果发生电源故障,则有可能一个或多个页被破坏(在写入时),或未被完全删除(在删除操作时)。但上述压缩操作本身是安全的。因为:

1. 如果在写入操作期间发生电源故障,源页是完全不受影响的。在电源恢复后,新写的页很容易被识别(它们没有页头),将其擦除后重新开始写入操作。

2. 如果在旧页被擦除期间发生电源故障,它们可能包含无效的头部。这些页可以被删除,然后将头部增加到新的页中。

3. 如果在页头部被写入新页时发生电源故障,数据是不受影响的。页头部的更新操作可以重新开始。

总之,应该没有什么情况能让意外事件造成无可挽救地破坏阵列数据。

性能增强

目前的存储子系统没有差错检测机制。在数据单元识别符中目前有6个比特是保留未用的。

设计师可以使用CRC6算法(x6+x+1)计算整个数据单元的CRC以确保不会产生任何读或写错误。虽然这不是一个特别可靠的算法(它会从64个多位差错中漏掉一个),但它能检测实际中可能发生的大多数差错。

上述系统的另外一个限制是读取访问时间必需很长。为了寻找最新的记录,每一次读取都必须读遍阵列中的每个记录。有三种方法可以用来改善访问时间:

1. 在数据单元中留一个空的字用于前向指针。当数值更新时,在前向指针中填入指向新条目的内容。这样这个表可以当作一个链接列表。

2. 向后穿越表格。现在你可以简单停留在第一次出现的请求单元上。

3. 如果只有少量的单一单元,可以在上电时就创建一个包含单元ID和指针的RAM阵列。随后的访问将非常迅速—只要读取RAM阵列就可以发现到哪里去获得数据单元。
关键字:闪存  MCU  数据存储 引用地址:利用基于闪存的MCU实现用户数据存储

上一篇:AT24C512中数据文件的系统化管理
下一篇:基于虚拟存储的嵌入式存储系统的设计方法

推荐阅读最新更新时间:2024-03-16 13:58

51单片机特殊功能寄存器有哪些_功能是什么
  51单片机是对所有兼容Intel 8031指令系统的单片机的统称。该系列单片机的始祖是Intel的8004单片机,后来随着Flash rom技术的发展,8004单片机取得了长足的进展,成为应用最广泛的8位单片机之一,其代表型号是ATMEL公司的AT89系列,它广泛应用于工业测控系统之中。很多公司都有51系列的兼容机型推出,今后很长的一段时间内将占有大量市场。51单片机是基础入门的一个单片机,还是应用最广泛的一种。需要注意的是51系列的单片机一般不具备自编程能力。   51单片机特殊功能寄存器   1、21个寄存器介绍   51系列单片机内部主要有四大功能模块,分别是I/O口模块、中断模块、定时器模块和串口通信模块(串行I/O口
[单片机]
51<font color='red'>单片机</font>特殊功能寄存器有哪些_功能是什么
基于51单片机的智能恒温箱设计
一.系统概述 系统使用的模块有AT89C51单片机+8位共阳极数码管+DS18B20温度检测模块+按键+小灯。 本设计采用51单片机为核心控制,使用数码管进行温度以及阈值的显示,通过按键可以对温度上限和温度的下限进行设置,当检测到温度超过温度上限和温度下限后会通过小灯进行报警。 二.仿真概述 1.使用8位共阳数码管显示实时温度。 2.通过按键可以调节温度阈值,阈值分为上限和下限,通过按键可以对阈值进行加减调节。 3.当温度低于温度下限阈值后黄灯就会亮。 4.当液位高于温度上限阈值后绿灯就会亮。 三.程序设计 使用Keil 51进行程序设计,打开Proteus时程序是默认烧录的状态,如果没有烧录点击AT89C
[单片机]
基于51<font color='red'>单片机</font>的智能恒温箱设计
浮点数传送--MCS-51单片机实用子程序
FMOV 功能:浮点数传送 入口条件:源操作数在 中,目标地址为 。 出口信息: = , 不变。 影响资源:A 堆栈需求: 2字节 FMOV: INC R0 INC R0 INC R1 INC R1 MOV A,@R1 MOV @R0,A DEC R0 DEC R1 MOV A,@R1 MOV @R0,A DEC R0 DEC R1 MOV A,@R1 MOV @R0,A RET
[单片机]
单片机应用系统的抗干扰技术
随着工业控制的发展,单片机应用系统以其高性价比逐步取代模拟式控制系统,被广泛应用于各个领域。应用现场存在着各种干扰源,对单片机应用系统的工作影响很大,在实验室里设计好的控制系统,安装调试时完全符合设计要求,而置入现场后,系统常常无法正常稳定地工作。干扰虽不能直接造成硬件的损坏,但常使计算机不能正常运行以致控制失灵,造成设备和生产事故。因此,为了保证设备在实际应用中可靠地工作,从系统设计开始就必须充分考虑到对系统抗干扰性能的要求。 1 干扰源、干扰途径和干扰的影响 1.1 应用系统自身干扰源及干扰途径 应用系统自身干扰源是因在设计系统时对某些问题考虑不全面,如元器件布局不合理、电路工作不可靠、元器件质量差等,形成诸如电阻热噪声
[单片机]
51单片机常用开发工具的一些说明
51单片机常用开发工具 硬件工具:电烙铁、万用表、双踪示波器、逻辑分析仪、直流稳压电源等。 软件工具: Keil:这个版本最好选择v4.72的,可以选择UTF-8的字符编码,这样就不容易出现乱码了。我之前用的v4.00版本的就没有这一功能。 STC-ISP下载软件:这个最好选择最新版本的。 Protel 99 SE或Altum Designer:这两个用于绘制电路原理图和PCB设计。 Microsoft Visio:这个用于绘制程序流程图。
[单片机]
PIC单片机程序编写和动作标志位的使用方法解析
控制部分采用PICl6F7X系列单片机,运用汇编语言编程,运行速度较快,能够达到系统的要求。在这里使用的大多是数字信号的控制,电机的控制只有开和合两种状态。在动作的过程中需要两只手臂、身体、头部、脚部等的协调动作。整个控制系统比较复杂,因而在PIC程序编写和空间分配方面需要注意一些问题。 1、动作标志位的使用 在整个控制中,组合的动作很多,当所有动作定位都通过光电开关控制时,在程序编写上就有一些问题。如要求左手上升到鼓掌位、右手上升到举手位(手初始位置在最下的放下位),光电开关0有效(即为0时是挡住),到达正确位置。用简单的理解可以写成下面的程序: listP=16c73 calllefthandup callrighthan
[单片机]
PIC<font color='red'>单片机</font>程序编写和动作标志位的使用方法解析
PIC单片机TIMER0实现流水灯的自动控制设计
#include __CONFIG(0x3B31); unsignedcharnum=0,i=0; voidinit() { TRISB=0x00; T RISC =0x00; PORTB=0xFE; PORTC=0xFE; } vo idT MR0_init() { OP TI ON=0x07;//0有上拉电阻00001111:256分频 GIE=1; PEIE=1; T0IF=0; TMR0=250; T0IE=1; } voidin te rrupt TI MER0() { T0IF=0; if(num==5) { num=0; PORTB=(PORTB《《1)“0x01; PORTC=(PORTC《《1)|0x01;
[单片机]
PIC<font color='red'>单片机</font>TIMER0实现流水灯的自动控制设计
单片机学习应用的六大重要部分
单片机学习应用的六大重要部分 一、总线:   我们知道,一个电路总是由元器件通过电线连接而成的,在模拟电路中,连线并不成为一个问题,因为各器件间一般是串行关系,各器件之间的连线并不很多,但计算机电路却不一样,它是以微处理器为核心,各器件都要与微处理器相连,各器件之间的工作必须相互协调,所以需要的连线就很多了,如果仍如同模拟电路一样,在各微处理器和各器件间单独连线,则线的数量将多得惊人,所以在微处理机中引入了总线的概念,各个器件共同享用连线,所有器件的8根数据线全部接到8根公用的线上,即相当于各个器件并联起来,但仅这样还不行,如果有两个器件同时送出数据,一个为0,一个为1,那么,接收方接收到的究竟是什么呢?这种情况是不允许的,所以要
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved