原创 基于FLASH的TMS320C6416 DSP ROM加载方法

2009-2-18 15:32 5396 18 18 分类: 处理器与DSP

多年前发表一篇文章,转来凑凑人气


 


 


摘要:简单介绍TMS320C6416的引导方法。通过CCS把用户的应用程序烧到FLASH中。当DSP复位时引导装载程序装载位于FLASH的前1KB中的二次引导程序放在DSP的存储器0处。传输完成后DSP0地址开始执行程序,二次引导程序加载用户应用程序。


<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 


关键词:DSP 闪烁存储器 二次引导装载


  Rom  Boot  Method  of  TMS320C6416 Dsp  Based  on  Flash


               WANG Min-zhiCAO yuan-jiangCHEN Xing-hu


Nanjing Marine Radar Institute, Nanjing 210003, China


Abstract: This paper introduces the characteristics and the program method of the dspTMS320C6416.The program is written to the flash by the CCS.The second bootloador program which is in the first 1KB of the flash is transferred to memory located at the address 0.At the end of the transfer,the CPU remove from the reset and start from memory location 0,then,the second bootloador program boots the user’s program.


 


Keyword: DSP; flash; second bootloador


1、 引言


对于TI公司C6000系列DSPROM加载过程是:位于CE1空间的ROM中的代码首先通过DMA/EDMA被搬入地址0开始的内部存储器。加载过程在复位信号撤消之后开始,此时CPU内部保持复位状态,由DMA/EDMA执行1个单帧的数据块传输。传输完成后,CPU退出复位状态,开始执行地址0处的指令。对于C62x/C67x,用户可以指定外部加载ROM的存储宽度,EMIF会自动将相邻的8bit/16bit数据合成为32bit的指令。对C620x/C670x,ROM中的程序必须按little-endian的存储模式存储;对C621x/C671x,ROM中的程序存储格式应当与芯片的endian模式设置一致。C64x只支持8bitROM加在,ROM中的程序存储格式需要与芯片的endian模式设置一致。对于不同的芯片,加载过程还略有不同。


    C620x/C670x,DMACE1空间中拷贝64KB数据到地址0


    C621x/C671x/C64x,EDMACE1空间(对C64xEMIFBCE1空间)中拷贝1KB数据到地址0



               1   TMS320C6000 ROM BOOT 过程


 


2 TMS320C6416芯片的性能特点


TMS320C6416TI公司最新推出的高性能定点DSP,其时钟频率可达720MHz,最高处理能力为5760MIPS,软件与C62X完全兼容,采用先进的甚长指令结构(VLIW)DSP内核有6ALU32/40bit),每个时钟周期可以执行8条指令,所有指令都可以条件执行。该DSP具有Viterbi译码协处理器(VCP)和Turbo译码协处理器(TCP);采用两级缓存结构,一级缓存(L1)128Kbit的程序缓存和128Kbit的数据缓存组成,二级缓存(L2)8Mbit;有2个扩展存储器接口(EMIF),一个为64bitEMIFA),一个为16bitEMIFA),可以与异步存储器(SRAMEPROM)或同步存储器(SDRAMSBSRAMZBTSRAMFIFO)实现无缝连接,最大可寻址空间为1280MB;具有扩展的直接存储器访问控制器(EDMA),可以提供64条独立的DMA通道;主机接口(HPI)总线宽度可由用户配置(32/16bit),具有32bit/33MHz3.3VPCI/从接口,该接口符合PCI标准2.2版,有3个多通道串口(McBSPs),每个McBSPs最多可支持256个通道,能直接与T1/E1MVIPSCSA接口,并且与MotorolaSPI接口兼容,片内还有一个16位的通用输入输出接口(GPIO)。


3SST39VF160的主要特点及编程方法


SST39VF160SST公司新推出的1M×16位产品,具有以下主要特点:


1)支持单电源操作,可分为满负荷电压供电(2.7V3.6V)和电压范围可调节(3.0V3.6V)供电两种方式。满负荷电压供电压供电方式主要用于电池供电的应用中,而电压范围可调节供电方式直接与3.3V的高性能DSP接口,简化了系统的电源要求。


2)最快的存取速度高达70nsCMOS工艺,具有100000次写入/擦写寿命,数据可保持100年不丢失。


3)低功耗(4uA的自动休眠电流,4uA的待命电流,15mA的编程/擦除电流)。


