新闻中心

EEPW首页>嵌入式系统>设计应用> 用DSP软件编程实现的引导装载系统设计

用DSP软件编程实现的引导装载系统设计

作者: 时间:2012-07-03 来源:网络 收藏

本文引用地址://m.amcfsurvey.com/article/257389.htm

2.3对FLASH的操作

对照图1的地址映射关系,如果采用的是微处理器模式(MP/MC=1),并且设置寄存器OVLY=I,那么由于连接的关系使得FLASH的起始地址0x0000和的起始地址0x0000重合,在第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管脚输出的均匀脉冲方波,以证明引导装载成功。


上一页 1 2 下一页

评论


相关推荐

技术专区

关闭