kaiyun官方注册
您所在的位置: 首页> 嵌入式技术> 业界动态> DSP+FLASH引导装载系统的设计与实现

DSP+FLASH引导装载系统的设计与实现

2008-10-29
作者:杨力波 潘志铂

摘 要:介绍了利用DSP编程实现对FLASH的读写操作,设计并实现了一个引导装载" title="引导装载">引导装载系统的模型,给出了一个简单的测试用的实例。整个方案有较大的灵活性和实用性。

关键词:数字信号处理器 FLASH存储器 引导装载

  在一些脱机运行的DSP系统中,用户代码需要在加电后自行装载运行。DSP系统的引导装载(Bootload)是指在系统加电时,DSP将一段存储在外部的非易失性存储器中的代码移植" title="代码移植">代码移植到内部的高速存储单元中去执行。这样既利用了外部的存储单元扩展DSP本身有限的ROM资源,又充分发挥了DSP内部资源的效能。尽管用户代码在一段时期相对是固定的,但是如果直接将其掩膜到内部ROM中去的话,一方面受容量以及价格的限制,另一方面则在系统代码升级上显得不是很灵活方便。FLASH是一种高密度、非易失性的电可擦写存储器,而且单位存储比特的价格比传统的EPROM要低,十分适合于低功耗、小尺寸和高性能的便携式系统。除了可以采用专用的硬件编程器把代码灌入FLASH中之外,也可以利用现成的DSP通过软件编程" title="软件编程">软件编程来实现同样的功能。本文论述的正是如何通过DSP软件编程来实现对FLASH的读写操作,并介绍一个简单的系统引导装载方案的实现。

1 系统描述

  本系统由DSP(TMS320VC5410)及外部的FLASH(M29W400T)以及相关的电源管理单元等构成。DSP与FLASH的连接如图1所示。DSP与FLASH是主从关系,由DSP的相关输出管脚控制FLASH的擦除和读写。其中,A0~A17为地址线,D0~D15为数据线,/MSTRB为存储选通信号,R/W是读写脉冲信号,/OE和/WE分别为读使能和写使能,/CE为片使能,/BYTE为8位或16位数据模式选择(图中接高电压为16位模式)。FLASH用于存放引导程序" title="引导程序">引导程序段和用户代码,由DSP软件编程来写入。当系统脱机加电时,DSP首先从外部FLASH指定的引导程序段的起始位置处开始执行引导装载。所谓引导装载,就是将原先存储在FLASH中的用户代码移植到DSP内部的高速执行单元,然后将程序指针设置为用户代码的起始地址。这样,接下来就可以利用DSP资源高速执行用户代码了。

2 DSP对FLASH的操作

2.1 DSP及FLASH简介

  TMS320VC5410是TI公司的C54x系列的定点DSP,具有低功耗和高速度,常用于便携式系统开发。其内部存储资源包括256Kb的可掩膜ROM以及可高速运行的128Kb的DARAM和896Kb的SARAM。ROM中固化了TI提供的引导装载代码,本方案采用自编的引导程序。

  ST公司的M29W400系列的FLASH容量为4Mb,分为11个不同大小的块结构,支持8位或16位操作模式。通过特殊的命令字序列可以对每一块独立进行擦除和读写。与以往的FLASH相比,它由外部单电压供电,无需额外提供高电压即可实现擦除及写入,因而在系统设计上无需考虑特殊的电平匹配。本方案采用16位模式。

2.2 地址映射方式

  由于用DSP操作FLASH,必然涉及到FLASH的实际地址在DSP中的映射方式。TMS320VC5410的地址空间如图2所示,包括数据空间和程序空间,具体的映射方式由DSP内部的一些寄存器决定。它使用页面扩展机制,最多可以寻址8192Kb的程序空间。假设FLASH的起始地址0x0000和DSP的起始地址0x0000重合,那么FLASH中只有对应于DSP外部空间的那部分地址,才是DSP可见的。比如,本方案中采用微处理器模式(MP=1)且OVLY=1时,则DSP第0页程序空间中可见的FLASH的地址范围为0x8000~0xFFFF。

  在擦除或读写FLASH之前,必须先执行相应的命令字序列,即在指定的FLASH地址处写入指定的指令代码。而整个FLASH地址空间并非和DSP的地址空间一一对应,所以需要考虑地址的重映射。

  现以对FLASH写入为例。未考虑地址重映射时,命令字序列如下所示:

  FlashWrite(0x5555L,0x00AA );//1st cycle

  FlashWrite(0x2AAAL,0x0055 );//2nd cycle

  FlashWrite(0x5555L,0x00A0 );//Program command

  FlashWrite(myaddress,mydata );//put mydata into myaddress

  由图2可知,当MP=1和OVLY=1时,FLASH地址0x5555L和0x2AAAL在DSP中位于外部空间之外,是不可见的。这样DSP执行上述语句时,根本没有对FLASH进行相应的操作,从而导致即使FLASH地址myaddress是DSP可见的,也无法实现数据写入的功能。

  仔细分析FLASH的命令字序列可知,前三句命令字序列中真正起作用的地址位是A0~A14,而高地址位A15~A17可以是任意值。于是考虑加一个偏移量0x8000,使得重映射后的FLASH地址在DSP中是可见的。修改后的代码如下所示:

  #define OFFSET 0x8000

  FlashWrite((0x5555L+OFFSET),0x00AA); //1st cycle

  FlashWrite((0x2AAAL+OFFSET),0x0055); //2nd cycle

  FlashWrite((0x5555L+OFFSET),0x00A0);//Program command

  FlashWrite(myaddress,mydata);//put mydata into myaddress

  这样,在DSP中就可以对外部FLASH进行写入操作了,前提是FLASH地址myaddress在DSP中可见。擦除和读操作也要对照图2作类似的地址重映射,不一一累述。

