TMS320C6000 DSPs的ROM自动引导实现

2016-07-13 02:50牛亚莉陕西交通职业技术学院陕西西安710018
中国科技纵横 2016年10期
关键词:寄存器代码自动

牛亚莉(陕西交通职业技术学院,陕西西安 710018)



TMS320C6000 DSPs的ROM自动引导实现

牛亚莉
(陕西交通职业技术学院,陕西西安710018)

【摘 要】本文通过对TMS320C6000系列DSP引导方式及初始化过程的分析,根据实际工程开发经验,完整详细的阐述了6000系列DSP的ROM引导方式上电引导过程,以及所需用户引导文件的编写,常用系数表的处理方法,落焊文件的生成等过程,并给出了设计代码,有效解决了TI DSP 6000系列的上电引导及初始化问题。

【关键词】DSP自动引导初始化ROM方式

1 引言

随着数字信号处理技术的不断发展,大规模集成芯片及电路的出现,DSP技术被广泛应用于铁路信号传输[1]、检测[2]、识别系统[3]中,实现产品的小型化、模块化,大大提高信号处理的灵活度及处理速度,在铁路提速、高铁建设、城市轨道交通发展中随处可见。

TMS320C6000系列DSP是TI公司推出的新一代高性能DSP,包括定点系列C62xx、C64xx和浮点系列C67xx,其CPU主频范围分布在100MHz到600MHz。在DSP的应用过程中,为了保证系统在脱机状况下能够实现独立运行,需要将用户代码及一些系数等文件保存在ROM/FLASH等非易失性存储器当中,在系统加电后,通过DSP自身提供的引导方式将应用程序从外部存储区搬移到内部RAM以便运行。这样一方面扩展了DSP有限的ROM资源,另一方面又能充分发挥DSP内部资源的性能优势。

尽管TI 公司的使用指南上提供了不同引导方式的操作方法,但在实际应用中,往往由于文件描述不够细致全面加上部分开发者经验不足,使得链接命令文件、初始化系数表及格式化文件等设计不当,导致在DSP上电时不能正常自举,往往会为工程进度带来较大的麻烦,甚至影响产品的可靠性。

2 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文件各段含义

3 软件设计

一般我们都采用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,开始初始化过程

4 目标文件产生

用户编写的应用程序经过正确的编译连接以后生成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是高八位数据。通过以上步骤转换后即可得到可烧写的目标文件。

5 结语

本文通过分析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—),女,陕西,硕士,陕西交通职业技术学院,高级工程师,从事城市轨道交通控制及数字信号处理方面的工作。

猜你喜欢
寄存器代码自动
自动捕盗机
Lite寄存器模型的设计与实现
创世代码
创世代码
创世代码
创世代码
基于STM32的自动喂养机控制系统
分簇结构向量寄存器分配策略研究*
Stefan Greiner:我们为什么需要自动驾驶?
高速数模转换器AD9779/AD9788的应用