| 摘要:DSP 系统的程序都是保存在非易失性存储器中, 系统启动的时候, 程序加载到系统的RAM 中去执行。本文详细描述了TI TMS320C6713 DSP 板以Flash 作为引导存储器, 采用二级装载的办法来实现程序的加载, 并给出了数据传输的代码片断。文章介绍的这种二级装载的方法也可以应用于C6000 系列其他型号的处理器。
关键字:数字信号处理器;TMS320C6713;Flash;引导装载
引言
TMS320C6713 是TI 公司推出的TMS320C67xx 系列浮点DSP 中最新的一款芯片。TMS320C6713 每周期可以执行8 条32 位指令; 支持32/64 位数据; 具有300MHz、3.3ns 指令周期的运行速度和2400MIPS 或1800MFLOPS 的处理能力。它具有强大的外设支持能力, 32 位外部存储器接口(EMIF) 可以很方便地和SRAM, EPROM, FLASH, SBSRAM 和SDRAM 等同步和异步存储器或者512M 字节的外部存储空间连接;Boot 方式有HPI 和8\16\32 位ROM 启动。

本文介绍的TMS320C6713 DSP 板框图如图1 所示。如果想顺利完成DSP 软件的运行, 首先需要把CCS 编译出的out 文件转换为hex 文件, hex 文件可以装载到FLASH 中, 因为一级装载只有1K,因此要编写二级装载程序, 最后根据不同的FLASH 硬件类型编写FLASH 的烧写和擦除程序, 把编写完的程序套用FlashBurn 程序和FBTC 源代码程序完成FLASH 的烧写和擦除。以下就TMS320C6713 DSP 板的Flash 二级装载程序设计做详尽的阐述。
TMS320C6713 DSP 板软件的配置
TMS320C6713 DSP 板的JTAG 配置情况
(1) 安装硬件仿真器SEED- XDSUSB2.0 与目标系统板;
(2)硬件连接完毕后, 安装SEED- XDSUSB2.0 驱动程序;
(3)驱动程序的配置: 在Setup CCS 2(6000)下选中C6x1x XDS510 Emulator 加载, 选择C6000 XDS 驱动的属性, 选择seedusb2.cfg 配置文件, 将I/O Port 改为0x240( 也可以设为340) ;
(4)启动CCS,进行CCS 调试DSP 程序。
在TMS320C6713 板中, 为了使SDRAM, FLASH运行起来, 需要设置寄存器, 同时同步时钟需要进行PLL 的设置。
基本寄存器构型:
/* EMIF setup */
*(int*)EMIF_GCTL=0x00000068;
*(int*)EMIF_CE0=0x20f20333; /* CE0 SDRAM*/
*(int*)EMIF_CE1=0xffffff23;/* CE1 Flash */
*(int*)EMIF_CE2=0x20f20323;/*CE2 I/O32-bit async*/
*(int *)EMIF_CE3=0xffffff23;/*CE3 I /O 32- bitasync */
*(int *)EMIF_SDRAMCTL=0x53116000;/* SDRAM control (32 Mb) */
*(int *)EMIF_SDRAMTIM=0x00000578;/* SDRAMtiming (refresh) */
*(int *)EMIF_SDRAMEXT=0x000a8529;/* SDRAMExtension register */
PLL 寄存器构型:
/* Set the PLL back to power on reset state*/
*(int *)PLL_CSR = 0x00000048;
*(int *)PLL_DIV3 = 0x00008001;
*(int *)PLL_DIV2 = 0x00008001;
*(int *)PLL_DIV1 = 0x00008000;
*(int *)PLL_DIV0 = 0x00008000;
*(int *)PLL_MULT = 0x00000007;
*(int *)PLL_OSCDIV1 = 0x00008007;
TMS320C6713 DSP 板Loader 过程
和以往TI 公司的DSP( 如3x,4x) 采用引导表由固化在DSP 内部的引导程序实现程序的自引导不同,TMS320C6000 系列DSP 采用的是一种新的引导方法,对于TMS320C6713, 上电后, 若选择从EMIF 引导程序, 则DSP 自动将位于地址空间CE1 ( 0x90000000~0x9FFFFFFF) 开头的1KB 代码传输到地址空间0 处。它的数据传输采用默认时序, 用户可以选择外部程序存储器的宽度( 8 位/16 位/32 位) , 然后由EMIF 自动将几次读入的数据合成32 位数据。传输由DSP 中的EDMA 通道以单帧的形式自动进行, 传输完成后, 程序从地址空间0 处开始运行。因此, 要在TMS320C671x中实现基于FLASH 的自引导功能, 必须将FLASH 配置在DSP 的CE1 地址空间中。
以上工作均由DSP 自动完成。很明显, 自动传输的代码并不能满足绝大多数编程者对代码长度的要求, 因此可在这段代码中加入数据传输功能, 从而将实际工作中远大于1KB 的代码由FLASH 中读入到用户指定的存储空间, 然后再将程序跳到实际有用的代码处运行。对FLASH 编程并实现程序自引导的具体过程如下。
DSP 程序的文件格式变换
由CCS 得到的代码为目标文件格式(COFF) 。COFF 是二进制的目标文件形式,该文件提供了灵活的方法管理代码段和目标系统存储器。这种格式文件不能直接写入FLASH, 而要先用其它语言( 如C) 编写文件, 然后由转换工具进行转化。
在COFF 格式下, 程序被分成很多段( 包括程序段、初始化数据段、未初始化数据段、自定义段等) , 每段都占据连续的存储空间, 段与段之间相互独立。另外, 在COFF 文件中, 除了段内的用户程序和数据外,还包含一些额外的信息, 其中有COFF 文件的版本、段的数量、段的长度和起始地址等, 分析清楚这些信息,就可以编写自己的文件转换工具了。
具体方法是: 读入COFF 文件, 根据格式分析该文件的内容, 再把用户程序和数据部分提取出来, 仍分成若干段, 并在每个段前加入起始位置和段长度信息, 同时在最后一个段的末尾加上结束标志, 最后写入一个新的文件。在此过程中, 因为COFF 文件的字长为32bit, 而FLASH 宽度可能为8bit 或16bit, 因而要在两者之间进行手工转化。
Hex 工具自动完成代码转换。该工具是TI 提供的把COFF 目标文件转变成标准可装载文件的工具之一, 适于把可执行指令转换为ASCII 十六进制形式。
Hex 转换工具为产生可执行代码的变换有两种基本的方法:
①在命令行上指定选项和文件名。
如把文件post.out 转变成TI 可执行的二进制指令文件, 生产输出文件, post.hex。
hex6x t post.out post.hex
②在一个命令文件里指定选项和文件名。
编写一个批处理文件, 保存命令行选项和文件名。因为这种方式更方便实用, 一般采用这种命令文件。命令文件里除了命令选项外, 可以变换ROMS 和SECTIONS。选择参数参考TMS320C6000 AssemblyLanguage Tools User Guide 11.2 节Invoking the HexConversion Utility。ROMS 部分表示ROMS 存储器的构造, 确定地址范围参数。SECTIONS 部分确切说明哪个部分COFF 目标文件的内容被选择。整个文件转换过程是在DOS 提示符下完成的。
本文针对TMS320C6713 DSP 板的存储器编写的命令文件为:
post.out
- x
- image
- memwidth 32
ROMS
{ FLASH: org = 0, len = 0x10000,romwidth = 32,files = {post.hex}}
在命令行中调用命令hex6x 格式为: hex6x 文件名
编写boot 程序和二级Bootloader
boot 程序本身是COFF 文件格式, 需要格式转换,利用编程器进行编程。由于编程器不支持*.out 文件模式, 不能直接写入FLASH 中, 所以必须将*.out 文件转换成编程器可读入的*.hex 格式。
在DSP 中ROM引导自动传输了64K 或1K 的程序代码, 对于TMS320C6713 是1KB 程序代码时, 不能满足绝大多数应用的要求, 如果应用代码的大小超过了这个长度, 则应当引入二级Bootloader 来解决。具体的做法是: 使ROM引导自动加载的代码实现数据传输功能, 把超过长度的代码人工复制到指定的存储区域,完成传输后程序跳转到实际应用的入口处继续运行。
二级Bootloader 代码不能超过ROM加载的长度(64K 或1K), TMS320C6000 二级Bootloader 代码大小在1K 以内, 步骤如下:
①配置EMIF 寄存器使能访问到所连接的外部存储器;
②从Flash 中根据各段的地址信息将其复制到相应的物理地址中;
③跳转至实际应用的入口处。这里的入口并非main()函数, 而是c_int00()函数, 因为系统必须在此函数运行后才能建立起C 语言的运行环境, 继而才能进入main()函数。
以下是第二步数据传输的代码片断:
mvkl copyTable, a3 ;读取复制表地址指针
mvkh copyTable, a3
copy_section_top:
ldw *a3++, b0 ;段长度
ldw *a3++, b4 ;段在Flash 中的地址
ldw *a3++, a4 ;段要存放的目标物理地址
nop 2
[! b0] b copy_done ;判断是否复制完毕
nop 5
copy_loop:
ldb *b4++,b5
sub b0,1,b0
[b0] b copy_loop ;判断该段是否复制完毕
[! b0] b copy_section_top
zero a1
[! b0] and 3, a3, a1
stb b5, *a4++
[! b0] and - 4, a3, a5
[a1] add 4, a5, a3
copy_done: ;复制完毕, 跳转至c_int00()函数入口
mvkl .S2 _c_int00,B0
mvkh .S2 _c_int00,B0
b .S2 B0
nop 5
结束语
本文作者创新点: 引导装载是DSP 系统软件运行的前提, 文中设计的TI TMS320C6713 DSP 板的Flash二级装载程序, 解决了程序代码从Flash 向RAM的装载, 同时也适用于其它TI C6000 系列DSP 的程序装载, 其技术设计开发思想和方法对同类系统或类似系统设计开发提供了有益的借鉴, 在实际开发DSP 硬件系统中有广泛的应用。
|