4)灵活的块结构支持整片擦除、块擦除。段擦除18ms,块擦除18ms,整片擦除70ms,字编程14us


5)数据查询位和数据切换位,可以通过软件方法检测编程/擦除操作的状态。


6Ready/Busy#管脚,可以通过硬件方法检测编程/擦除操作的状态。


7)内嵌的擦除/编程算法能自动对整个芯片或某几个块进行擦除编程操作。


    


 


4、通过CCS烧写FLASH的方法


TI公司提供了一个烧写FLASH的软件,但是那需要将程序编译后生成的OUT文件再转换成ROM格式;或者是先将应用程序编译后导出到一个二进制文件中,再通过CCS编程序从这个二进制文件中一个一个的读入并写进FLASH


笔者要介绍的方法与上述两个方法不同。根据SST39VF160的时序,编写一个搬运程序,注意与DSPBOOT程序的区别,这里的搬运程序是将在CCS中打开的工程的内容原封不动的搬到FLASH中,如此完成FLASH的烧写。根据这个思想,需要编写两个工程:一个主程序工程(即用户应用程序,其中包括二次引导程序),一个搬运程序工程。搬移程序不能使用与主程序的程序空间和中断向量表重合的物理空间,以免覆盖。烧写时,同时打开主程序和搬移程序的PROJECT,先LOAD主程序,再LOAD搬移程序,然后执行搬移程序,烧写OK!


该方法应该是最简单的方法,只要在搬运程序中合理的调用下面列出的子程序,即可完成FLASH的擦除与编程。



2 片擦除和编程命令流程图


1)、FLASH擦除子程序 


FLASH编写之前,应对FLASH进行擦除,使其每个数据位恢复1状态,即全FF状态。


 


void erase_flash()


 


{


 


              *(unsigned volatile char*)FLASH_ADR1=0x00aa;


 


              *(unsigned volatile char*)FLASH_ADR2=0x0055;


 


              *(unsigned volatile char*)FLASH_ADR1=0x0080;


 


              *(unsigned volatile char*)FLASH_ADR1=0x00aa;


 


              *(unsigned volatile char*)FLASH_ADR2=0x0055;


 


              *(unsigned volatile char*)FLASH_ADR1=0x0010;


      


              delay();


}


   这里FLASH_ADR1代表0x64005555FLASH_ADR2代表0x64002AAA


 


2)、FLASH单字编程子程序


void Program_One_Word (BYTE SrcWord,    BYTE *Dst)


{


               BYTE *DestBuf;


               BYTE *Temp;


               DestBuf = Dst;


 


Temp =  (BYTE *)((WORD)FLASH_START+(0x5555)); /* set up address to be 6400:5555h   */


               *Temp = 0xAA;                 /* write data 0xAAAA to the address */


        Temp =  (BYTE *)((WORD)FLASH_START+(0x2AAA)); /* set up address to be 6400:2AAAh  */


               *Temp = 0x55;                 /* write data 0x5555 to the address */


        Temp =  (BYTE *)((WORD)FLASH_START+(0x5555)); /* set up address to be 6400:5555h  */


               *Temp = 0xA0;                 /* write data 0xA0A0 to the address */


               *DestBuf = SrcWord;             /* transfer the byte to destination */


               Check_Toggle_Ready(DestBuf);    /* wait for TOGGLE bit to get ready */


}


 


 


void Check_Toggle_Ready (BYTE *Dst)


{


               BYTE <?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />Loop = TRUE;


               BYTE PreData;


               BYTE CurrData;


               unsigned long TimeOut = 0;


 


               PreData = *Dst;


               PreData = PreData & 0x4040;


               while ((TimeOut< 0x07FFFFFF) && (Loop))


               {


                   CurrData = *Dst;


                   CurrData = CurrData & 0x4040;


                   if (PreData == CurrData)


                    Loop = FALSE;   /* ready to exit the while loop */


                   PreData = CurrData;


                   TimeOut++;


               }


}


 


 


 


5C6416 ROM加载方法研究


做过TI DSP设计的都知道DSP内部有一个BOOT程序,它用于上电后将存于外部ROM中的程序自动地搬到DSP内部执行。早期TI公司的DSP产品,如果采用ROM加载而且用户程序不太大时,只用DSP内部的BOOT程序就足够了,因为DSP内部BOOT程序会自动加载64K的内容到DSP内部RAM。但是当用户程序大于64K怎么办呢,这时就需要用户自己编写BOOTLOADOR程序,也即二次引导程序。


