微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 用DSP软件编程实现的引导装载系统设计

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

时间:06-03 来源:3721RD 点击:

的重映射。文中以对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
}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top