2.3 擦除和读写过程描述

  在DSP将数据写入FLASH之前,先要删除数据所在块,然后才能重新写入。擦除和写操作之前都要执行相应的命令字序列,而读操作则可以直接进行。而且要写入的数据部分应为引导程序段以及用户代码是经过编译、连接后的目标代码,且为FLASH可识别的HEX格式。

3 引导装载模型设计

3.1 引导装载原理

  加电前,DSP设置为微处理器模式(MP=1)。加电后,DSP首先执行0xFF80处的中断向量表" title="向量表">向量表起始处的跳转命令,转向0xF800处的引导程序段并实现代码移植功能。完毕后,再次跳转到移植后的用户程序段的起始地址并执行之。

3.2 逻辑功能分块

  引导装载系统包括引导程序段、用户程序段、中断向量表和连接命令文件四部分。引导程序段负责将用户程序段和中断向量表装载到目标地址,用户程序段是实现用户系统功能的核心代码,中断向量表包括加电后的跳转处理和中断服务程序的入口,连接命令文件则是分配各个程序段在DSP地址空间中的位置。

3.3 具体代码实现

  引导程序段(load.asm)如下:

.def load_start

.sect ″load_prg″

load_start:

ssbx intm ;关中断

rsbx sxm ;符号扩展模式设置为0

ld #0,dp ;定义数据页指针为0

nop

nop

nop

ld #0ff80h,a ;移植中断向量表,0xff80为中断向量表的旧起始地址

stm #VECT_NEW, ar1 ;VECT_NEW表示中断向量表的新起始地址

rpt #(VECT_LEN-1) ;VECT_LEN表示中断向量表的长度

reada *ar1+

nop

ld #MAIN_OLD,a ;移植用户程序段,MAIN_OLD表示用户程序段的旧起始 地址

stm #MAIN_NEW,ar1 ;MAIN_NEW表示用户程序段的新起始地址

rpt #(MAIN_LEN-1) ;MAIN_LEN表示用户程序段的长度

reada *ar1+

endboot:

orm #020h,@1dh ;设置OVLY=1,使得内部RAM同时映射到DSP数据和程序空间

ld #MAIN_NEW,a

bacc a ;程序指针指向用户程序段的起始地址

.end

用户程序段(main.asm)如下:

.def main_start

.sect ″main_prg″

main_start:

USER_PRG ;此处添加用户程序段

.end

中断向量表(vect.asm)如下:

.mmregs

.ref 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_OLD,run=MAIN_NEW

vectors: load=0ff80h,run=VECT_NEW

load_prg: load=0f800h

}

4 写入目标代码

  上述引导程序经过CCS编译及连接后,生成的目标文件boot.out是DSP能够识别的COFF格式。但是FLASH不支持这种格式,所以不能直接写入FLASH中。CCS自带有多种HEX类型的转换程序,比如常见的有Intel格式等。但是不同的HEX类型有不同的格式和头尾开销,比如Intel格式中除了数据之外还有起始符、字节个数、起始地址、类型以及校验位等各种信息,并非纯粹数据的HEX格式表示。了解了Intel格式的文件结构之后,就可以从中提取出需要写入FLASH中的代码的HEX格式及相应的地址,即对应上面提到的mydata和myaddress。然后就可以利用上面的方法,用DSP将引导系统各个部分的代码在脱机运行前写入FLASH。

5 简单测试实例

  利用上述方法,使得系统在脱机状态下实现引导装载,并且从DSP的XF端口输出均匀脉冲波形。直接修改用户程序段可用如下的代码取代用户程序段中的USER_PRG。

loop: rsbx xf

nop

ssbx xf

nop

b loop

  经过编译、连接、格式转换以及写入FLASH之后,系统就可以实际脱机运行了。加电一段时间后,可以通过示波器测量得到XF端口的均匀脉冲波形,证明引导装载成功。

参考文献

1 TMS320VC5410 Fixed-point Digital Signal Processor Data Manual.TI Inc.,Dec.,2000

2 M29W400 Data Sheet.ST Inc.,Nov.,1999

3 Software Drivers for M29F400 and M29W400 FLASH Memories.ST Inc.,March,2000

4 TMS320C54x Assembly Language Tools User’s Guide.TI Inc.,Dec.,1999

本站内容除特别声明的原创文章之外,转载内容只为传递更多信息,并不代表本网站赞同其观点。转载的所有的文章、图片、音/视频文件等资料的版权归版权所有权人所有。本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如涉及作品内容、版权和其它问题,请及时通过电子邮件或电话通知我们,以便迅速采取适当措施,避免给双方造成不必要的经济损失。联系电话:010-82306116;邮箱:aet@chinaaet.com。
Baidu
map