基于C8051F34x单片机的USB Bootloader设计

2011-07-28 01:32刘云龙张伟霞
网络安全与数据管理 2011年23期
关键词:固件中断串口

刘云龙 ,张伟霞

(1.广州海格通信集团股份有限公司,广东 广州 510663;2.广州广电运通金融电子股份有限公司,广东 广州 510663)

Bootloader(以下简称BL)是一段引导程序,在单片机上电或复位后在应用程序(以下简称APP)之前先运行,来判断当前是否需要进入升级状态。如果不需要升级,就直接跳转到APP运行;如果需要升级,首先擦除旧的APP,然后通过某种通信接收APP固件程序,同时写入Flash中。

BL固件程序能以多种方式获取数据,包括串口、并口、I2C、SPI、USB等,但是从实际使用和成熟度来看,使用串口无疑是最方便的。如今,USB总线凭借其方便、快速、灵活、稳定、应用范围广等优点被广泛地应用、发展和普及,使用USB进行数据传输是一种趋势。本文设计的BL主要基于USB通信,同时考虑到模块兼容,保留了串口通信。

一般来说,一个BL应该能够完成以下功能:(1)通过某种通信收发数据;(2)擦除并升级APP应用固件程序;(3)判断APP固件的完整性;(4)APP与BL的中断跳转问题。而基于USB通信的BL,除了要完成一般BL的功能,还需要考虑BL与APP共用除USB中断外的USB一般处理函数等问题。下面对BL固件程序设计、APP固件程序设计以及上层软件设计进行详细介绍。

1 USB Bootloader设计

1.1 硬件平台

本文设计的USB BL是基于SiliconLabs公司C8051F34x系列单片机实现的;C8051F34x器件是完全集成的混合信号片上系统型MCU,具有片内上电复位、VDD监视器、电压调整器、看门狗定时器、时钟丢失检测器、时钟振荡器、USB、SMBus/I2C、UART、SPI、定时器、I/O、多达4 352 B片内RAM和64 KB的片内Flash存储器,Flash存储器还具有在系统重新编程的能力,可用于非易失性数据存储,并允许现场更新8051固件。

C8051F34x器件集成了一个完整的全速/低速USB功能控制器,刚开始设计时采用C8051F34x自带的USB,但是静电测试不符合要求,最终选用了C8051F34x和PDIUSBD12组合,解决了静电问题。

PDIUSBD12是一款性价比很高的USB器件,它符合USB1.1版规范,可与任何外部微控制器实现高速并行接口(2 Mb/s),具有良好的 EMI特性,高于 8 kV的在片静电防护电路等,详细资料请查询参考文献[3]。

1.2 BL和APP固件的地址分配

USB BL预计将占用8 KB的地址空间,从0x0000h到0x1FFFh,包括USB BL固件程序本身和用来判断程序是运行APP还是BL的一段签名程序。BL与APP地址空间分配如图 1所示,APP固件程序存放的地址空间从0x2000h开始。

图1 BL与APP地址空间分配

1.3 BL和APP的自动跳转

在程序中,设置一个设备模式标志位,用来判断程序是应该运行在BL中还是在APP中,此标志位存储在RAM的一个固定地址2F7h处。本文设计的BL,DEVICE_MODE为设备模式标志位,其值等于1时为BL_MODE(BL模式),其值等于 0为 APP_MODE(APP模式)。

有两种情况设备模式为BL模式,可以下载更新APP固件程序:一是在指定的签名地址处没有指定的两字节的签名;二是Flash写错误,在C8051F34x单片机中,Flash读地址超出了用户代码空间,即MOVC操作的地址大于0xFBFF,发生Flash错误复位后,FERROR位(RSTSRC.6)被置位。

上电后是否运行APP固件程序通过第一种情况判断。当需要更新APP固件程序时,造成Flash写错误,通过第二种情况进入BL模式,开始更新程序,如图2所示。

图2 BL和APP的自动跳转

1.4 中断重定位

一般情况下,MCU中断向量分布在复位 (0x0000)以后,位于低地址空间。由于BL程序占据了此段空间,因此,除了 USB0中断(中断序列表第8号中断)和串口中断 (中断序列表第5号中断),其他所有的中断(C8051F34x共有16个通用中断)都需要做中断二次映射。也就是说,需要在原中断向量入口地址处手动添加二次跳转函数,使新的中断向量指向用户的中断程序,这样才能保证正常运行APP固件程序的中断程序。具体的跳转地址由APP固件程序起始地址决定,这一部分在START51.A51中通过编写函数来完成。假设固件的起始地址设置为0x2000H,则中断跳转的实现过程如下。

首先定义几个常量:

中断向量重映射:

1.5 中断处理函数

8号USB中断由于同时要被BL固件和APP固件调用,因此不能对其进行二次跳转,而通过共享的USB库文件中的USB_ISR主中断处理函数进行处理,通过DEVICE_MODE判断当前设备处于BL模式或APP模式来自动地二次跳转到BL固件或APP固件的USB中断处理函数处,如图3所示。

图3 BL中断函数分流处理

需要注意的是,4号串口中断同样要被两者所调用,因此对4号中断的处理与8号中断相同。先由4号中断入口地址跳转到原地址处,然后在此地址处根据设备模式进行中断分流,决定是到BL还是到APP的中断处理函数处。

1.6 USB BL命令函数

BL固件程序中的命令函数如表1所示。

(1)Erase Page:擦除APP固件程序和签名;

(2)Write Page:将APP固件程序的HEX文件写入Flash;

(3)Write Signature:APP固件程序写 Flash成功后,将签名写入指定的地址处,表示APP固件已经存在于Flash中;

(4)Get Version:取BL程序的版本号。

表1 BL固件程序中的命令函数

