关键词:数字信号处理器 FLASH存储器 引导装载 TMS320C6711
1 概述
在一些脱机运行的DSP系统中,用户代码需要在加电后自动装载运行。DSP系统的引导装载(Bootload)是指在系统加电时,由DSP将一段存储在外部非易失性存储器中的代码移植到高速存储器单元中去执行。这样既可利用外部存储单元来扩展DSP本身有限的ROM资源,又能充分发挥DSP内部资源的效能。因此,在装载系统中,外部非易失性存储器和DSP的性能显得尤为重要。FLASH是一种高密度、非易失性的电可擦写存储器,而且单位存储比特的价格比传统EPROM要低,十分适合用于低功耗、小尺寸和高性能的便携式系统。本文介绍了TI公司TMS320C6711浮点DSP芯片和SST公司SST39VF040 FLASH存储器的基本特点,同时给出了一具完整的用FLASH来实现系统引导装载的实现方案。
2 硬件设计
2.1 器件介绍
整个系统由DSP(TMS320C6711),外部FLASH存储器(SST39VF040)以及电源管理单元等构成。下面主要介绍前面两个模块。TMS320C6711数字信号处理器是美国TI公司推出的TMS320C6000系列浮点DSP的一种,它采用256管脚的BGA封装,3.3V的I/O电压和1.8V的内核电压供电方式,并具有两级cache缓存结构和高达900MFLOPS的峰值运算能力,可广泛应用于图像处理等系统中。
SST39VF040是SST公司推出的FLASH存储器,该器件十分适合用作外扩存储器,它的存储容量为4MB,采用3.3V单电源供电,无需额外提供高电压即可通过一些特殊的命令字序列实现对各个子模块的读写和擦除,并且可以重复十万次以上,因而可通过DSP软件编程来实现对它的读写操作,十分适合于系统的调试和开发。
2.2 硬件连接
DSP访问片外存储器主要通过外部存储器接口(EMIF),它不仅具有很强的接口能力,可以和各种存储器直接接口,而且还具有很高的数据吞吐能力,最高可达1200MB/s。TMS320C6711的EMIF支持8位、16位和32位宽的所有存储器,当从这些窄位宽的存储空间读写数据时,EMIF会将多个数据打包成一个32位的值,而不必增加额外电路。TMS320C6711与SST39VF040的连接电路如图1所示。
该电路主要通过DSP的相关输出管脚来控制FLASH的擦除和读写。其中,A0~A18为地址线,DQ0~DQ7为数据线,OE和WE分别为输出使能和写使能,CE1为片使能。由于TMS320C6711默认的引导模式是从外部CE1空间的8位FLASH来引导装载,所以,TMS320C6711的CE1和FLASH的片选CE相连。如果是从16位或32位FLASH引导,则只需将HD[4:3]设置成相应的值即可。
2.3 EMIF寄存器的配置
由于TMS320C6000在异步接口上更加方便,因此,用户可以灵活地设置读写周期以实现与不同速度、不同类型的异步器件的直接接口。EMIF接口由一组存储器映射的寄存器进行 控制与维护,包括配置各个空间存储器类型和设置读写时序等。和异步器件接口时需配置CE空间控制寄存器,由它来控制存储器的读写周期,本系统用到了CE1空间,故需要设置CE1空间控制寄存器的值。在设置CE1空间控制寄存器时,应满足以下条件:
(1)异步读时:
SETUP+STROBE≥(tacc(m)+tsu+tdmax)/tcyc
SETUP+STROBE+HOLD≥(trc(m))/tcye
HOLD≥(th-tdmin-toh(m)/tcye
HOLD≥(th-tdmin-toh(m)/tcye
(2)异步写时:
STROBE≥(twp(m)/tcye
SETUP+STROBE≥(txw(m))/tcye
HOLD≥(Max(tih(m),twr(m))/tcye
SETUP+STROBE+HOLD≥(twc(m))/tcye
(3)附加参数TA:TA≥(tohz(m))/tcye
以上参数可以从芯片手册里查到,并可据此得以满足上述条件的CE1值:CE1=1161C901h。
3 软件设计
引导装载系统主要由实现自加载功能的定制代码和用户程序两部分构成,最后都存储在外扩SST39VF040的指定地址中。其中如何写定制代码是设计的重点,它负责将中断向量表和用户代码段从片外FLASH移植到其它高速存储器中,并且将程序指针指向用户 代码段的起始地址。
3.1 FLASH引导过程
对于许多DSP应用 系统,常常需要从FLASH装载程序到DSP以便使它能够脱机运行。设置完芯片装载方式后,FLASH引导装载的具体过程如下:
首先将位于外部CE1空间的FLASH(即图1中的SST39VF040)中的程序通过EDMA自动搬入内部RAM的地址0处(参见图2),实际上,尽管加载过程RAM的地址0处(参见图2),实际上,尽管加载过程是在芯片复位信号被释放后才开始的,但是当芯片开始复位时,就开始准备上述传输了。用EDMA进行 的加载过程是一个单帧数据块的传输过程,数据块的大小为1kB,当然这1kB的数据必须包括用于实现自加载功能的定制代码,1kB的数据传输完成后,CPU退出复位状态,开始执行地址0处的自加载功能的定制代码,同时把其它的初始化段从FLASH拷贝到相应的高速存储器处,之后初始化C变量以换行用户程序。
3.2 链接
在链接自加载功能的定制代码和其它代码时,需要特别注意该程序COFF(公共目标文件格式)段的放置。因为有时候需要对某些段制定两个不同的地址:一个导入地址,一个运行地址。导入地址用来决定装载器把段的原始数据放在何处,而运行地址就是该段代码运行的地方。任何对段的引用都是指它的运行地址。因此,如果给某个段指定不同的导入地址和运行地址,在程序访问该段之前,都需要把它从导入地址拷贝到运行地址处,当然这个拷贝过程有时是自动进行的,有时需要人工介入,即由自加载功能的定制代码来完成。如前面提到的1kB数据拷贝就是EDMA自动完成的。显然,制定两个不同地址的目的是为了加快代码的执行速度。链接可由*.cmd文件来实现。代码在链接在应遵循以下原则:
(1)所有代码和初始化数据都必须有一个FLASH的导入地址;
(2)所有非常数数据据都有一个RAM运行 地址;
(3)未初始化的数据无需独立的导入地址;
(4)从FLASH拷贝到RAM的代码要有一个FLASH导入地址和RAM运行 地址。
3.3 写自加载功能的定制代码
通常1kB的定制代码需要包括以下三个部分:
(1)配置EMIF寄存器。只有正确配置了EMIF的值,它才有可能访问外部存储器FLASH和SDRAM;
(2)拷贝初始化段。对于既有导入地址,又有运行地址的初始化段,需要把它从导入地址拷贝到它的运行地址处,处时还必须参考.map文件来确定要搬移的数据块的大小,这些段代码的搬移可以用汇编指令MOV来实现,也可以用TMS320C6711的EDMA来实现。由于用EDMA搬移数据要对EDMA参数进行设置,所以通常采用MOV指令来实现;
(3)转向C程序的入口_c_int00,即跳转到main()函数的入口处。
该自加载功能的代码如下:
BOOT_SIZE .equ 0x9800 ;待装载代码的大小
FLASH_START .equ 0x90000000 ;FLASH起始地址
BOOT_START .equ 0x0000000 ;L2 sram起始地址
EMIF_GCR .equ 0x01800000 ;EMIF全局控制寄存器的地址
EMIF_CE1 .equ 0x01800004 ;CE1空间控制寄存器的地址
EMIF_CE1-8 .equ 0x1161C901 ;CE1空间控制寄存器的值
.sect ".boot_load"
.global_boot
.ref_c_int00
_boot:
mvkl EMIF_GCR,A4
mvkl 0x3300,B4
mvkh EMIF_GCR,A4
mvkh 0x3300,B4
stw B4,*A4 ;配置EMF全局控制寄存器
mvk1 EMIF_CE1,A4
mvk1 EMIF_CE1-8,B4
mvkh EMIF_CE1,A4
mvkh EMIF_CE1-8,B4
stw B4,*A4 ;配置CE1空间控制寄存器
mvkl BOOT_START+1024,A4 ;待搬移数据的目标地址
mvkl FLASH_START+1024,B4 ;待搬移数据的源地址
mvkh BOOT_START+1024,A4
mvkh FLASH_START+1024,B4
zer0 A1
_boot_loop1: 数据搬移
ldb *B4++,B5
mvkl BOOT_SIZE,B6
add 1,A1,A1
mvkh BOOT_SIZE,B6 ;B6为待搬移数据块大小,可根据实际情况来修改
cmplt A1,B6,B0
nop
stb B5,*A4++
[B0]b_boot_loop1
nop 5
mvk1 .S2_c_init00,B0
mvkh .S2_c_int00,B0
B .S2 B0 ;转向C程序的入口
nop 5
3.4 FLASH编程
建立好了上述定制代码段、用户程序段、中断向量表和链接命令文件后,便可利用TI公司的DSP集成开发环境CCS进行编译、调试及链接,之后生成的目标文件*.out就是DSP能够识别的COFF格式。为了使系统能够脱机运行,需要把该目标文件的代码写入FLASH中,往FLASH中写入目标代码可以采用以下两种方法:
(1)用硬件仿真器XDS510/560通过JTAG口对FLASH进行在线编程。此时需要把*.out文件数据放入缓冲存储器,然后按照FLASH芯片手册提供的编程格式把缓冲存储器里的数据写入FLASH。
(3) 利用编程器进行编程。由于编程器不支持*.out文件模式,不能直接写入FLASH中,所以必须将*.out文件转换成编程器可读入的*.hex格式,这可以通过CCS软件中的转换工具hex6x来实现,转换时要注意hex.cmd文件的写法,而且整个文件转换过程是在DOS提示符下完成的。
4 结论
利用上述方法可使系统在脱机状态下实现引导装载,本次实验所用的用户代码段的功能是利用 DSP的多通道缓冲串口发送一个字符串给PC机的RS232口。按照前面的方法写好定制代码段、用户程序段、中断向量表和链路命令文件并进行编译、链接、格式转换以及写入FLASH之后,系统就可以实现脱机运行了。这样,给DSP系统加电后,就可以通过串行口调试软件在PC机上接收到DSP所发送的字符串以证明引导装载成功。由于用户代码段也可以被其它程序代替,因此,本文设计的引导装载系统其有一定的通用性。