基于USB通信的BL单片机上实现USBBootloader的设计方法

Bootloader程序的设计和APP固件程序的设计,以及设计中需要注意的问题;最后,用VC++开发上位机软件来完成该Bootloader的远程在线下载功能。APP固件程序设计

关键词:C8051F34x; USB引导加载程序; 远程升级

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设备。 它符合 USB 1.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开始。

基于USB通信的BL单片机上实现USBBootloader的设计方法

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。 发生闪存错误复位后,FERROR 位(RSTSRC.6)被置位。

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

基于USB通信的BL单片机上实现USBBootloader的设计方法

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_APPLICATIONEQU2000h

中断向量重新映射:

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 中断处理函数

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

基于USB通信的BL单片机上实现USBBootloader的设计方法

需要注意的是,4号串口中断也是被两者调用的,所以4号中断的处理和8号中断是一样的,首先从4号中断入口地址跳转到原来的地址,然后根据设备模式转向该地址的中断来决定是走BL还是APP的中断处理函数。

1.6 USB BL命令功能

BL固件程序中的命令功能如表1所示。

基于USB通信的BL单片机上实现USBBootloader的设计方法

(1)擦除页:擦除APP固件程序及签名;

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

(3)写入签名:APP固件程序成功写入Flash后,将签名写入指定地址,表明该APP固件已存在于Flash中;

(4) 获取版本:获取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向量地址栏,将内容改为0x2000,点击BL51 Locate工程栏,将代码项改为0x2000。

(2)APP固件程序应具有从APP切换到BL的功能,需要添加以下代码:

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

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

//导致Flash写入错误的地址定义

PUBLICBOOTLOAD_REQ

BOOTLOAD_REQEQU0FFFFh

单片机

单片机解密的常用几种方法我们做一下简单介绍

2024-2-2 1:00:46

单片机

Proteus软件具有其它EDA工具软件(例:multisim)的功能

2024-2-2 2:01:00

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索