用DSP软件编程实现的引导装载系统设计
扫描二维码
随时随地手机看文章
1 概述
DSP系统的引导装载是指在系统加电后,系统自行将一段存储在外部非易失性存储器中的代码移植到内部DSP的高速RAM中并执行的过程。因此,在引导装载系统中,外部非易失性存储器和DSP的性能显得尤为重要。FLASH存储器是一种高密度、非易失性的电可擦写存储器,而且单位存储比特的价格比传统的EPROM要低,所以十分适合于作为外扩存储器。在系统加电之前,必须先将引导程序和用户程序写入FLASH中。编程时,除了可以利用专用的硬件编程器实现对FLASH的编程之外,FLASH通常还支持DSP软件编程以实现同样的功能。当系统加电之后,一般首先在FLASH中运行引导程序,并由其自行完成对用户程序的移植操作,然后再由DSP高速运行移人到DSP片内的用户程序。本文介绍了TI公司的TMS320VC5410定点DSP和ST公司的M29W400T FLASH存储器的基本特点和主要结构,给出了通过DSP对FLASH进行软件编程的具体方法,同时介绍了实现一个完整的引导装载系统的实现方案。
2 硬件描述
2.1器件简介
TMS320VC5410数字信号处理器是美国TI公司推出的TMS320VC54x系列定点DSP中的一种,它具有144管脚的LQFP封装,采用3.3V的I/O电压和2.5V的核电压供电方式,具有3个独立的16位数据总线和1个程序总线的多总线并行结构,其低功耗和高速度适用于便携式系统的开发。由于本文涉及到DSP对FLASH的存储器地址操作;因此,在此对相关内容加以介绍。
DSP的存储空间包括程序空间和数据空间,它们均划分为64k X l6位的页面。其中DSP片内存储资源包括16k X l6位的可掩膜ROM以及可高速运行的4个2k X 16位的DARAM和7个8k X l6位的SARAM。DSP有两种工作模式:微处理器模式和微计算机模式,分别对应MP/MC=1和0。本系统中采用的是加电后从外扩的FLASH中启动,即采用微处理器模式,所以没有用到DSP内部ROM中固化的引导程序,而是采用早先写入FLASH中的自行设计的引导程序。
TMS320VC5410的存储空间映射如图1所示,它最大可支持128个存储页面,寻址空间为8Mb。在图1中,当MP/MC=1时,程序空间的第0和第1页面对应于图中最左边的两列,数据空间的第0页面对应于图中最右边的一列,其中的外部空间(External)即对应外扩的FLASH,只有这部分FLASH存储空间才可以被DSP访问到。由此可知,DSP对FLASH进行读写操作的前提是,FLASH在DSP存储空间中至少是可见的。
M29W400系列是ST公司推出的FLASH存储器,该系列器件十分适合于用作外扩存储器。M29W400T是该系列中的一种,它采用3V单电源供电,并采用TSOP封装形式。
M29W400T存储器的容量为4MB,分为11个不同大小的块结构,它支持8位或16位操作模式。本文采用16位操作模式。M29W400T的外形封装如图2所示,管脚功能见表1所列。M29W400T最重要特点就是无需额外提供高电压即可通过一些特殊的命令字序列实现对各个块的读写和擦除,并且可重复进行十万次以上。这样使得通过DSP软件编程实现对M29W400T的读写操作成为可能,并十分适合于系统的调试和开发。
2.2系统连接
本系统由TMS320VC5410和M29W400T以及相关的电源管理单元等构成,具体的连接电路如图3所示。图中,DSP与FLASH是主从关系,由DSP的相关输出管脚来控制FLASH的擦除和读写。其中A0-A17为地址线,DO-D15为数据线,MSTRB为存储选通信号,R/W是读写脉冲信号,OE和WE分别为读使能和写使能,CE为片使能,BYTE为8位或16位数据模式选择(图3中BYTE接高电压为16位模式)。当系统按如图3所示进行连接后,DSP的前一半4MB地址空间数与FLASH的4MB地址空间一一对应,因此,FLASH中的地址值即为DSP中的地址值,这样,对地址的操作就变得极为方便。
FLASH中用于存放引导程序段和用户代码段,由DSP软件编程写入。当系统脱机加电时,DSP首先从外部FLASH指定的引导程序段的起始位置处开始执行引导装载,即将原先存储在FLASH中的用户代码移植到DSP片内的RAM中,然后将程序指针设置为用户程序的起始地址,接下来便可利用DSP资源去高速执行用户程序。
2.3 DSP对FLASH的操作
对照图1的地址映射关系,如果采用的是微处理器模式(MP/MC=1),并且设置寄存器OVLY=I,那么由于连接的关系使得FLASH的起始地址0x0000和DSP的起始地址0x0000重合,在DSP第0页程序空间中可见的FLASH的地址范围应为0x8000-0xFFFF。
在擦除或读写FLASH之前,必须先执行相应的命令字序列,即在指定的FLASH地址处写入指定的指令代码,M29W400T的命令字序列如表2所示。
表2中的某些FLASH地址空间对照图1恰好对应于DSP的内部地址空间,即对DSP而言是不可见的,所以需要考虑地址的重映射。文中以对FLASH写人为例,FlashWrite表示一次底层的总线写操作。
未考虑地址重映射时,命令字序列为:
FlashWrite(0x5555L,0x00AA);// lst cycle
FlashWrite(0x2AAAL.0x0055);// 2nd cycle
FlashWrite(Ox5555L,OxOOAO);// 3rd cycle
(写入命令)
FlashWrite(myaddress,mydata);// 将数据
mydata写入FLASH地址myaddress
由图1可知,当MP=1和OVLY=1时,FLASH地址0x5555L和0x2AAAL在DSP中不属于外部空间,即对DSP是不可见的。这样DSP执行上述语句时,根本没有对FLASH进行相应的操作,从而导致即使FLASH地址myaddress是DSP可见的,也无法实现数据写入的功能。
仔细分析FLASH的命令字序列可知,其实前三句命令字序列中真正起作用的地址位是A0-A14,而高地址位A15-A17可以是任意值,于是考虑加一个地址偏移量0x8000,以使得重映射后的FLASH地址在DSP中是可见的。修改后的代码为:
#define OFFSET Ox8000
FlashWrite(((k5555L+OFFSET),0x00AA);// 19tcycle
FlashWrite((0x2AAAL+OFFSET),0x0055);// 2ndcycle
FlashWrite((0x5555L+OFFSET),0x00A0);
// 3rdf cycle(重映射的写入命令)
FlashWrite(myaddress,mydata): // 将数据mydata
写入FLASH地址myaddress
这样,在DSP中就可以对外部FLASH进行写入操作了,而其前提是FLASH地址myaddress在DSP中可见。其它的擦除和读操作也要对照图1作类似的地址重映射。
在DSP将数据写入FLASH之前,只有先删除数据所在块,然后才能重新写入。擦除和写操作之前都要执行如表2所示的相应命令字序列。其中要写入的数据部分即为引导程序以及用户程序经过编译、连接后的目标代码,为M29W400T可识别的HEX格式。
3 软件描述
3.1 功能分析
引导装载系统主要由引导程序和用户程序两部分构成,最后都存储在外扩的M29W400T的指定地址中。以上主要叙述的是如何将目标代码写入M29W400T,下面叙述如何设计引导程序和用户程序,以及生成最后目标代码的方法。
由于DSP采用微计算机工作模式。因此,在加电后,DSP将首先执行0xFF80处的中断向量表起始处的跳转命令,然后转向0xF800处的引导程序并实现代码移植功能。完毕后,再次跳转到移植后的用户程序的起始地址并执行。
以一个完整的引导装载系统为例,设用户程序是从TMS320VC5410的XF管脚输出一个均匀方波。此段代码也可以被其它用户程序替代,因此本文的引导装载系统具有一定的通用性。
3.2 代码实现
利用TI公司的DSP集成开发套件CCS可以生成*.out格式的目标代码,首先要建立引导程序段、用户程序段、中断向量表和连接命令文件四部分。引导程序段负责将用户程序段和中断向量表装载到目标地址,用户程序段是实现用户系统功能的核心代码(本文仅以实现输出一个方波为例),中断向量表包括自启时的跳转处理和中断服务程序的人口;连接命令文件则是分配各个程序段在DSP地址空间中的位置,协助生成目标代码,在这四部分中,引导程序段是设计重点,它负责将中断向量表和用户代码段从片外的M29W400T移植到片内的RAM中,并且将程序指针指向用户代码段起始地址。其引导程序段(1Oad.asm)的命令代码如下:
.def load_start
.sect,"load_prg"
load_start:
ssbx intm ;关中断
rsbx sxm ;符号扩展模式设置为0
ld #0,dp ;定义数据页指针为0
nop
nop
nop
1d #0ff80h,a ;移植中断向量表,
0xff80为中断向量表的旧起始地址
stm # VECT_NEW,arl;VECT_NEW表示中断向量表的新起始地址
rpt#(VECT_LEN_1);VECT_LEN表示中断向量表的长度
reada * arl+
nop
ld # MAIN_OLD,a ;移植用户程序段,
MAm_OlD表示用户程序段的旧起始地址
stm # MAIN-NEW,arl ;MAIN_NEW表示用户程序段的新起始地址
rpt#(MAIN_LEN_1) ;MAIN_LEN表示用户程序段的长度
reada * arl+
endboot:
orm # 020h,@ldh ;
设置OVLY=1,使得内部RAM同时映射到DSP数据和程序空间
ld # MAIN_NEW,a
bacc a ;程序指针指向用户程序段的起始地址
.end
用户程序段(main.asm)代码如下:
.def main_start
.sect "main_prg"
main_start:
loop: rsbx xf ;实现XF的复位和置位
nop
ssbx Xf
nop
b loop
.end
中断向量表(vect.asm)如下:
.mmregs
.Ief main_ start
.ref lOad_start
.def reset
.def nmi
.sect‘‘.vectors‘‘
reset: bd load_start ;加电后,跳转到自启程序段起始地址
stm #200,sp
nmi: rete ;
此表中只包含NMI中断入口,也可以类似添加其他中断入口
nop
nop
nop
.end
连接命令文件(boot.cmd)的配置如下:
vect.obj
main.obj
load.obj
-O boot.out
SECTIONS
{
main_prg:load=MAIN_OID,run=MAIN_NEW
vectors: load=0ff80h,run=VECF_NEW
load_prg:load=0f800h
}
上述引导程序经过CCS编译及连接后,生成的目标文件boot.out是TMS320VC5410能够识别的COFF格式,但是M29W400T不支持这种格式,所以不能直接写入FLASH中。而CCS自身带有多种HEX类型的转换程序。因此,在经过格式转换后,即可得到对应于上文提到的一系列数据和地址mydata和myaddress,此时就可以在联机情况下利用CCS以DSP软件编程方式将目标代码写入到M29W400T之中。一旦写入成功,便可以脱机加电自启系统。同时,在经一段时间后,还可用示波器测得XF管脚输出的均匀脉冲方波,以证明引导装载成功。