引言
TMS320VC54x系列DSP作为一种低功耗高速处理器在消费电子、通信等领域应用广泛[12]。通常为实现DSP程序代码的高速运行,一般需要将DSP的应用程序代码存储于DSP片内RAM中运行,但TMS320VC54x处理器是RAM型器件,掉电后DSP不能保存任何用户应用程序代码。因此,基于该型DSP的电子系统通常需要设计自举模块。所谓“自举”是指:DSP芯片内的程序引导装载器(Bootloader)自动地将DSP应用程序代码从DSP外部非易失性存储器加载到片内RAM中,脱离仿真器模式独立运行的过程。
TMS320VC54x系列DSP有两类自举方式:基于静态存储器(如EEPROM、FLASH)的自举方式和基于处理器的自举方式。基于静态存储器的DSP自举方式[34]使用外扩的静态存储器存储DSP程序代码,由于该方式无需外加控制器干预,因此具有电路简单等优点。基于处理器的DSP自举方式[56],利用单片机存储DSP程序代码并控制DSP完成自举,具有可有效控制DSP自举时机、可灵活选择自举通信接口等优势。然而,无论哪类自举方式,要更新DSP应用程序代码都需要先将DSP开发软件CCS编译产生的.out程序代码文件通过一系列的格式转换,生成DSP自举所需的程序代码格式,并将得到的代码移植到DSP应用系统片外扩展的静态存储器或单片机中存储。显然,传统DSP自举模块的上述程序代码更新操作非常麻烦。为此本文提出一种便捷高效的DSP自举模块。借助该模块,用户无需熟悉DSP自举设计过程,便可一键实现DSP程序代码的更新升级与自举操作。
1 方案设计
DSP开发软件CCS编译生成的.out文件不能直接用来自举,需要将其进行一系列繁琐的格式转换得到合适的格式并移植到DSP的外部存储器进行自举[7]。为解决该问题,本模块通过基于LabVIEW的GUI软件完成上述转换并控制代码移植到外部存储器。DSP自举模块框图如图1所示。
图1 DSP自举模块系统框图
GUI软件首先将.out文件转换为.hex格式,并将得到的.hex文件转换为方便DSP自举的.dat格式。之后,GUI通过USB将数据传送给C8051F340单片机完成DSP程序更新。C8051F340是一款可提供USB功能并具有较大FLASH存储空间的混合信号微控制器。本模块使用其片上FLASH作为DSP的外部存储器,可省去外扩存储设备,节约成本,简化电路。自举开始时,单片机将FLASH中的代码数据通过标准串行自举方式传送给DSP,控制DSP的自举。标准串行自举与其他自举模式相比,占用DSP硬件资源少,电路简单。通过本模块,开发者可在PC机上实现一键完成DSP代码更新。
2 硬件设计
图2 自举模块主要硬件连接关系图
本模块使用C8051F340的片上FLASH作为DSP的外部存储器。C8051F340通过标准串行接口与DSP通信,通过USB与处理代码格式转换的GUI软件通信。如图2所示,虚线框1为3线制的标准串行总线,负责数据的传输。虚线框2为复位与握手信号。DSP的Bootloader通过拉低XF引脚通知单片机DSP已准备好接收数据;而单片机通过P1.3引脚拉低RS来复位DSP。C8051F340与PC机通过USB连接。VBUS为USB电缆VBUS引线的感应输入端,当该引脚出现5 V高电平信号时,表示该设备已经和主机连接好。D+、D-为USB的差分信号线,D+信号线接1.5 kΩ的上拉电阻R1使USB设备工作于高速状态。电容C1、C3为15 pF的滤波电容。为了消除差模干扰,两信号线连接33 pF的电容C2。REGIN为C8051F340片内电压调节器的输入端。VDD为C8051F340片内电压调节的3.3 V输出端。通过将REGIN和VDD短接,C8051F340被配置为USB固件自供电、片内稳压器禁止的工作模式。另外,C8051F340电路模块中,通过C2调试接口(包括C2CK时钟信号和C2D双向数据信号)连接JTAG对单片机程序进行烧写和调试。
3 软件设计
本系统主要通过GUI软件完成DSP用户应用代码的格式转换和调用USB主机API控制USB传输数据;通过C8051F340程序调用USB器件API接收数据存入片内FLASH中,并通过标准串行通信控制DSP的自举。下面分别介绍各软件设计的功能和具体流程。
3.1 基于LabVIEW的GUI程序设计
LabVIEW开发的程序一般由一个或多个VI组成,所有VI都可分为前面板和框图两部分。前面板是VI的交互界面,用户输入数据通过前面板传递给框图,计算和分析结果在前面板上以不同方式显示出来。图3为本模块的GUI前面板。前面板分为“输入配置区”和“状态显示区”。通过在前面板的“输入配置区”设置文件路径进行DSP代码文件的二次更新。“状态显示区”可实时显示USB连接状况、文件转换信息、自举代码文件内容等详细信息。
图3 基于LabVIEW的GUI前面板
图形化的程序代码主要完成两个任务:调用USB主机的API函数控制USB数据传输和控制代码文件格式转换。
借助Silicon Labs公司为USB驱动程序开发提供的USBXpress,可以简便地实现在PC机上通过GUI软件与作为USB器件的C8051F340单片机的USB通信。USBXpress提供了10个USB主机API函数,通过LabVIEW中的CLF(调用库函数节点)调用USBXpress提供的USB主机API函数,便可访问USB底层硬件。图4为本设计LabVIEW上位机程序调用API的框图。图中VI作用分别是获取USB器件编号、获取USB器件序列码、设置USB读写延时、打开USB器件、向USB器件写数据块、关闭USB器件。
图4 LabVIEW调用USB主机API框图
在成功调用SI_Open()函数打开USB器件,并通过“file path control.vi”控件获取待转换文件的具体路径后,GUI软件对定位的代码文件开始进行转换。如图5所示,首先通过“Exec.vi”(“执行系统命令”VI)调用CCS软件环境提供的DOS批处理文件Hex500.exe软件(与自举文件位于同一个目录)将.out文件转换为.hex文件。Hex500.exe在DOS环境下运行需要输入大量转换配置文件,因此GUI需同时调用集中描述文件转换所需参数信息的.cmd文件。.cmd文件内容及注释如下:
bootloader.out //待转化的程序文件
o bootloader.hex//输出文件名
map bootloader.map//生成存储器映像文件
boot//生成加载表
I//输出文件为Intel Hex文件格式
e_c_int00//程序入口地址
memwidth 16//标系统的存储器为16位
romwidth 16//存储器芯片的位宽为16位
bootorg SERIAL//串行装载
之后通过“Exec.vi”函数调用hextodat.exe软件将.hex格式转换为.dat格式。最终在文件格式转换完毕之后提取代码并转换为数组,在循环中调用SI_Open()函数以每次512字节的速度将数据写入USB器件,直到所有文件传输完毕,关闭USB。
图5 LabVIEW转换DSP程序代码格式的框图
3.2 C8051F340程序设计
C8051F340通过USB从GUI软件接收DSP程序代码并存储到片内FLASH中,之后通过标准串行接口将代码传送给DSP进行自举。C8051F340程序主要包括初始化函数、自举函数、USB驱动函数、擦写FLASH函数几个部分。C8051F340程序的流程图略——编者注。
3.2.1 初始化程序
程序初始化部分主要包括USB设备初始化和C8051F340单片机初始化。USB初始化通过调用USBXpress提供的10个USB器件API函数实现,包括调用USB_Clock_Start()函数初始化USB总线时钟、调用USB_Init()函数使能USB总线、调用USB_Init_Enable()函数使能API中断;C8051F340单片机初始化中将单片机时钟设为48 MHz以满足USB全速工作方式的需要,配置单片机输出端口为推挽输出,开启外部中断0并通过配置寄存器“IT01CF=0x07”将P0.7配置为INT0的中断触发端口引脚,监视DSP所给自举信号。
3.2.2 自举函数
DSP启动速度比C8051F340快,因此自举之前需先复位DSP并初始化SPI接口,等待DSP的XF引脚触发INT0中断后启动自举操作。本程序使用16位标准串行方式对DSP自举。通信时序如图6所示,BFSR0脉冲之后可传输一个16位的数据,传输的每个16位数据之间需至少保证40个DSP时钟周期的延时时间。且单片机时钟频率(BCLKR0)不可超过DSP时钟频率的1/2。标准串行自举代码如下所示,程序中将BFSR0拉高后,传输一个字节的数据,并通过调用延时函数Delaynum(20)延时20 μs来满足传输两数据间最小CPU时钟间隔的要求,程序中w为当前传输的由4个ASCI字符转换而来的16位无符号整型变量。
图6 单片机标准串行自举时序图
BCLKR0=1;
Delaynum(20);
BCLKR0=0;
BFSR0=1;
Delaynum(20);
BCLKR0=1;
Delaynum(20);
BCLKR0=0;
Delaynum(20);
for(i=0;i<16;i++){
BDR0= (w & (0x8000 >> i)) > 0;
BCLKR0=1;
BFSR0=0;
Delaynum(20);
BCLKR0=0;
Delaynum(20);
}
3.2.3 USB驱动函数和FLASH读写函数
USB中断函数通过调用Block_Read()函数接收来自GUI软件的代码数据,并存入TempStorage[]数组。ReadStageLength为每次所读取的文件大小,最大为64字节(一个数据块大小)。因GUI软件每次发送512字节,FLASH中每512字节为一页,故下位机中每读取512字节后写入FLASH。
如下代码中,BytesRead为已读取数据的大小,当C8051F340通过USB接收了一页FLASH可容纳最大数据512字节(Block_PR_Page为每页FLASH可容纳最多数据块= 512/64)或者GUI软件发送的最后一组数据,写入FLASH。PageIndices[0]为下位机自举的基指针,指向FLASH中0x2000开始的地址,其中0x2000~0x2200用来存放接收数据信息(大小、所含数据块量);PageIndex为当前操作的Flash相对于基页0x2000的偏移量,PageIndices[0]+PageIndex*0x200指向Flash当前操作地址,自举程序代码从0x2200地址处开始。
BytesRead+= Block_Read((BYTE*)(&TempStorage[BlockIndex]),ReadStageLength);
BlockIndex++;
if((BlockIndex==(Block_PR_Page))||(BytesRead==BytesToRead)){
Page_Erase((BYTE*)(PageIndices[0]+PageIndex*0x200));
Page_Write((BYTE*)(PageIndices[0]+PageIndex*0x200));
PageIndex++;
}
为测试该模块的可行性,以TMS320VC54x目标板为基础进行验证。具体方法略——编者注。
结语
本文提出了一种可在线更新程序的自举模块。该模块在GUI软件中将DSP程序代码进行格式转换,并通过USB将代码数据导入C8051F340单片机的片内FLASH中存储。C8051F340通过标准串行总线控制DSP进行自举。利用该模块,用户更新DSP程序代码可完全在计算机上操作,无需了解自举的具体细节,实现一键更新代码;同时该自举模块可在短短数秒内完成代码更新,从而大大减轻了开发难度和缩短开发周期。另外,由于单片机FLASH存储量为64 KB,除去单片机的程序占用空间,从0x2200地址开始,共可存储55.5 KB左右的DSP程序代码,满足大多数中小DSP应用程序的自举需求,因此该系统可广泛用于程序代码不超过55.5 KB的DSP系统中。