实例分析MCU的Data Flash访问控制

笔者在家用火灾报警系统项目的开发过程中,在进行主从机通讯和从机自身任务处理时,需要经常与从机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:页标记
【实例分析MCU的Data Flash访问控制】

    推荐阅读