笔者在家用火灾报警系统项目的开发过程中,在进行主从机通讯和从机自身任务处理时,需要经常与从机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存储结构和存取规则,实现了数据存储的可寻址和页交替,比较充分的利用数据存储空间。另外,数据项索引区和数据项存储区的划分并不一定要各占一半存储空间,而应根据实际的各种数据项长度来选择优化,当每种数据项字节数较多时,可适当增加数据项存储区的空间,避免存储空间浪费。为了使数据存储更加可靠,可使用数据的三备份存储机制:实际存储的每个数据项,均按顺序地址依次进行三备份存储,读取时必须有两个备份相同才能确认数据有效。
			
			
       	 	
    	AI全面普及中,需重视安全手段
         	 	
    	新纶科技  上半年营收同比增66%
         	 	
    	神舟十二号载人飞船将于17日发射 神舟十二号飞行任务四大特点分解
         	 	
    	泰隆银行携手科大讯飞,建设AI+语音平台助力提升金融科技
         	 	
    	语音识别唤醒词的挑战与未来发展
         	 	
    	实例分析MCU的Data Flash访问控制
         	 	
    	炎炎夏日,让讯飞智能学习机消除学习带来的的“火焰”
         	 	
    	澳大利亚电信和爱立信联手首次实现南半球端到端5G独立组网通话
         	 	
    	CES展上,NVDIA用三大产品震惊世界
         	 	
    	三星S8和iphone7plus哪个好?三星S8怎么截屏?三星S8精美壁纸欣赏
         
       	 	
    	百度网盘三星版闪亮登场:为用户云存储实现新便利
         	 	
    	CAN网络通讯无法正常进行时该如何应对
         	 	
    	18650锂电池和聚合物锂电池哪个更好
         	 	
    	如何在IAR Embedded Workbench中填充提高系统的健壮性
         	 	
    	PCB驳图技巧,pcb layout
         	 	
    	AI时代将助力智慧医疗改变行业现状
         	 	
    	未来5年智能手表年复合增长率达到11%
         	 	
    	华为新一代“万元神机”——Mate 20 RS保时捷设计设计正式首发开售
         	 	
    	全栈工程师真的不全栈
         	 	
    	普洛帝OPC-III油液综合监测系统在工程机械行业的应用介绍