>
摘要:DSP 系统的程序都是保存在非易失性存储器中, 系统启动的时候, 程序加载到系统的RAM 中去执行。本文详细描述了TI TMS
关键字:数字信号处理器;TMS
引言
TMS
本文介绍的TMS
TMS
TMS
(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 程序。
在TMS
基本寄存器构型:
/* EMIF setup */
*(int*)EMIF_GCTL=0x00000068;
*(int*)EMIF_CE0=0x
*(int*)EMIF_CE1=0xffffff23;/* CE1 Flash */
*(int*)EMIF_CE2=0x
*(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=0x
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;
TMS
和以往TI 公司的DSP( 如3x,4x) 采用引导表由固化在DSP 内部的引导程序实现程序的自引导不同,TMS
以上工作均由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。选择参数参考TMS
本文针对TMS
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 的程序代码, 对于TMS
二级Bootloader 代码不能超过ROM加载的长度(64K 或1K), TMS
①配置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 TMS