学海荡舟手机网

主页 > 实用文摘 > 教育文摘_18 > > 详细内容

利用Flash实现DSP对多个程序有选择的加载_存储器论文

摘要:主要介绍一种利用flash存储器实现双dsp系统对多份用户代码有选择的上电加载的方法。其中,重点介绍m29w800ab flash的使用和编程方法,tms320vc54x dsp的上电自动引导过程,以及hpi模式和并行模式加载用户代码的方法。

    关键词:flash存储器 dsp 主机接口 bootloader 引导表

引 言

 在tms320c54x系列dsp系统的开发中,由于dsp片内只有rom和ram存储器,如要将用户代码写入rom中,必须要由dsp芯片厂家来完成;但这样做用户就不能再更改代码,很不实用。由于ram在dsp掉电后不能再保存数据,因此,常常利用eprom、flash等一些外部存储器来存放用户代码。在dsp上电工作后,利用dsp提供的boot机制,再将程序下载到dsp ram中运行。如果使用eprom外部存储器存放用户代码,需要用代码转换工具将用户代码转换为二进制目标文件,然后用编程器将其烧写进eprom;而如果使用flash存储器存放用户代码,则可直接使用dsp仿真器和ccs(code composer studio )仿真环境进行在线编程,使用灵活方便,不再需要其它编程设备。在某一以太网通信系统中,我们就采用flash存储器来实现多份用户代码的有选择加载。下面就以此系统为例介绍对tms320vc54x dsp的一种用户代码加载的方法。

1 系统构架

牐牬送ㄐ畔低郴于802.3以太网标准,用以实现各终端之间的话音和其它数据的通信,以及实现局域网内终端与外界的话音和数据通信。为节约开发成本,提高系统的可扩展性、通用性和灵活性,我们对每个网内终端采用同样的硬件架构,通过使用不同的软件代码而使其实现不同的功能,发挥不同的作用。

牐犆恳煌ㄐ胖斩擞2块dsp芯片、1块网卡、1块cpld和1块fpga以及flash存储器等器件组成可扩展的基本结构。其中,以tms320vc5410 dsp作为主cpu,负责系统的逻辑控制和一般数据传输;以ms320vc5416 dsp作为从cpu,负责话音的编解码和回声消除、语音检测等工作。2块dsp之间通过主机接口(hpi)进行通信。为了实现代码的有选择下载,可由fpga配置一端口作为拨码开关,使用户通过调节拨码开关,可以有选择地下载存储于flash中的用户代码,其结构如图1所示。

牐犈渲貌β肟关是为了扩充系统的功能,以实现一个硬件平台的多种用途。我们可以将实现不同功能的多份用户代码都写入flash存储器中存放,通过硬件拨码开关的设置,选择其中一份用户代码下载执行。在系统上电加载用户代码时,系统先从flash下载fpga配置程序,然后通过fpga读出拨码开关的值,再根据此值从flash中选择对应的5410 dsp用户代码加载;而5416 dsp的用户代码加载是在5410代码加载完成,启动运行后由5410程序从flash中读出相应的5416代码,再通过hpi加载到5416的,以此实现5416 dsp的代码加载与启动。

2 m29w800ab flash存储器介绍及使用

牐犜诖讼低持校我们选用的是m29w800ab flash存储器,其容量为512k×16位, 分为16页,每页32k。其中,第0页有4个模块:0x00~0x1fff、0x2000~0x2fff、0x3000~0x3fff、0x4000~0x7fff。其余各页,每页为1个模块,共有19个模块。

牐牰訤lash的操作要靠写入一系列特定的地址和数据序列来完成。在每次对flash写入之前,要对其原来的内容进行擦除。flash的擦除包括块擦除和芯片擦除两种。块擦除是对一个模块进行擦除,芯片擦除是擦除整个flash的内容。因此,对flash的操作,是以模块为基本单元的。对flash的操作由指令决定,其必须满足flash的时序要求,每条指令需要1~6个不等的指令周期。主要操作指令包括读数据指令、编程指令、复位指令、自动选择指令和擦除指令。每个指令周期由一个命令构成,每个命令代码所执行的任务如表1所列。

表1 flash的命令说明

hex代码命    令
00h有效/保留
10h芯片擦除确认
20h保留
30h模块擦除继续/确认
80h建立擦除
90h读电平信号/模块保护状态
a0h编程
b0h擦除中止
f0h读阵列/复位

牐犗旅嬉訫29w800ab flash的块擦除指令为例,具体说明flash的操作时序:块擦除指令需要6个总线周期,先以2个解锁周期开始,然后是1个擦除建立周期,接下来又是2个解锁周期,最后是1个擦除确认周期,其指令时序如表2所列。

表2 flash擦除指令说明

周期第1周期第2周期第3周期第4周期第5周期第6周期
地址5555h2aaah5555h5555h2aaah模块地址
数据aah55h80haah55h30h

牐犉銫语言程序设计代码如下:

#define flash ((volatile unsigned int*)0x8000)

block_erase(addr){

flash[0x5555] = 0x00aa;

wait(1000);

flash[0x2aaa] = 0x0055;

wait(1000);

flash[0x5555] = 0x0080;

wait(1000);

flash[0x5555] = 0x00aa;

wait(1000);

flash[0x2aaa] = 0x0055;

wait(1000);

flash[addr] = 0x0030;

}

牐犘枰注意的是,flash相对于dsp来说是慢速设备,编程时,对flash的访问需要有足够的延时等待。对其它指令这里就不一一介绍了。要了解更多内容,可参考具体的flash存储器手册。

