可在线更新应用程序代码的DSP自举模块
通过前面板传递给框图,计算和分析结果在前面板上以不同方式显示出来。图3为本模块的GUI前面板。如图所示前面板分为“输入配置区”和“状态显示区”。通过在前面板的“输入配置区”设置文件路径进行DSP代码文件的二次更新。“状态显示区”可实时显示USB连接状况、文件转换信息、自举代码文件内容等详细信息。
框图是图形化的程序代码,主要完成两个任务:调用USB主机的API函数控制USB数据传输和控制代码文件格式转换。
借助Silicon Laboratories公司为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器件。
在成功调用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”函数调用hex-to-dat.exe软件将.hex格式转换为.dat格式。最终在文件格式转换完毕之后提取代码并转换为数组,在循环中调用SI_Open()函数以每次512字节的速度将数据写入USB器件,直到所有文件传输完毕,关闭USB。
3.2 C8051F340程序设计
C8051F340通过USB从GUI软件接收DSP程序代码并存储到片内FLASH中,之后通过标准串行接口将代码传送给DSP进行自举。C8051F340程序主要包括初始化函数、自举函数、USB驱动函数、擦写FLASH函数几个部分。图6为C8051F340程序的流程图。
3.2.1 初始化程序
程序初始化部分主要包括USB设备初始化和C8051F340单片机初始化。USB初始化通过调用USBXpress提供的10个USB器件API函数实现,包括调用USB_Clock_Start()函数初始化USB总线时钟、调用USB_Init()函数使能USB总线、调用USB_Init_Enable()函数使能API中断;C8051F340单片机初始化中将单片机时钟设为48MHZ以满足USB全速工作方式的需要、配置单片机输出端口为推挽输出、开启外部中断0并通过配置寄存器“IT01CF=0x07”将P0.7配置为INT0的中断触发端口引脚,监视DSP所给自举信号。
DSP启动速度比C8051F340快,因此自举之前需先复位DSP并初始化SPI接口,等待DSP的XF引脚触发INT0中断后启动自举操作。本程序使用16位标准串行方式对DSP自举。通信时序如图7所示,BFSR0脉冲之后可传输一个16位的数据,传输的每个16位数据之间需至少保证40个DSP时钟周期的延时时间。且单片机时钟频率(BCLKR0)不可超过DSP时钟频率的1/2。标准串行自举代码如下所示,程序中将BFSR0拉高后,传输一个字节的数据,并通过调用延时函数Delaynum(20)延时20微秒来满足传输两数据间最小CPU时钟间隔的要求,程序中w为当前传输的由四个ASCⅡ字符转换而来的16位无符号整形变量。
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_P
在线更新应用程序代 相关文章:
- 电源设计小贴士 1:为您的电源选择正确的工作频率(12-25)
- 用于电压或电流调节的新调节器架构(07-19)
- 超低静态电流电源管理IC延长便携应用工作时间(04-14)
- 电源设计小贴士 2:驾驭噪声电源(01-01)
- 负载点降压稳压器及其稳定性检查方法(07-19)
- 电源设计小贴士 3:阻尼输入滤波器(第一部分)(01-16)