TMS320C6000 DSPs引导方法的研究
来源:华强电子世界网 作者: 时间:2004-09-21 18:52
(华强电子世界网讯) 本文介绍和比较了TMS320C6000系列DSP的各种引导加载方法,并着重研究了利用DSP对Flash的在线编程方式,提供了一种基于TMS320C6416的Flash引导加载(Bootloader)的实现方法,为C6000系列DSP开发提供了新的思路和方法。
引言
DSP(数字信号处理器)作为数字信号处理的核心技术,其应用已经深入到涉及信号处理的航空、航天、雷达、声纳、通信、家用电器等各个领域,成为电子系统的心脏。DSP系统的开发最终必须脱离仿真环境而独立运作,由于DSP本身在断电后不能保存任何程序和数据,所以在每次启动时必须首先把程序和数据加载给DSP,然后才能执行。这里的加载工作就是本文讲述的Bootloader(引导加载)。
1 Bootloader
C6000系列DSP提供了多种引导方式:不引导、ROM引导、主机引导。在开发调试阶段,一般不作引导而采用仿真器结合开发软件对DSP进行引导加载;主机引导一般用于DSP与上位机协同工作的情况,由上位机完成对DSP的引导工作;而在绝大多数的DSP系统中使用的是ROM引导,即把程序预先烧写进与DSP相连Flash芯片,DSP上电启动时自动由Flash完成引导加载。
当选择了ROM引导,在DSP上电或复位时,内核处于复位状态,紧接着DSP自动以ROM的读写时序把连接于EMIFB(外部存储器接口B)的CE1空间中64K(C620x和C670x系列DSP)或1K(C621x、C671x和C64x系列DSP)长度的程序代码复制到映射为0地址的存储器中。当传输完成后,复位状态结束,接着开始执行0地址处的指令。引导方式如图1所示。
![]() |
![]() |
2 Flash在线烧写
![]() |
Flash的型号多种多样,但工作方式基本相同,本文以AM29F040B为例,图2是该Flash与DSP的连接示意图,上表为Flash的命令集。通过CCS(TI公司的DSP开发软件)在C语言环境下编写Flash的烧写程序片断如下:
Bit C6416_FLASH_write(Uint32 src, Uint32 dst, Uint32 length)
{
Uint8 *psrc, *pdst;
Uint32 i;
Bit rslt;
psrc = (Uint8 *)src;
pdst = (Uint8 *)dst;
for (i = 0; i < length; i++)
{
*((Uint8 *)C6416_FLASH_CTL555) = 0xaa;
*((Uint8 *)C6416_FLASH_CTL2AA) = 0x55;
*((Uint8 *)C6416_FLASH_CTL555) = 0xa0;
*pdst = *psrc;
while( !Finished() ) ;
if (*pdst != *psrc)
{
rslt = 0;
break;
}
pdst++;
psrc++;
rslt = 1;
}
*((Uint16 *)C6416_FLASH_BASE) = 0xf0;
return rslt;
}
利用此方法可实现在仿真环境下对Flash的在线烧写,把应用代码存放与Flash芯片中。
但烧写前必须对代码文件作一定的转换。这是因为CCS得到的代码文件格式是COFF格式,这种格式不能直接烧写进Flash。COFF文件中,程序被划分成多个段(如程序段、初始化数据段、自定义段等)保存,每个段都占用一片连续的存储区域。除此之外,还包含文件版本、段的数量、段的长度和始末地址等。使用TI提供的Hex Conversion Utility可以把COFF格式的文件转换成适当格式的文件以烧写进不同类型的Flash芯片,转换之后的文件仍然划分为多个段,每个段前都加入了始末地址以及长度,末段的最后有结束标志。
3 二级Bootloader
如前所述,ROM引导自动传输了64K或1K的程序代码,很显然这并不能满足绝大多数应用的要求。当应用代码的大小超过了这个长度,则应当引入二级Bootloader来解决。具体的做法是:使ROM引导自动加载的代码实现数据传输功能,把超过长度的代码人工复制到指定的存储区域,完成传输后程序跳转到实际应用的入口处继续运行。
二级Bootloader代码不能超过ROM加载的长度(64k或1k),本文实现的二级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
4 结束语
本文介绍了C6000系列DSP的各种引导加载方法以及Bootloader过程,详细讲述了Flash的在线烧写方法,并提供了一个基于C6416的Bootloader实现方法,为DSP开发提供了新思路。
电话:0755—83291727
邮箱:jiaxiang@hqew.com
上一篇:GSM手机射频系统分析与研究
下一篇:H323会议电视系统原理