📄 c6201 c6701 bootload.txt
字号:
1、TMS320C6701的BOOT工作过程概述
C6000 DSPs可以有3种引导方式,引导方式通过管脚BOOTMODE[4:0]设置,具体信息参见TI相关数据手册。本系统可以使用并已调试通过的引导方式有ROM加载和HPI加载,其管脚BOOTMODE[4:0]分别设置为01101、00111。其加载过程如下:
① ROM加载,位于CE1空间的64K的ROM代码首先通过DMA被搬到地址0处。加载过程在复位信号撤销之后开始,此时CPU内部保持复位状态,由DMA执行1个单帧的数据块传输。传输完成后,CPU退出复位状态,开始执行地址0处的指令。用户可以指定外部加载ROM的存储宽度,EMIF会自动将相邻的8bit/16bit数据合成为32bit的指令。对C6701,ROM中的程序必须按little-endian的模式存储。
② 主机加载,核心CPU停留在复位状态,芯片其余部分保持在正常状态。引导过程中,PC通过PCI2040经过HPI初始化CPU的存储空间。主机完成所有的初始化工作后,向HPI控制寄存器的DSPINT位写1,结束引导过程。此时CPU退出复位状态,开始执行0地址的指令。HPI加载模式下,可以对DSP所有的存储空间进行读写。
2、相关背景知识
2.1 C应用程序的基本结构:一个最小的C应用程序项目中至少有main.c、*.cmd、vectors.asm文件。其中*.cmd是连接命令文件。Vectors.asm中的代码将作为中断服务表,必须被连接命令文件定位到0地址。DSP复位后首先从0地址开始执行程序,因此复位向量对应的代码必须跳到C环境的入口地址_c_int00(该入口在rts6701.lib中)。
2.2 COFF文件格式:TI代码产生工具产生的目标文件是一种模块化的文件格式——COFF格式。程序中的代码和数据在COFF文件中是以段的形式组织的。对于C语言文件,编译器生成的代码段名为.text。全局变量和静态变量分配在.bss段中,而局部变量或寄存器变量分配到.stack段或使用寄存器。其它更多信息请参看相关TI技术文档。在连接命令文件中必须将这些代码段正确地分配到C6701的地址空间中去。
2.3 连接器的使用:连接器的输入文件是汇编器和编绎器产生的浮动地址目标文件(.obj),产生的输出文件是可以执行的目标文件(.out)和连接过程结果说明文件(.map)。在连接过程中,连接器把所有目标文件中的同名段合并,并按用户的连接命令文件(.cmd)给各个段分配地址,最后生成可执行的.out文件。对于汇编程序,系统复位和数据初始化等都由用户程序完成;而对于C程序或基于C语言框架的混合语言程序这些工作都由C环境完成。
在连接器的开关选项中,-c/-cr必须要用户设置。在本系统由于要使用BOOT,因此将其设置为-c,即Run-time Autoinitialization。这样C初始化函数会读取.cinit段中的每一个记录信息,分别初始化.bss段中的全局/静态变量,最后再调用main()函数。-c选项通过CCS菜单Project-Options打开编绎器设置对话框,在Linker页中设置。此选项对仿真器调试时关系不大,对于脱机运行的最终系统有很重要的意义。
2.4 连接命令文件(.cmd): 在连接命令文件内说明系统的存储器配置以及程序和数据的具体存放地址,然后连接命令文件作为连接器的一个命令参数输入连接器。具体连接过程由连接器完成。在上述连接命令文件内,连接器伪指令MEMORY首先把用户系统配置的存储器定义成7个区域。然后连接命令伪指令SECTIONS把用户目标文件的各个代码段和数据段分配到上述存储区域。如果用户的存储器配置有变化,只要在连接伪指令MEMORY内说明即可。各个代码段或数据段的具体地址也可以很方便地在连接伪指令SECTIONS内修改。
2.5 Hex6x(TI十六进制转换工具):C6000汇编器和连接器生成的目标文件是COFF格式的文件。但是EEPROM编程器不能接受COFF格式的输入文件。Hex6x十六进制工具可以将COFF格式的目标文件转换为一种标准的EEPROM编程器可以接受的文件格式。
Hex6x在命令行方式下执行,如:Hex6x hello.cmd。其中*.cmd文件是十六进制工具可以接受的各种参数的命令文件。命令文件由选项参数、文件名、ROMS块、SECTIONS块等几个部分组成。一般格式如下:
hello.out
-m
-byte
-memwidth 8
-romwidth 8
-order l
-map h_flashboot.map
ROMS
{
EPROM: org = 0x00000000, length = 0x10000
CE1: org = 0x01400000, length = 0x10000
DATAM: org = 0x80000000, length = 0x10000
}
各标识符的作用如下:
hello.out:指定需转换的目标COFF格式的文件
-m: 指定生成的文件格式,m为Motorola-S格式。其余可选项是-a、-i、
–t、-x。
-byte: 指定在生成的文件中地址增长方式是以Byte增长。
-memwidth:定义系统的Memory的Word宽度,在此指定为8位
-romwidth :定义ROM器件的宽度,在此指定为8位
-order: 指定生成文件中的数据大小端存放模式,l为小端模式,m为大
端模式
-map: 指定生成的Map文件名
ROMS:定义系统的物理存储器的配置列表。
2.6 HPI:
HPI主机口是一个并行端口,主机具有该接口的主控权,通过它可以直接访问DSP的整个存储空间,包括映射的片内外设。HPI通过DMA控制器实现对DSP存储器空间的访问。主机和DSP都可访问HPI控制寄存器(HPIC),主机还可访问HPI的地址寄存器(HPIA)和HPI数据寄存器(HPID)。
HPI通过3个寄存器完成与主机的通讯。HPIC是32位的寄存器,高16位与低16位相同,其中的HWOB位必须有由主机根据DSP系统的大小端模式在访问DSP前进行初始化,写1为小端模式,写0为大端模式。在本系统中可以将HPIC初始化为0x00010001。主机按照以下的次序操作可完成对HPI的访问。
①初始化HPIC寄存器
②初始化HPIA寄存器
③从HPID中读/写数据
2.7 PCI2040:
TI的PCI2040 PCI-DSP桥提供了与C5000/C6000 8/16位HPI的无缝接口,PCI2040提供了多个外部接口:PCI总线接口、HPI接口、串行ROM接口、GPIO接口。PCI2040具有以下重要特性:
● PCI目标设备,支持单字读写
● 与TI C5000/C6000 DSP芯片的无缝HPI接口
● 可以同时支持4个DSP
● 串行 ROM接口可以写入用户自己的SubSystme ID与SubSystem vendor ID
● 支持33MHz PCI总线频率
PCI2040支持4个DSP,每个DSP的类型与HPI数据宽度可以由用户PC通过初始化PCI2040内部的DSP数量寄存器和HPI数据宽度寄存器来完成,这两个寄存器在PCI2040的HPI控制与状态寄存器空间,即BAR0空间。DSP数量寄存器指定有多少个DSP与HPI2040连接,将相应的位写1指定存在。HPI数据宽度寄存器指定每个HPI接口的数据宽度,将相应的位写1指定为16位HPI。
PCI2040有4个DSP /CS管脚来独立选通各个DSP芯片。PCI2040的基地址寄存器指定了32 KB非预取存储器空间来访问各个DSP。PCI的地址线PCI_AD14、PCI_AD13来产生DSP的/CS信号。
HPI的HCNTL1和HCNTL0由PCI地址线PCI_AD12、PCI_AD11驱动。
HCNT1 HCNT0 描述
0 0 PCI2040读写HPI控制寄存器
0 1 PCI2040读写HPI地址寄存器
1 0 PCI2040读写HPI控制寄存器(自增)
1 1 PCI2040读写HPI控制寄存器(非自增)
3、FLASH BOOT
3.1最终应用程序制作Flash boot时的连接命令文件
MEMORY
{
VECS: o = 00000000h l = 00000200h
PMEM: o = 00000200h l = 0000FC00h
DMEM: o = 80000000h l = 00010000h
CE0: o = 00400000h l = 01000000h
CE1: o = 01400000h l = 00010000h
CE2: o = 02000000h l = 01000000h
CE3: o = 03000000h l = 01000000h
}
SECTIONS
{
.vectors : load=CE1, run=VECS
.text : load=CE1, run=PMEM
.cinit > CE1
.cio > DMEM
.far > DMEM
.stack > DMEM
.bss > DMEM
.sysmem > DMEM
}
3.2 CMD文件说明:
一般说明见上2.4节。
特别要注意的是,当在MAP1方式下使用ROM BOOT(本系统即是),C6701不能执行在程序区进行数据访问,这不同于C54系列DSP。初始化数据区(.cinit段)必须被连接在CE1存储器空间。如上SECTIONS中的:.cinit > CE1即遵循了这一点。
3.3 十六进制转换工具的使用
当用户将自己的应用程序编绎连接形成COFF格式的目标文件后,为了写入到FLASH中,必须将其用hex6x十六进制转换工具生成通用的编程器可以接受的文件格式,如Motorola-S格式文件。在转换时要使用相应的命令文件,其列表如下供参照。
hello.out
-m
-byte
-memwidth 8
-romwidth 8
-order l
-map h_flashboot.map
ROMS
{
EPROM: org = 0x00000000, length = 0x10000
CE1: org = 0x01400000, length = 0x10000
DATAM: org = 0x80000000, length = 0x10000
}
以上清单中的各标识符的含义已在2.5节中作了详细介绍,更多信息请参见TI技术方档:TMS320C6000 Assembly Language Tools User's Guide (SPRU186)。
3.4 烧写FLASH
当使用hex6x十六进制转换工具后将生成相应的.m*后缀的Motorola-S格式文件,此文件就是最终写入FLASH的目标文件。以ALL-11烧写器为例介绍一下烧写的过程。
①、选择对应的FLASH类型
②、打开上面生成的*.m*文件,选择Motorola-S格式,并指定文件的起始地
址为0x01400000,终止地址为0x0140FFFF,缓冲区起始地址为0x00000000即可。
③、烧写进FLASH即可
将上述烧写正确的FLASH芯片安装到目标板后,系统即可上电后脱机通过FLASH启动执行用户程序代码。
4 HPI Boot
4.1 最终应用程序制作Flash boot时的连接命令文件
MEMORY
{
VECS: o = 00000000h l = 00000200h
PMEM: o = 00000200h l = 0000FC00h
DMEM: o = 80000000h l = 00010000h
CE0: o = 00400000h l = 01000000h
CE1: o = 01400000h l = 00010000h
CE2: o = 02000000h l = 01000000h
CE3: o = 03000000h l = 01000000h
}
SECTIONS
{
.vectors > VECS
.text > PMEM
.cinit > DMEM
.cio > DMEM
.far > DMEM
.stack > DMEM
.bss > DMEM
.sysmem > DMEM
}
4.2 CMD文件说明:
一般说明见上2.4节。没有很特别的地方,有一点不同的是上面SECTIONS节中的:
.vectors > VECS
.text > PMEM
.cinit > DMEM
与制作FLASH时的:
.vectors : load=CE1, run=VECS
.text : load=CE1, run=PMEM
.cinit > CE1
不同之处。这些不同可以为用户节约更多的BOOT FLASH空间用于存放程序代码。
4.3 十六进制转换工具的使用
当用户将自己的应用程序编绎连接形成COFF格式的目标文件后,为了写入到FLASH中,必须将其用hex6x十六进制转换工具生成通用的编程器可以接受的文件格式,如Motorola-S格式文件。在转换时要使用相应的命令文件,其列表如下供参照。
hello.out
-m
-memwidth 32
-romwidth 32
-order l
ROMS
{
PGM: org = 0x00000000, length = 0x10000
DATA: org = 0x80000000, length = 0x10000
}
在此由于使用PCI-HPI BOOT,因此可以直接指定memwidth与romwidth都为32位。
4.4 通过PC平台下的应用程序PCI2040.EXE的“文件”菜单即可将上述hex6x十六进制转换工具生成的Motorola-S格式文件下载到DSP的存储器空间。然后通过“运行”菜单就可让DSP开始执行用户代码。
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -