SST公司推出的RD2系列的单片机,与8051单片机完全兼容。该系列所有单片机都集成了两个独立的闪存程序存储块,且两个存储块中的程序都可以被执行。利用FlashFlex51系列单片机独特的在应用中编程(IAP)功能,可以执行一个存储块中的程序,同时对另一个存储块进行在应用中编程,修改另一个存储块中的程序(或数据)。RD2系列单片机集成了两块闪存记忆体,不同的型号闪存记忆体容量如图1所示。
图1 RD系列单片机闪存记忆体容量
由此可见,存储块0依型号可选大小,从8KB到64KB,而存储块1则一律是8KB。在这里,讨论如何利用地址重映射达到程序指针能运行任意存储块中的程序。主要原理在于映射8KB存储块0与存储块1的低8KB形成物理空间重叠。因此存储块1中的低地址成为中断入口地址,如图2所示。
图2 RD系列单片机的地址映射
在图2中提到IAP(In-Application-Programming, 在应用中编程)乃是SST系列单片机提供的特殊命令,用于编程非目前程序运行的另一存储块。若程序发出IAP命令使用目前运行的存储块,该命令将被视为无效。有关IAP命令细节,请参考SST IAP命令指导手册。
以下讨论SST RD2系列如何设置闪存存储块重映射及程序在存储块间的切换。RD2系列单片机内有两个配置位SC2及SC1, 用于决定内部闪存存储块的组织方式。这两个配置位可以通过外部编程器或IAP方式进行编程,由于这两个配置位是为非失忆型记忆位。当外部复位或上电复位后,SC2及SC1逻辑取反后的值就是暂存器SFCF[1:0]的默认值。当单片机开始运行后,可以视需要改变SFCF[1:0]的设定值以达到不同的存储块组织方式。
图3和图4为不同的SFCF[1:0]值可支持的存储块组织的变化。
图3 SST89E/V516RD2闪寸存储块结构
图4 SST89E/V58/54/52RD2闪存存储块结构
在讨论如何让程序在存储块之间切换以前,我们先了解一下单片机在不同情况下复位后SFCF[1:0]的设定值。因为所有的切换仅在于变换SFCF[1:0]的设定值。表1给出了不同情况下复位后SFCF[1:0]的值。
表1 复位后的SFCF[1:0]
现在我们将程序在闪存存储块间切换的要点做一个说明:由于8051的指令系统采用的是可变长度的指令体系,PC指针是根据目前指令长度累进下一个指令的位置。当闪存存储块被切换后,PC指针可能指向一个无效的指令地址,导致内核读到非法指令。有两种方法可以保证切换后不会有此现象。
方法1——设定程序切换共同区
利用ORG宏命令迫使编译器将共同的切换程序码设置于一个固定位置“共同区”内,如此可以保证在切换存储块时,PC指针确保指向一个安全的合法地址。图5的示范了“共同区”程序。
图5 设定程序切换共同区
方法2——利用跳转指令离开8KB重叠区后再切换
这个方法相对简单,不需要有安全“共同区”。
SST提供的RD2系列单片机在出厂时已烧录一个引导程序于存储块1之中,并且设定配置位SC2及SC1为“1”,就是等于SFCF[1:0]=“00”。上电后,存储块1中的引导程式将被执行。若在一段时间内没有任何串口通信协议达成,引导程序自动进行软件复位,SFCF[1:0]变为“10”,单片机开始执行用户程序从复位地址零开始。若在一段时间内串口收到预定的协议,引导程序将继续通过串口接收外来的命令。SST提供的一个PC机上的软件EasyIAP,即是利用引导程序通过串口对单片机内的资源包括所有的存储块及寄存器等做到显示及更新的功能,尤其是对闪存存储块1的更新,即是将EasyIAP发过来的用户程序用IAP命令编程写到存储块1中,再利用上述所提的存储块切换技巧,切换到存储块1执行用户程序达到所谓在应用中编程。
