牛亚莉(陕西交通职业技术学院,陕西西安 710018)
TMS320C6000 DSPs的ROM自动引导实现
牛亚莉
(陕西交通职业技术学院,陕西西安710018)
【摘 要】本文通过对TMS320C6000系列DSP引导方式及初始化过程的分析,根据实际工程开发经验,完整详细的阐述了6000系列DSP的ROM引导方式上电引导过程,以及所需用户引导文件的编写,常用系数表的处理方法,落焊文件的生成等过程,并给出了设计代码,有效解决了TI DSP 6000系列的上电引导及初始化问题。
【关键词】DSP自动引导初始化ROM方式
随着数字信号处理技术的不断发展,大规模集成芯片及电路的出现,DSP技术被广泛应用于铁路信号传输[1]、检测[2]、识别系统[3]中,实现产品的小型化、模块化,大大提高信号处理的灵活度及处理速度,在铁路提速、高铁建设、城市轨道交通发展中随处可见。
TMS320C6000系列DSP是TI公司推出的新一代高性能DSP,包括定点系列C62xx、C64xx和浮点系列C67xx,其CPU主频范围分布在100MHz到600MHz。在DSP的应用过程中,为了保证系统在脱机状况下能够实现独立运行,需要将用户代码及一些系数等文件保存在ROM/FLASH等非易失性存储器当中,在系统加电后,通过DSP自身提供的引导方式将应用程序从外部存储区搬移到内部RAM以便运行。这样一方面扩展了DSP有限的ROM资源,另一方面又能充分发挥DSP内部资源的性能优势。
尽管TI 公司的使用指南上提供了不同引导方式的操作方法,但在实际应用中,往往由于文件描述不够细致全面加上部分开发者经验不足,使得链接命令文件、初始化系数表及格式化文件等设计不当,导致在DSP上电时不能正常自举,往往会为工程进度带来较大的麻烦,甚至影响产品的可靠性。
C6000系列DSP提供了三种引导方式,不加载、ROM方式加载和HPI方式加载,其中最常用的就是ROM加载方式。DSP芯片上有专门的管脚用来选择其引导方式和存储器映射方式,C620x/C670x DSP芯片由BOOTMODE[4:0]管脚决定,C6211/C6711通过HD[1:0]、C6712/C64x通过BOOTMODE[1:0]来设置。
在ROM引导方式下,DSP加电后首先通过DMA/EDMA将位于外部ROM/FLASH存储区0地址开始的内容当作一帧数据搬移到内部地址0处。
(1)对于C620x/C670x,DMA从CE1空间自动搬移64KB的数据到内部地址0处;
(2)对于C621x/C671x/C64x,EDMA从CE1空间(对C64x是EMIFB的CE1空间)自动搬移1KB的数据到地址0处。此时一般来说需要编写用户引导代码来完成其余数据的搬移,因为用户开发的程序一般都会大于1KB。
传输完成后,CPU退出复位状态,开始执行零地址处的指令,即从中断向量表进入,跳转到DSP库函数c_int00或者用户引导程序,用户引导程序运行结束后仍然应该跳转到c_int00,然后开始DSP的初始化过程。
c_int00完成C开发环境的初始化以及.bss段全局变量的初始化,由auto_init库函数控制,调用memcpy库函数从.cinit数据段中搬移相应的数据到.bss段中对应的全局变量中,这些过程全都是由DSP自动完成的。初始化完成后,即开始执行应用程序,进入main函数。
表1 CMD文件各段含义
一般我们都采用c语言与汇编语言混合使用来进行DSP软件设计,一个基本的DSP工程至少应该包含一个主程序main()函数、一个中断向量表.vextors段和一个链接命令文件*.cmd。
DSP的命令文件用于将程序中的各段正确的分配到C6000的地址空间中去,通过连接器生成可执行的.out文件。如第二节所介绍的,DSP加载后首先从0地址处开始执行,中断向量表应该安排在地址零处,我们可以根据实际需要安排程序在0地址处直接转向c_int00或者转向用户引导程序。
常见的DSP应用当中还有对系数表的应用,在编程中可以将系数表作为一个汇编文件添加到DSP工程中,这样在编译连接后该文件就会作为一个数据段出现在最后的.out文件(COEF格式)中,可以在加载之后由DMA搬移到内部数据区待用。
3.1命令文件
命令文件的编写关系到整个工程是否能够正常工作[4],因此是DSP程序设计非常关键的一个环节。
以下以6701为例来说明CMD文件的编写:
-c
-l rts6701.lib
-stack 0x0400
MEMORY
{
PRAM : origin = 0x00000000,len = 0x0FFFF
DRAM_init : origin = 0x80000000,len = 0x04800
DRAM: origin = 0x80004800,len = 0x0b000
}
SECTIONS
{
.vectors> PRAM
.my_boot> PRAM
.text> PRAM
.cinit: load=PRAM, run=DRAM_init
.bss> DRAM_init
.far> DRAM_init
.stack> DRAM_init
.data_buf1
{
coef.obj
} load=PRAM, run=DRAM_init
.data_buf2> DRAM
}
其中,-c代表运行时自动初始化全局变量,ROM加载模式应该使用该选项;各段含义如表1:
DSP最终形成的.out文件分为三种类型的数据段,如表中括号注明的代码段、初始化段和非初始化段,每一种类型的段都有一个加载地址和一个运行地址。由于我们选择ROM自动引导方式,上电后位于外部ROM中的程序会自动搬移到内部0地址处的RAM,即DSP通常所指的程序RAM(PRAM)当中,所以这里的加载地址可以直接写成内部PRAM。代码段的加载地址和运行地址都在PRAM;非初始化段的加载地址和运行地址都在DRAM_init;而初始化段则应该分配两个地址,加载地址在PRAM,运行地址在DRAM_init。因此,对于分配了两个地址的数据段就需要编写用户引导代码,将其从加载地址搬移到运行地址。
3.2用户引导代码
由于在DSP的引导过程中C编译环境还没有得到初始化,所以用户引导代码一般采用汇编语言进行设计,主要用于初始化段的搬移或者1KB以外的代码数据搬移,以下为具体设计实例:
.sect “.my_boot”
.include boot_c671x.h62
.global _boot
_boot:
;配置EMIF控制寄存器(C621x/C671x/C64x需要,若只是实现初始化段搬移则不需要此配置)
MVKL EMIF_GCTL,A4
|| MVKL 0x3090,B4 ;具体值参考手册设置
MVKH EMIF_GCTL,A4
|| MVKH 0x3090,B4
stw B4,*A4
;根据需要配置EMIF CE空间控制寄存器、SDRAM 控制寄存器
…………
;设置CSR、ICR、IER寄存器
………….
;设置DMA控制寄存器
MVKL 0x01840044, A1;DMA3_PRIMARY_CTRL
|| MVKL 0xfffffffc,B2
MVKH 0x01840044, A1
|| MVKH 0xfffffffc,B2
LDW *A1, A10
AND A10, B2, A11
STW A11, *A1
;配置DMA副控寄存器,源/目的寄存器,计数寄存器
此时需参考编译器产生的map文件,确定所需搬移各段地址和长度(注:map文件中长度数据对应于32bit)
…………………
;启动DMA
MVKL 0x0b000051,A2
MVKH 0x0b000051,A2
STW A2, *A1
IDLE ;传输结束后产生中断,在中断向量表中跳转到c_int00,开始初始化过程
用户编写的应用程序经过正确的编译连接以后生成COEF格式的.out文件,由于ROM/FLASH存储器不支持这种格式,所以在烧写之前需要将其转换为十六进制码的格式。TI提供了专用工具h e x 6 x . e x e可以实现该转换过程,该文件位于安装目录下tic6000cgtoolsin文件夹中。
以下是格式转换命令文件实例:
channel_s.out/* 用户应用程序的.out文件,作为hex6x的输入*/
-m/* 输出文件格式,m代表Motorola-S格式 */
-memwidth 8/* 存储宽度 */
-romwidth 8/* ROM数据宽度 */
-o channel_2.hex/* 输出文件名称 */
ROMS
{
FLASH:org = 0x00000000, length = 0xFFFF
}
若采用16bit ROM加载方式,则连接两片8位的ROM,地址线连接方式相同,数据线高低八位分别连接。此时,存储宽度设置为16,将产生两个HEX文件,命令文件中相应内容改写为:
-memwidth 16
ROMS
{
FLASH:org = 0x00000000, length = 0xFFFF
files={ channel_2.b0, channel_2.b1 }
}
其中.b0文件是低八位数据 ,.b1是高八位数据。通过以上步骤转换后即可得到可烧写的目标文件。
本文通过分析TMS320C6000系列DSP的加载及初始化过程,结合实际开发经验,给出了用于ROM自动加载模式下DSP的软件设计和文件格式转换方法。通过具体的代码实例详细说明了设计过程,尤其是对于命令文件和用户引导程序的编写。
参考文献:
[1]张西峰,杜普选.基于TMS3206722的高度铁路轨道信号发送与接收模拟系统[J].2010(10):25-28.
[2]孙国斌.基于DSO+FPGA架构的DC6000V供电铁路客车逆变电源的设计与实现[J].铁道车辆,2013(7):13-15.
[3]黄雪程,王焱,刘春.基于DSP的铁路信号识别技术[J].铁路计算机应用,2009(4):46-48.
[4]李方慧,王飞,何佩琨.TMS320C6000系列DSPs原理与应用[M].北京:电子工业出版社,2003.
作者简介:牛亚莉(1980—),女,陕西,硕士,陕西交通职业技术学院,高级工程师,从事城市轨道交通控制及数字信号处理方面的工作。