一种DSP通过并行接口FLASH加载的方法
摘 要 本文介绍了一种DSP通过并行接口FLASH加载的方法,在分析了DSP自举加载的步骤之后给出了FLASH与DSP连接的硬件电路图,列出了DSP的引导表构造过程,并且写出了一段典型的FLASH写入检测程序的源代码。
关键词 DSP FLASH 并行加载 引导表
一、C54DSP的加载引导方式 在DSP系统中,当一个程序仿真调试通过后,为使DSP目标系统成为一个独立的脱机运行系统,就必须进行DSP的引导装载设计。
C54DSP目标系统装载的目的,是使系统上电后程序代码能从外部存储介质(如FLASH)引导装载到DSP内部或者外部程序存储器中脱机运行。DSP目标系统引导装载的设计实现有两个突出的优点:一是应用程序代码可以存储在片外相对速度较慢、断电后数据不会丢失的外部程序存储器中,上电后通过引导装载方式,将程序代码搬移到DSP片内或片外的程序存储器中运行;二是它也可以省去对DSP片内ROM进行掩膜编程操作,因为掩膜编程费用高,一般应用于大规模生成场合,而且还须将程序提交给DSP芯片厂家来完成。因此,DSP引导装载功能给DSP用户进行独立运行系统设计带来极大的方便。
引导装载的方式主要包括并行I/O口引导装载、串行口引导装载、HPI引导装载、外部并行引导装载等模式,并支持8位字节和16位字的引导装载方式。
二、并行引导方式下C54DSP与SST39VF160的连接
图1. TMS320VC5402DSP与SST39VF160的电路连接
本文选用的FLASH是一个1M×8bit的FLASH。C5402最大可扩展8M字的存储空间,其数据存储空间最大可扩展64K字的存储空间,所以我们在这个例子中,只使用了SST39VF160这样一个1M×8bit的FLASH中空间的一小部分来扩展DSP的数据存储空间。即DSP和FLASH的低20位地址线对应相连。FLASH剩余的高位地址线可以直接接地。
在并行引导方式下,TMS320VC5402DSP与SST39VF160的电路连接如图1所示。
三、DSP的加载引导过程
复位时,如果DSP是在微计算机方式(MP/MC=0),则片内ROM中的引导装载程序就会被执行,引导装载程序是在DSP芯片出厂时就被烧制到片内ROM中的,引导装载程序的功能就是复位时将用户代码从外部存储介质装载到DSP的程序存储器中。
引导装载程序在搬移应用程序之前,首先对CPU状态寄存器进行初始化。初始化工作包括:使中断无效(INTM=1),内部DARAM映射到程序/数据区(OVLY=1),对程序和数据区域均设置7个等待状态等。一旦初始化完成,引导装载程序将进行一系列操作,来判断用户所采用的引导装载模式。引导装载程序按照下列顺序执行引导装载模式的判断选择:HPI模式、并行I/O接口模式、外部并行模式、串行口模式。
在外部并行引导模式下,可对软件等待状态寄存器SWWSR和块切换控制寄存器BSCR进行配置,使高速DSP芯片能从相对较慢的外部FLASH读取数据,缺省的设置是7个等待状态。引导装载程序可以从地址位0xFFFF的I/O端口或者数据存储器取得源程序地址。
四、构造引导装载表
C5402上电复位后,指令总是从FF80h处执行, 然后自动跳转到内部引导程序入口地址F800h,判断芯片MP/MC位,若为逻辑0,则执行引导程序。为使C5402能有效地把外扩FLASH中的程序引导到芯片内RAM,需要编制一个引导表。
引导表定位于数据空间的4000h-FFFFh段,引导表的内容包含如下几个方面:(1)引导方式的标识;(2)程序存放的目标首地址;(3)程序执行的入口地址;(4)用户程序代码;(5)用户程序块长度。
汇编器和链接器产生的目标文件是二进制的COFF文件,这种文件格式采用模块式编程方法,并提供了灵活的管理代码段的机制,但大多数编程器不能接受COFF目标文件格式作为输入。Hex转换工具用来将COFF目标文件转换成标准的ASCII码十六进制格式,使之能为普通的编程器所接收。引导表数据结构是通过执行链接命令程序和Hex转换公用命令程序形成的。在链接命令程序中分配了程序和数据结构,在HEX转换公用命令程序中定义了引导方式、程序执行的入口地址和外部FLASH的首地址。片内ROM的引导程序首先读取I/O空间的FFFFh地址内容(指定为4000h)作为引导表的起始地址,通过判别引导表起始地址内的引导标识来确定是8位并行还是16位并行引导方式。若引导标识是10AAh,则是16位的并行引导方式;若引导标识是08AAh,则是8位的并行引导方式。当从I/O空间FFFFh地址读取不到有效的引导标识时,片内ROM的引导程序即读取数据空间FFFFh的内容作为引导表的起始地址。同样通过判别引导表起始地址内的引导标识来确定是8位并行还是16位并行引导方式。
引导表的生成按如下步骤进行。
步骤1:编译源文件。
可以使用CCS中的build命令完成,注意在其汇编属性中要加上-v548选项,表示生成的汇编代码是专用于具有增强的引导装载功能的DSP。假设生成的文件名为DSPCODE.out。
步骤2:运行16进制转换程序。
Hex500 DSPCODE.cmd
十六进制转换程序配置文件DSPCODE.cmd如下所示:
DSPCODE.out 转换的文件名
-o DSPCODE.hex 生成的二进制文件名
-a ASCII-Hex目标格式
-map DSPCODE.mxp 生成的映射文件名
-memwidth 16 16位存储器宽度
-romwidth 16 16位FLASH
-boot 将段转换为引导装载表格式
-bootorg 0x8000 引导装载表从FLASH的0x8000开始存放
-bootorg PARALLEL 并行装载
-swwsr 0x7fff 设置软件等待状态寄存器的值
-bscr 0xf800 设置存储器体制转换控制寄存器的值
-e 0x3000 程序运行的起始地址
当引导表DSPCODE.hex生成之后,将其写入FLASH中就可以自举加载运行了。生成的hex文件数据存放的格式如表1所示。
表1. hex文件数据存放格式
五、FLASH的写入过程
FLASH写入程序必须遵循特定的指令周期,对SST39VF160的操作过程大致如表2所示:
表2. SST39VF160命令周期
只要向FLASH存储器的特定寄存器写入地址和数据命令,就可对FLASH存储器编程。对于编程命令,向FLASH的指定地址写入数据,需要4个总线周期,前两个周期是解锁周期,第三个周期建立编程命令,最后一个周期则向编程地址写入编程数据。
典型的FLASH写入检测流程如图2所示。
图2. FLASH写入检测流程
FLASH内部的编程或擦除算法可自动完成编程或擦除操作,但必须了解其内部的操作检测机制,以便知道操作是否完成或正确。常用的检测状态位有:跳变位(D6)、超时标志位(D5)、数据查询位(D7)和Ready/busy引脚(RY/)。检测的方法有三种。第一种是判断引脚RY/的状态。在编程、擦除或擦除挂起操作过程中RY/引脚一直为“0”,操作完成后变为“1”。第二种是检测跳变位D6,在编程或擦除时对任何地址进行连续的读均引起D6连续跳变,直至操作结束才停止跳变。 最后一种是使用数据线的D7、D5。D7位在编程或擦除过程中输出的数是写入该位数据的反码。当操作完成时输出才变为写入该位的数据;D5的状态为“1”时表示操作超时,此时应再读一次D7的状态,若D7输出仍不是写入的数据,则操作失败,复位FLASH。
下面我们给出一个写入FLASH一个字的函数,我们没有使用上面得检测机制,而是直接读取两次已经写入得数据,如果相同,则认为已经写入正确了。其代码如下。
void Write_Word(unsigned int address,unsigned int datum)
{
unsigned int rdatum1,rdatum2;
FLASHROM[0x5555]=0xaa;
FLASHROM[0x2AAA]=0x55; /*解锁周期*/
FLASHROM[0x5555]=0xa0; /*建立编程命令*/
FLASHROM[address]=datum; /*向地址address处写入数据*/
while(1)
{
rdatum1=FLASHROM[address];
rdatum2=FLASHROM[address]; /*两次读取同一地址的数据*/
if((rdatum2==rdatum1)&&(rdatum2==datum))
{
break; /*相同则跳出循环*/
}
}
}
六、结论
经过以上的步骤,一个程序就被写入DSP的并行加载FLASH中,所设计的DSP目标系统就可脱机运行,成为一个独立的DSP应用系统。本文作者创新点就是使用了两次读入检测FLASH是否正确的检验机制,用FLASH扩展DSP的数据存储空间进行16位的并行加载引导也具有相当的典型意义。以上所有软硬件设计及代码均在我们基于TMS320VC5402A设计的DSP应用系统中调试通过,软硬件均具有典型意义和参考价值。
|