3 引导装载

牐燭ms320vc5410和tms320vc5416片内rom中固化有ti公司的引导装载(bootloader)程序,用于在上电复位时把用户代码从外部存储器引导到片内ram中运行。引导程序是在一些片内固化的一个程序,它负责上电时初始化存储器。换句话说,它将程序从非易失性存储器(如flash存储器)中调入系统的存储器中。其提供的片内引导模式有: hpi(主机接口)引导、并行eprom引导、并行i/o引导和串行口引导等。下面先介绍这两块芯片的上电引导过程。

牐燚sp上电复位后,先检测其mp/mc引脚,如果mp/mc=“0”,表示使用片内rom引导。此时,dsp从0xff80处开始执行ti的片内引导程序。进入引导程序后,hint引脚变为低电平,然后开始检测int2是否为低电平(有效)。如有效,则进入hpi引导方式;否则,检测int3引脚。如有int3请求中断,则进入串行引导方式;否则,就进入并行引导方式。在本系统中,我们采用ti公司提供的bootlooder程序进行引导装载,为此,应将mp/mc引脚接低电平。引导程序流程如图2所示。

    3.1 hpi模式实现tms320vc5416的程序加载

牐牥匆陨仙杓疲5416dsp的程序加载采用hpi(主机接口)模式。对于hpi引导模式,必须将hint和int2引脚连接在一起,以保证bootloader程序能检测到int2有效。当检测其为低电平时,进入hpi引导方式。主处理器5410启动运行后,5410程序从flash中下载5416程序,通过5410与5416之间的hpi写入5416 ram。在将程序写入5416时,要按照5416程序的cmd文件配置,将从flash中读出的代码写入5416程序空间的代码段。写完代码后,还应将5416代码的起始地址写入5416的0x7f单元,将0写入0x7e单元,起始地址可在ccs仿真环境中编译5416代码后看出,此时pc所指向的位置就是代码的起始地址。这是因为,当5416进入hpi引导方式后,boodloader程序开始检测0x7f单元的内容(0x7e和0x7f两单元内容在boodloader程序开始执行时就清零)。当检测到其内容不为零时,即将0x7e的内容赋给xpc,将0x7f的内容赋给pc,程序跳转到pc所指向位置执行用户代码。这样就实现了从片5416的程序加载启动。图3是hpi模式加载用户代码的流程。

    3.2 并行加载模式实现tms320vc5410的程序加载

牐5410主处理器的用户代码加载采用并行模式加载。在本系统中,有多份5410用户代码存储于flash中。系统上电后,先要从flash中下载fpga配置代码,然后读出拨码开关的值,再选择相应的用户代码下载,完成后,跳转到用户代码的入口地址开始执行用户代码。为此,需要设计一启动程序以实现以上功能。启动程序的内容包括下载fpga配置代码,读拔码开关值,并根据此值选择下载相应的5410用户代码到其cmd文件配置的相应程序空间。完成后,跳转到用户代码起始地址。代码的起始地址通过ccs仿真环境编译后获得,启动程序的下载运行,则要依靠ti的片内引导程序,采用16位并行模式引导加载,需要构建引导表。所谓引导表就是引导程序要调入的代码。引导表中除了包括源代码之外,还包含一些附加信息。这些信息指导引导程序的具体执行过程。因此,可以说引导表是由程序代码和一些附加组成的一种数据结构。在这里,我们需要用启动程序构建引导表,并将引导表也写入flash中。

牐犜诖讼低持校現lash存储器映射为dsp的0x8000~0xffff数据空间。对flash操作时,首先要选择页,每一页都对应为dsp的0x8000~0xffff地址的数据空间。需要注意:除了将引导表写入flash外,还应将引导表的起始地址(对于dsp处理器而言的地址,如果在flash中为0,则对dsp即为0x8000)写入flash第一页的最后一个单元(0x7fff单元),即dsp存储空间的0xffffh单元。

牐犚导程序进入并行加载模式后,将查询数据空间的0xffffh单元,直到读入一个有效的地址数据。此数据为用户引导表的入口地址。这时,引导程序就跳转到flash中的用户引导表开始执行。需要注意的是,对于不同型号和厂家的flash,其引导表的格式和内容是不同的。下面就m29w800ab flash引导表的格式及我们所配置的内容说明如下:

10aah(16位模式)
7fff(swwsr寄存器值)
8000h(bscr寄存器值)
0h(启动程序运行的xpc值)
d08h(启动程序运行起始的pc值)
22f8h(启动程序的长度)
0h(启动程序装载的起始地址xpc)
d08h(启动程序装载起始地址pc)
启动程序代码…
连接8个单元的0h(表示引导表结束)

牐牫绦蚋据引导表的内容将用户代码下载到指定的程序空间中,并将指定的程序入口地址值赋给pc,使程序从此处开始执行,从而完成5410 dsp的引导启动。并行引导流程如图4所示。

牐犜谙低车氖导实魇怨程中,通过hpi加载5416代码时,要注意5410和5416的时钟要匹配。一般来说,要求从片时钟为主片时钟的1.25倍以上。在此系统中,系统基准时钟为8mhz,5410启动时钟设为8mhz,5416设为10倍频80mhz。

牐牨鞠低匙畲蟮挠诺闶鞘迪至艘换多用,扩展了系统的功能,增强了系统的灵活性和通用性,在实际应用中已取得了良好的效果。