笔者在家用火灾报警体系项目的开发过程中,在进行主从机通讯和从机本身使命处理时,需求常常与从机MCU进行运转数据的存取。曩昔传统的办法是在MCU上外挂EEPROM或将MCU内部的部分存储单元专门差异出来,以存取运转数据。这两种办法的晦气之处是:外挂EEPROM需求添加MCU与EEPROM的读写接口,添加了MCU的管脚担负,减慢了数据的读写速度的一起还添加了功耗;专门为运转数据差异存储单元则减少了程序代码的存储空间,一起存储空间的读写、擦除等操作会比较费事,别的还要十分当心,以防擦掉了有用的程序代码。
瑞萨RL78系列MCU内嵌2KB的DATA FLASH,省去了用户独自外扩数据FLASH的费事。RL78系列MCU还支撑BGO操作,程序指令在DATA FLASH读写时仍可正常履行。其对DATA FLASH存储单元的写操作寿数高达1百万次以上,十分适合于需求频频存取数据的运用场合。
与有些半导体厂商的操控芯片不同,瑞萨并没有直接将DATA FLASH的读写操作彻底开放给用户,而是供给了一套叫做PFDL(Pico Data Flash Library,即微型数据闪存拜访库)的软件接口,来完成对闪存体系的操作。用户运用时只需求调用相应的库函数即可进行DATA FLASH的读写、校验、擦除等操作,而不用关怀底层驱动函数的详细完成方法。这在很大程度上便利了用户程序的规划,缩短了开发周期。
1)DATA FLASH结构和PFDL
RL78的存储结如图1所示。其间Data Flash memory物理地址为F1000H-F17FFH,被分红了两个BLOCK区,每个BLOCK区1KB,共2KB。
图1:瑞萨RL78系列MCU的存储结构
PFDL由表1所示的库文件组成。
表1:PFDL库文件
2)Data Flash的存储结构和运用办法
首要有必要将RL78系列MCU关于DATA FLASH操作的几个问题进行阐明。RL78系列DATA FLASH的擦除操作只能以BLOCK为单位,不支撑单字或单字节擦除。所以当有一项长度为若干字节的数据要写入DATA FLASH时,不行能将数据每次都写入固定的物理地址所对应的存储单元中,而是必须在新的空存储单元中写入。这就意味着用户在规划DATA FLASH的存储结构时,必须有寻址功用。
RL78系列DATA FLASH同一时间只能有1个BLOCK处于激活状态,是有用的,此刻另一个BLOCK不行拜访,是无效的。习惯上,咱们常将DATA FLASH的一个BLOCK称为一页,当一个有用页被写满数据时,要想持续写入数据的话,则只能鄙人一页中写入,一起还需求将前一页中有用的其他数据项拷贝到下一页中,并将下一页符号为当时的有用页,将上一页符号为无效页,即必须有DATA FLASH的页符号和导页机制。
为此,笔者将整个DATA FLASH分红两页(每个BLOCK天然构成一页,两页替换运用),每页的开始地址作为页符号单元,见表2。每次进行DATA FLASH操作前应先读取该符号单元来承认当时有用页。
表2:页符号
如前所述,各种数据项一起在DATA FLASH中存在时,其存储地址是不固定的,如不加以差异,将不能辨认数据,所认为完成DATA FLASH的寻址功用,咱们引进数据项索引的概念。在每页DATA FLASH中,将存储单元一分为二,上半部分用于寄存数据项索引,数据项索引用于在DATA FLASH中差异各种不同的数据项,并指示其代表的数据项在DATA FLASH中存储的相对地址。下半部分用于寄存各种数据项。
为进一步描绘的便利,咱们无妨举例阐明,假定用户有A、B、C、D四种数据项需求在DATA FLASH中存取,每种数据项的数据长度分别为1、2、3、4字节,其界说如表3所示。
表3:数据项界说
一个典型的DATA FLASH存储结构的比如如图2所示。页符号占用每页的相对开始地址单元。相对地址0x0001~0x01FF界说为数据项索引区,每个数据项索引包括3个字节,分别是数据项索引、索引数据地址低字节、索引数据地址高字节。相对地址0x0200~0x03FF界说为数据项存储区。
向DATA FLASH写入数据时,先找到当时有用页,然后在当时页中查找是否有可供写入数据的数据存储空间和索引空间。查找时可采纳自上而下的查找次序,先分别从每页数据项索引区和数据项存储区的相对开始地址开始查找空白单元,若有满意该数据项存储要求的接连空白存储单元,则调用写FLASH库函数将数据项索引和数据项写入该存储空间。
图2:DATA FLASH存储结构
从DATA FLASH读取数据时,先找到当时有用页,然后在当时页中查找所要读取的数据坐落何处,即寻址。查找时应采纳自下而上的查找次序(可保证每次查找到的是该种数据项的最新数据),从每页数据项索引区的相对完毕地址开始查找数据项索引,若索引匹配则标明数据项找到,若未找到匹配索引则标明要读取的数据项未找到(未写入DATA FLASH),可规划函数回来不同值来表明是否找到数据项。当索引匹配时,读出存储在索引数据地址单元中的数据项地址,调用读FLASH库函数读出数据项即可。
3)总结
运用上述DATA FLASH存储结构和存取规矩,完成了数据存储的可寻址和页替换,比较充沛的运用数据存储空间。别的,数据项索引区和数据项存储区的差异并不一定要各占一半存储空间,而应依据实践的各种数据项长度来挑选优化,当每种数据项字节数较多时,可适当添加数据项存储区的空间,防止存储空间糟蹋。为了使数据存储愈加牢靠,可运用数据的三备份存储机制:实践存储的每个数据项,均按次序地址顺次进行三备份存储,读取时必须有两个备份相同才干承认数据有用。