设备的运行维护在嵌入式系统生命周期中占有绝大部分时间,因此研究一种能使现场工程师方便快捷地升级软件而又绝不破坏设备可用性的技术方案是十分必要的。随着物流网及相关领域的技术发展,RFID技术已经得到广泛应用[1]。
本文针对应用高频RFID技术的嵌入式设备设计了一种基于IAP技术的运行时软件升级方案,利用高频大容量RFID对系统进行软件升级。软件架构上设计引导程序、应用程序、升级程序。该方案确保系统无论升级是否成功都可以维持正常工作。
该技术在基于IAP11F62X单片机和FM1702SL非接触卡读写控制器的水控器硬件平台,以及基于STM32F-
103RC单片机和FM1701非接触卡读写控制器的加油机控制板硬件平台上进行验证。投入批量运行两年多来,极大降低了现场维护成本。
本文首先介绍基于高频RFID系统的IAP方案软件架构、引导程序设计及应用程序设计,然后在硬件平台上进行了验证。
1 IAP方案设计
为了不破坏设备的可用性,又可以便捷地对系统进行升级,方案设计时将软件系统划分为引导程序、应用程序、升级程序、用户数据和IAP参数区,如图1所示。
引导程序负责检查应用程序和升级程序的数据完整性,决定是否升级软件或者恢复旧版本软件,最后运行应用程序。应用程序和升级程序都是当前设备的应用软件,两者仅版本不同:一个为当前版本,一个为待升级版本。在应用程序和升级程序中包含IAP功能,从RFID中读取升级数据写入相应升级程序区域。
1.1 引导程序设计
设备上电或复位时首先运行引导程序,工作时不依赖任何外部功能。程序进行硬件自检,设置中断向量,检查应用程序和升级程序的数据完整性,并根据IAP参数的设置决定是需要升级程序还是回滚恢复旧版本应用程序,再判断升级过程是否被中断并决定是否继续升级。引导程序流程如图2(a)所示。
为了确保系统可用型,升级过程中先要备份当前版本应用程序,通过一个缓存页面,升级程序和应用程序按Flash页块进行交换,复制次序如图2(b)所示,确保升级过程既不破坏原有版本程序代码,也不丢失新版本程序。
根据Flash按页擦除、字节写入的特性,在IAP参数区,用8 B共64 bit代表64个页面,初始化时为0xff,完成一页则依次清除一位,这种写模式下不需要擦除页面即可记录升级进度。一旦升级过程发生断电等意外,开机重启后可以检测到升级断点,继续升级。
如果升级后应用程序功能不稳定,还可以在应用程序中通过管理卡设置,回滚恢复到原来版本。这个过程和升级新版本软件过程一样,只是不需要读取升级卡,仅需通过管理卡设置回滚标志,通知引导程序“升级”(恢复)到原来版本应用程序。
1.2 应用程序设计
应用程序完成所需设备功能后,还需要实现读取升级卡写入升级程序区,或者通过管理卡设置回滚标志,在应用程序的卡处理过程中增加升级卡处理,应用程序流程如图3(a)所示。
在应用程序检测到有卡时,执行卡事件处理流程中,如图3(b)所示,识别卡的类型如果是消费卡或管理卡,则进入相应功能处理。管理卡与程序版本相关的只有版本选择参数,置位时写入IAP参数区,由引导程序交换应用程序和升级程序,主要用于升级后的版本回退。
识别到升级卡时,读取升级卡格式数据块。如果当前已经读取过升级卡并写过升级程序区,则升级卡版本信息必须与已经写入的升级卡版本一致才能继续读入。确认校验数据完整性后,根据数据地址信息写入升级程序区,否则提示拒绝该卡,确保升级卡版本一致。如果尚未读取过升级卡,则先读取并判断升级卡版本。如果与应用程序或升级程序版本重复,则提示已经升级;如果为新版本软件,则需要先擦除升级程序区Flash,再根据升级卡头信息写入升级程序区。如果本套升级卡已经全部读取并写入升级程序区,则更新IAP参数,软件复位跳转到引导程序。
2 IAP硬件平台设计
目前支持IAP的51单片机有STC的IAP11F系列以及新茂、新唐(华邦)和SST等很多型号,而基于ARM的单片机基本都支持IAP功能,这里以两种典型应用为例介绍IAP系统设计。
2.1 51单片机系统
水控器是应用于饮用水或浴室等用水管理的设备,通过控制电磁阀管理出水,通过定时器计时收费,通过脉冲式流量传感器计量收费,或者通过RTC时钟包时收费。
系统采用STC公司的IAP11F60X单片机,具有62 KB程序空间,引导程序占1 KB,应用程序和升级程序各占28 KB,IAP参数占1 KB(2页),其余为用户数据区[2]。
射频模块为FM1702SL,单片机通过模拟SPI与之连接,可以读取ISO14442A标准系列非接触卡。具体功能模块见图4。
在项目设置中需要设置应用程序起始地址,例如在本系统中起始地址设为0x0400,此外需要特别处理中断向量。51单片机的中断向量为固定地址,此时中断向量都在引导程序中,而中断服务函数均在应用程序中,因此需要在引导程序中设置中断跳转到应用程序中,举例如下:
;-----定时中断0----------------
ORG 000BH
LJMP AP_ADDR+0BH
;-----定时中断1----------------
ORG 001BH
LJMP AP_ADDR+1BH
;-----------------------------
AP_ADDR 定义为应用程序起始地址,而在应用程序中依然通过以下语法实现中断函数:
void timer0_ISR(void) interrupt 1 using 1
void timer1_ISR(void) interrupt 3 using 1
使用IAP11F62X单片机,在处理完升级卡后可以通过给IAP_CONTR赋值0x20强制软件复位跳转到引导程序,引导程序完成升级。然后通过LJMP AP_ADDR 指令跳转到应用程序,完成IAP过程并继续运行。
2.2 STM32单片机系统IAP
某型非接触卡加油机控制板采用STM32F103RC处理器,具有256 KB Flash,读卡电路采用性价比更高的FM1701,由软件实现FM1208 CPU卡的加密认证读取,通过车号识别模块识别车辆,并可以通过串口摄像模块拍照,与加油记录一起保存在大容量串口Flash中,其结构框图如图5所示。
STM32位处理器IAP功能与51单片机系统大体相似,需要设置程序起始位置,引导程序必须设置为Flash基地址(0x08000000),而应用程序地址则是0x0800-2000。不同之处在于STM32的中断向量表可以通过NVIC_Set-VectorTable函数设置到0x08002000,而不必通过引导程序跳转[3]。此外,STM32F103RC具有48 KB SRAM,可以读入升级卡全部数据,校验正确后写入Flash。
引导程序完成升级程序代码复制交换后,通过绝对地址跳转语句即可跳转到指定地址的应用程序执行。应用程序也通过相同语句跳转到引导程序执行,仅地址不同。
3 主机写升级卡软件
主机写卡软件读取HEX格式或者BIN格式程序文件,按IC卡容量分割后写入升级卡。由于RFID卡数据容量有限,升级程序可能需要写入多张升级卡。
规划卡数据的存放时,必须考虑升级时的卡类型识别以及版本控制、数据完整性等,因此需要设计格式头,如图6所示。
识别码用于确认该卡为本设备所用;类型码用于判定识别卡类型属于消费卡、管理卡或升级卡;版本为本卡内应用程序版本号;起始地址和数据长度为卡内数据在升级程序空间内的起始地址和数据字节数;卡数说明升级程序共包含多少张卡;卡序则是说明当前卡为第几张卡;数据校验用于验证卡内数据的完整性。主机写卡软件根据应用程序大小计算所需升级卡数量,并依次写入升级卡格式以及数据[4]。
4 功能验证
该升级方案应用于某型非接触卡水控器,采用4 KB数据容量的FM11F32卡作为升级介质,单片机为IAP11F62X。一套升级卡一直控制在7张卡以内。某型非接触卡加油机控制板也采用这一方案,采用8 KB数据容量的FM1208 CPU卡作为升级介质,单片机为STM32-
F103RC。由于加油站现场环境限制,这种升级方式更易于接受[5]。
在设备运行的近2年时间时,由于修复BUG、调整功能等需求,设备进行了十多次升级,正因为采用这种方式,没有给用户和维护人员带来额外负担。
本设计采用大容量RFID卡作为升级介质,无须下载线,更不必拆开设备,就可以进行现场升级,极大降低了维护难度。虽然由于目前非接触卡存储容量有限,可能需要多张IC卡才能完成升级,但由于设备读卡速度快,整个软件升级过程也不过两三分钟时间。实际应用证明,这种升级方式无论用户还是现场维护人员都易于接受,具有较高的应用价值。
责任编辑:ct
评论
查看更多