2 APP固件程序设计

使用USB BL,需要对APP固件程序进行一些添加和修改。

(1)由于BL占用了 0x0000~0x1FFF的空间,APP固件程序是以0x2000h作为起始地址的,这样就需要修改APP程序的偏移量。

①修改 STARTUP.A51文件,把“CSEG AT 0”变为“CSEG AT 2000h”;

②点击 Porject->Options for Target‘Target1’, 点击C51项目栏,把 Interrupt vectors address栏选中,内容改为0x2000,点击BL51 Locate项目栏,将code项改为0x2000。

(2)APP固件程序应该具备从APP转到BL的功能,需要增下以下代码:

①main()主函数中增加接收更新APP固件程序的命令字以及对此命令的处理代码,使用BOOTLOAD_REQ()命令来触发一次Flash读复位,使器件进入BL模式;

②在STARTUP.A51文件增加以下代码:

//造成 Flash写错误地址定义

PUBLICBOOTLOAD_REQ

BOOTLOAD_REQ EQU 0FFFFh

③在头文件中添加函数声明:

void BOOTLOAD_REQ(void)

(3)去掉与BL重复的USB通信函数部分,特别是要去掉Control_USB()函数(该函数主要完成设备请求处理函数),因为此函数在BL中已经实现,并且用绝对地址固定,应用程序只需跳转到固定的绝对地址处即可,修改如下:

①在STARTUP.A51文件增加以下代码:

//control_usb地址定义

PUBLIC Control_USB

//USB通信产生的外部中断1在APP固件的入口地址

Control_USB EQU 1300h

②注意需要在BL中先定义Control_USB的入口地址,方法如下:在 BL工程下,Porject->Options for Target‘Target1’,点击 BL51 Locate项目栏,将 code项修改为

?PR?VCONTROL_USB?BOOTLOADER_F340(0x1300);

(4)修改USB中断处理函数:由于 USB控制器采用PDIUSBD12,其中断引脚 INT_N接 C8051F34x的 P0.7引脚,且该引脚被配置为外部中断1,电平触发方式,低电平有效。因此应在外部中断1中断处理函数中获取USB中断源并进入相应的子程序进行处理。

(5)USB设备的枚举过程在BL中完成,因此PID、VID是BL程序所决定的,需要在BL中改变此处的值以适应自己的模块。

(6)保护被BL使用的位,DEVICE_MODE的位地址,在STARTUP.A51文件中,在宏定义和代码段开始之前增加以下的代码:

3 远程在线下载

3.1 下载步骤

(1)从APP切换到BL。此时,程序正常运行在APP模式,发送更新程序命令,致使Flash写错误进入BL模式。

(2)擦除 Flash。在 BL模式下,发送擦除 Flash命令,擦除签名和APP固件程序,返回成功ERASE_OK。

(3)写 Flash。擦除 Flash成功后,可以将新的 APP固件程序的HEX文件写进Flash。校验失败,返回WRITE_FAILED,成功返回 WRITE_OK。

(4)写签名。写Flash成功后,将2 B的签名写到指定的地址处,表示APP固件已经存在于Flash中。

(5)从BL切换到APP。写签名成功后,使程序跳转到APP固件程序处执行。

3.2 上层软件设计

本文使用VC++6.0开发了BL上层软件,如图4所示。

在线下载时,有两种方式:(1)正常下载,这是常用的一种方式,这种下载方式在下载前和下载后会进行APP固件程序版本比较,如果是不同版本的程序,可以进行升级,如果是同一版本的程序,直接返回成功;(2)强制下载,这种下载方式不进行APP固件程序版本比较,点击即可进行升级,一般在APP固件程序调试时多次下载使用。

在线下载使用方法:首先点击“浏览”按钮,查找到用于升级的新版本的HEX文件;再点击“正常下载”或“强制下载”进行程序升级;然后在右边查看返回结果,看升级是否成功。

3.3 设计注意点

在APP转BL以及BL转APP时,需要考虑USB枚举时间,枚举成功后才能正常地发送和接收。远程下载过程中,需要考虑一些异常情况,如PC主机死机、模块CPU死机、死循环或复位等,针对这些情况,本设计均作了冗错处理。

一个良好的BootLoader程序应该具有良好的可维护性并可以正确处理异常情况,不会因为意外情况引起系统的损坏和崩溃。本文结合实际应用,设计了一个实用的USB Bootloader。经大量测试和实际应用,可满足开发和维护人员的要求。

[1]Silicon Labs.USB Bootloader with shared USB[DB/OL].Xpress Library,2008.2.

[2]潘琢金,译.C8051F340/1/2/3/4/5/6/7全速 USB FLASH微控制器数据手册[Z].新华龙电子有限公司,2006.01.

[3]周立功.PDIUSBD12 USB固件编程与驱动开发 [M].北京:北京航空航天大学出版社,2002.

[4]王朔,李刚.USB接口器件PDIUSBD12的接口应用设计[J].单片机与嵌入式系统应用,2002(1).

[5]缪德芳,李绍胜.单片机 Bootloader设计与实现[J].中国科技论文在线.

[6]虹信公司.在 PIC18单片机中使用 BootLoader[J].单片机与嵌入式系统应用,2005(12).

猜你喜欢
固件中断串口
浅谈AB PLC串口跟RFID传感器的通讯应用
基于FPGA的中断控制器设计*
跟踪导练(二)(5)
千里移防,卫勤保障不中断
基于SHA1的SCADA系统PLC固件完整性验证方法
基于UEFI固件的攻击验证技术研究*
基于固件的远程身份认证
数字电源内部数据传输的串口通信方法实现
USB接口的多串口数据并行接收方法探索
串口技术的实物调试和虚拟仿真联合教学模式