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所示。
    


    
图1,ROM引导示意图

    
    

    
图2,Flash连接图

    
     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开发提供了新思路。
    
    
(编辑 keil)

    
    
欢迎投稿和提供新闻线索,欢迎您的批评和建议
    电话:0755—83291727
    邮箱:jiaxiang@hqew.com

    
    
    
    
    

相关文章

资讯排行榜

  • 每日排行
  • 每周排行
  • 每月排行

华强资讯微信号

关注方法:
· 使用微信扫一扫二维码
· 搜索微信号:华强微电子