TI公司的C6x1x产品的内部BOOT只能加载1K的程序,而C64x产品是C6x1x系列产品的超集,所以它们的ROM加载方法类似,也就是说用户必然要自己编写一个二次引导程序,除非你的应用程序小于1K


曾经在TI的文档上看到过介绍C6211ROM加载方法,是通过QDMAROM中拷贝数据到RAM中然后执行程序;运用这种方法,就要非常熟悉QDMA而且要自己设置好QDMA的各个寄存器。笔者要介绍的方法,就是普通的搬运方法,用户可以不管DSP内部DMA各种寄存器的配置。


C64xROM BOOT前面说过只支持8位操作,其过程是上电开始,DSP内部BOOTLOADOR程序将保存于外部ROM(这里当然是FLASH)中的前1K字节的程序自动搬到DSP内部RAM 0地址处,然后DSP0地址开始执行程序。由于应用程序大于1K字节,所以必须用二次引导的方法。二次引导程序就放在FLASH的前1K字节中,这样DSP自动BOOT完成后就从0地址开始执行二次引导程序。


二次引导程序笔者是用汇编语言写成,也就是几句循环语句,不会占用太多的空间,也即其大小根本不会大于1K字节。以前做C54x系列时,应用工程中都有一个.ASM文件,一般这个文件的名称是VECTOR.ASM,里面放的都是些跳转指令,以前我们都管这个文件叫中断向量表文件。二次引导程序就放在这个文件中,笔者将这个文件改名成BOOT.ASM,这样看上去更显得一目了然。CMD文件中要将MYBOOT块大小指定为1K,且位置被指定在DSP内部RAM的前1K处。


所以整个DSP BOOT过程是:上电后DSP自加载1K的二次BOOTLOADOR程序到DSP的内部,放在从0地址起始的位置,接着DSP0地址开始执行程序,也即执行二次BOOTLOADOR程序,将从FLASH的前1K字节以后的一定长度的应用程序搬运到应用程序工程中的CMD文件指定的位置,当所有的数据都搬运完毕后,DSP跳转到主程序的入口处,并开始执行主程序。


 



3 EMIF FLASH接口


 


二次引导程序部分代码


        mvkl  CODE_START,A4 ;ram start address ->A4


      ||    mvkl  SOURCE_START,B4 ;flash start address ->B4


 


            mvkh  CODE_START,A4


      ||    mvkh  SOURCE_START,B4


            zero  A1


 


_boot_loop2:


            ldb   *B4++,B5


            mvkl  CODE_SIZE,B6 ;B6 = BOOT_SIZE -1024


 


            add   1,A1,A1          ;A1+=1,inc outer counter


      ||    mvkh  CODE_SIZE,B6


      


            cmplt  A1,B6,B0


            nop   


            stb   B5,*A4++


      [B0]  b     _boot_loop2


            nop   5


       


RESET_RST:


            mvkl .S2 _c_int00, B0


            mvkh .S2 _c_int00, B0


            B    .S2 B0


            nop   5


 


结束语


 


  把程序烧写入Flash后,复位C6416,使用示波器测试定时器输出引脚,观察程序运行正确与否。通过上述方法可完成C6416SST39VF160 Flash 的烧写,很好地实现了C6416上电后的用户程序自举引导功能。


 


参考文献:


 1TMS320C6000系列DSPs的原理与应用.


    任丽香 马淑芬 李方慧编著  电子工业出版社


 2TMS320C6x Optimizing C Compiler User’s Guide .


Texas Instruments Incorporated,1999


 3. TMS320C6x Assembly Language Tools User’s Guide.


    Texas Instruments Incorporated,1999


 4. TMS320C62xx Peripherals Reference Guide.


    Texas Instruments Incorporated,2003


 5. TMS320C6000 Code Composer Studio Tutorial.


    Texas Instruments Incorporated,1999


 6. TMS320C6416 Fixed_Point_Digital Signal Processors


Texas Instruments Incorporated,2003

文章评论0条评论)

登录后参与讨论
我要评论
0
18
关闭 站长推荐上一条 /2 下一条