《电子技术应用》
您所在的位置:首页 > 嵌入式技术 > 设计应用 > 基于C8051F34x单片机的USB Bootloader设计
基于C8051F34x单片机的USB Bootloader设计
来源:微型机与应用2011年第23期
刘云龙1,张伟霞2
(1.广州海格通信集团股份有限公司,广东 广州 510663; 2.广州广电运通金融电子股份有限公司
摘要: 介绍了一种在Silicon Labs公司的C8051F34x系列单片机上实现USB Bootloader的设计方法,使应用程序可以通过USB或COM通信实现远程在线升级。首先,简述了USB Bootloader;然后,详细阐述了USB Bootloader程序的设计和APP固件程序的设计,以及设计中需要注意的问题;最后,用VC++开发上位机软件来完成该Bootloader的远程在线下载功能。该Bootloader可以很方便地在其他类似单片机上移植,通用性强。
Abstract:
Key words :

摘  要: 介绍了一种在Silicon Labs公司的C8051F34x系列单片机上实现USB Bootloader的设计方法,使应用程序可以通过USB或COM通信实现远程在线升级。首先,简述了USB Bootloader;然后,详细阐述了USB Bootloader程序的设计和APP固件程序的设计,以及设计中需要注意的问题;最后,用VC++开发上位机软件来完成该Bootloader的远程在线下载功能。该Bootloader可以很方便地在其他类似单片机上移植,通用性强。
关键词: C8051F34x;USB Bootloader;远程升级

 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是基于Silicon Labs公司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.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所示。

1.4 中断重定位
 一般情况下,MCU中断向量分布在复位(0x0000)以后,位于低地址空间。由于BL程序占据了此段空间,因此,除了USB0中断(中断序列表第8号中断)和串口中断(中断序列表第5号中断),其他所有的中断(C8051F34x共有16个通用中断)都需要做中断二次映射。也就是说,需要在原中断向量入口地址处手动添加二次跳转函数,使新的中断向量指向用户的中断程序,这样才能保证正常运行APP固件程序的中断程序。具体的跳转地址由APP固件程序起始地址决定,这一部分在START51.A51中通过编写函数来完成。假设固件的起始地址设置为0x2000H,则中断跳转的实现过程如下。
 首先定义几个常量:
HW_INTVEC_TABLE EQU 0003h
HW_INTVEC_SEPARATION EQU 8
INTVEC_TABLE EQU START_APPLICATION+3
INTVEC_SEPARATION EQU8
START_APPLICATION EQU2000h
 中断向量重映射:
CSEG AT HW_INTVEC_TABLE +
(HW_INTVEC_SEPARATION*INT_NUM)LJMP
INTVEC_TABLE+(INTVEC_SEPARATION
*INT_NUM)
//以定时器2中断为例(第5号中断)
CSEG AT0003h+8h*5h=002Bh
LJMP 2000h+0003h+8h*5h=202Bh
1.5 中断处理函数
 8号USB中断由于同时要被BL固件和APP固件调用,因此不能对其进行二次跳转,而通过共享的USB库文件中的USB_ISR主中断处理函数进行处理,通过DEVICE_MODE判断当前设备处于BL模式或APP模式来自动地二次跳转到BL固件或APP固件的USB中断处理函数处,如图3所示。

 

 

 需要注意的是,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程序的版本号。
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文件中,在宏定义和代码段开始之前增加以下的代码:
 //Last bit in bit-addressable space(2F.7h)
 MEM_DEVICE_MODE  BIT  07Fh
 PUBLIC  DEVICE_MODE
 BSEGATMEM_DEVICE_MODE
 DEVICE_MODE: DBIT  1
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).

此内容为AET网站原创,未经授权禁止转载。