TMS320C6000DSP自动引导的方法和编程实现
摘要:TI高速信号处理器TMS320C5X和TMS320C6X需要从外部的存储器(ROM或FLASH)中引导应用程序这是开发中的重点和难点之一,关系到系统的可靠性和处理速度。以TMS320C6000 DSP为例,介绍了应用程序的三种引导方式;以实际工程为背景详细叙述了从ROM中引导程序的实现方法,并钟对其中重要的命令文件和用户引导程序,给出了相应的示例文件和程序。
关键词:TMS320C6000 DSP CMD 引导
1 TMS320C6000 DSP硬件结构概述
TMS320C6000是TI公司生产的TMS320系列产品中新一代高性能的DSP芯片,适用于高速数字信号处理。TMS320C6000主要由三个部分组成:CPU内核、外设和存储器。CPU中8个功能单元可以并行工作,这些功能单元被分成类似的两组,每组由4个基本功能单元组成。CPU有两组寄存器,每组寄存器由16个32位寄存器组成。由于在运行期间不做硬件数据相关性检查,所以程序运行时可以同时执行8条指令,极大地提高了芯片处理速度,这使得该系列的芯片在电子测量、测控、图像、雷达、声纳和软件无线电等领域得到了广泛的应用。
javascript:window.open(this.src);" style="cursor:pointer;"/>
2 加电后DSP的运行过程
系统加电后,RESET信号为低,芯片复位。在RESET信号上升沿处,锁存BOOTMODE[4:0]信号,借以决定芯片的存储器映射方式、地址0处的存储器类型以及复位后芯片的自举模式,复位结束后,芯片从存储器的0地址开始执行指令。
TMS320C6000器件可以设置成三种自举方式,其加载过程分别叙述如下:
(1)不加载。CPU直接从存储器的0地址处开始执行指令。如果系统中使用的是SDRAM,那么CPU会先挂起,直到SDRAM的初始化完成。TMS320C621X/C671X不具有这类方式。
(2)ROM加载。位于外部空间的ROM中的程序首先通过DMA/EDMA搬入地址0处。尽管加载过程是在芯片外部被复位信号释放以后才开始的,但是当芯片仍处于内部复位保持时,就开始了上述的传输过程了。用户可以指定外部ROM的存储宽度,EMIF会自动将相邻的8bit/16bit数据合并成32bit。ROM中的程序必须以little endian的格式存储。用DMA/EDMA进行的这一加载过程是一个单帧的数据块传输。传输过程完成之后,CPU退出复位状态,开始执行地址0处的指令。对于不同的芯片,这一过程略有不同,整个过程如图1所示。
对于TMS320C620X/C670X,DMA使用默认的ROM时序从CE1空间中拷贝64KB数据到地址0处。
对于TMS320C621X/C671X/C64X,EDMA使用默认的ROM时序从CE1空间(C64X从EMIFB CE1空间)拷贝1KB数据到地址0处。
(3)主机(HPI)引导。CPU停留在保持状态,其余硬件部分均保持正常状态。在这期间,外部主机通过主机口初始化CPU的存储空间。主机完成所有的初始化工作后,将主机口控制寄存器中的DSPINT位设置为1,结束引导过程。此时CPU退出复位状态,开始执行地址0处的指令。在主机引导过程中,主机可以对DSP所有的存储空间进行读和写。
此外,用户应选择存储器的映射方式(当有多种映射方式可供选择时)和首地址为0存储空间的类型。TMS320C6201/C6701芯片有专门的BOOTMODE管脚决定芯片的各种设置。TMS320C6202则通过将扩展总线上的XD[4:0]直接映射为BOOTMODE40确定芯片的设置,这些管脚可通过电阻上拉或下拉设置引导方式和存储器映射方式。TMS320C6211/C6711仅有一种存储器映射方式,引导方式只需要两位进行设置,主机口的HD[4:3}映射为BOOTMODE[4:0]同样是利用电阻上拉或下拉设置引导方式实现的。
图2 代码生成流程图
3 ROM引导模式实现
在许多基于TMS320C6000 DSP的应用程序的开发中,程序代码或数据表总是保存在ROM、 FLASH或其它非易失存储器中,以保证掉电时代码仍在。但这些存储器的速度很慢,对速度性能要求很严格的代码就需要运行到其它快速存储器中,如片内RAM或片外静态RAM。这就需要在运行前将代码从ROM存储器中装载到RAM中,这是开发人员遇到的难点之一。从ROM引导的应用程序的开发过程分以下几个步骤:
·在CCS环境中,调试程序,编写相应的命令文件(.cmd),编译连接以形成.hex(COFF格式)文件,通过编程器转化成.bin文件(二进制文件),烧到ROM中;
·系统加电复位,芯片从ROM中拷贝固定长度的数据块(其中包括用户自身的引导代码)到RAM中,用以初始化部分存储器;
·执行用户的引导代码和其它数据段以及程序段初始化所必需的段复制;
·使用包含.cinit段中的数据初始化.bss段中C语言变量;
·程序从main()处开始执行。
在开发从ROM引导的应用程序时,必须考虑以下几点:用户引导