- 易迪拓培训,专注于微波、射频、天线设计工程师的培养
在仿真环境下实现TMS320C6000系列DSP的程序自引导
开发DSP系统应用板,最终要脱离仿真器而独立运行,这时就需要一个能在断电后保存程序及初始化数据的存储器。系统上电时,由引导程序将DSP的应用程序从该存储器引导到DSP应用板上的高速存储器(如内部SRAM,SDRAM等)中。由于FLASH具有电信号删除功能熐疑境速度快,集成度高,因而已成为此种存储器的首选。
将用户程序代码写入FLASH的方法有两种:第一种是用专门的FLASH编程器实现,第二种是通过系统微处理器与FLASH的接口来实现。第一种方法的主要优点是使用方便可靠,但要求FLASH只能是双列直插等一些可插拔的封装形式,由于芯片制造工艺的提高,芯片的集成度越来越高,FLASH正向小型化、贴片式发展,从而使表面贴装或PLCC封装的FLASH难以利用编程器编程。第二种方法克服了第一种方法的缺点,且使用灵活,因而在DSP系统中的应用日益广泛。
由于FLASH的存取速度较慢,写入FLASH的程序将在系统上电时被DSP装载到快速的存储器中运行,这个过程称为boot loader。不同的DSP有不同的引导方式,本文将以TMS320C6713为例来介绍TMS320C6000系列的boot loader方式。
1 FLASH的工作方式及在系统编程
目前,市场上的FLASH型号很多,但工作方式大体相同,下面以AM29LV160D为例进行介绍。
1.1 AM29LV160D FLASH存储器简介
AM29LV160D是AMD公司生产的2M×8bit/1M×16bit FLASH存储器,它的数据宽度为8位、16位可选,采用3.3V供电,完全兼容JEDEC标准,并支持在系统编程,用户只需向其内部的命令寄存器写入命令序列即可实现部分擦除、全部擦除、数据写入等功能;同时可提供硬件和软件方法来检查FLASH的操作执行情况。
图1
1.2 编程方法
对FLASH的在系统编程就是通过一定的编程命令序列来控制FLASH的工作方式,这些命令序列是一些特定字符的组合,只要向FLASH中的特定寄存器以特定的顺序输入这些字符即可进入相应的编程模式。AM29LV160D中的主要命令序列和写入地址如图1所示。具体说明如下:
●复位命令序列:对FLASH中任一地址写入“F0”,即可实现复位。
● 自动选择模式:此模式主要用于编程器编程时,由编程器根据从数据线DQ7~DQ0读出的识别码自动配置编程逻辑,当然也可以通过命令序列在在系统情况下将自动选择码读出。
●编程命令序列:程序可以以字节方式或字方式写入,这主要根据FLASH外部引脚BYTE的状态而定。
●芯片擦除命令序列:FLASH编程时应先执行擦除命令,这是因为编程指令只能将数据由1变为0,反之则不行。
● 扇区擦除命令序列:为了编程方便及保护有用数据,数据擦除可以只擦除某些无用的扇区。
● 擦除暂停和恢复命令序列:这个命令序列只在进行扇区擦除时有效,它允许编程者中断一个扇区的擦除操作,接着从没有被擦除的扇区读出或写入数据。
●写入命令:也分为字节模式和字模式,分别对应FLASH的8位和16位工作方式,具体为哪种模式,可由FLASH的BYTE脚的输入来决定,低电平为字节模式,高电平为字模式。
在对FLASH进行编程时,FLASH提供硬件和软件机制来获得FLASH的状态,以确定数据写入或擦除操作是否完成。硬件方法主要是利用FLASH的外部引脚RY/BY的输出信号在命令序列的最后一个写脉冲(WE)的上升沿之后有效。当该输出为低电平时,表示FLASH正在编程或擦除中,而当该输出脚为高电平时,即表示编程或擦除已完成。将此引脚与TMS320C671x系列DSP的ARDY引脚相连,即可实现硬件的自动编程或擦除的完成判断。C6000系列DSP与FLASH的连线图如图2所示。
软件方法是利用从FLASH数据线读取的数据来判断FLASH的状态,读取数据中的主要判断位为DQ2、DQ3、DQ5、DQ6和DQ7,它们之间的相互组合提供了几种软件判断状态的方法,应用较多且较为简便的方法是在命令序列写入后,如果写入的是编程命令,则选择一个地址,并循环读取这个地址的数据。若装置仍处于编程状态之中,DQ7输出为写入数据的补码,而在编程完成后,DQ7输出的是所选地址上的正确数据。如果写入的是擦除命令,那么煹弊爸么τ诓脸状态时,则DQ7输出为0,若擦除完成或擦除被中断煟模眩肥涑鑫1。选择地址时应注意:若地址所在区域属于FLASH中的保护区域,则DQ7输出的FLASH状态信息有效,有效时间只能持续大约1μs,然后输出正确数据。而擦除命令擦除的范围如果包括FLASH中的保护区域,那么命令将被忽略,此时DQ7输出状态信息有效,持续时间大约100μs。对FLASH的操作有时会出错,出错时,FLASH将处于不正常状态,DQ7可能永远也不会输出地址上的正确数据,此时就需读取DQ5的输出信息,若为1则表示操作失败。其软件流程图如图3所示。
对FLASH的编程既可以用汇编语言,也可以用C语言,以下给出部分C代码。该程序代码可采用TI公司专门用于TI公司系列DSP编程的Code Com-poser Studio 编程工具进行编写。
void erase_flash(short * flash_ptr)
{
short * ctrl_addr1=(short *)((int)flash_ptr+(0x555<<2));
/*此处0x555地址左移两位,按16位存储器来看,本来只需左移一位,但在计算式中煹刂罚妫欤幔螅鑏ptr是先转换成int型再计算的,而要写入命令的地址0x555为16位地址,所以需乘2,因此应当再左移一位*/
short * ctrl_addr2=(short *)((int)flash_ptr+(0x2aa<<2));
* ctrl_ addr1=0x00aa;
* ctrl_addr2=0x0055;
* ctrl_addr1=0x0080;
* ctrl_addr1=0x00aa;
* ctrl_addr2=0x0055;
* ctrl_addr1=0x0010;
}
void program_flash(short * source_ptr煟螅瑁铮颍 * flash ptr,short length)
{
short i
short * ctrl_addr1=(short *)((int)flash_ptr+(0x555<<2));牔
short * ctrl_addr2=(short *)((int)flash_ptr+0x2aa<<2));
for(i=0;i<length;i++)
{
* ctrl_addr1=0x00aa;
* ctrl_addr2=0x0055;
* ctrl_addr1=0x00a0;
* flash_ptr++=*source_ptr
}
}
在上面的程序中,对FLASH的命令序列的写入地址有一个左移指令,即若应写入命令的寄存器地址为0x555,实际编程时,应先对0x555左移若干位,然后再对得到的地址写入命令。这是因为,TMS320C6000系列DSP为32位DSP,它的外部地址总线引脚的最低位(LSB)为EA2,即输出地址的最低位为实际地址的第2位,而不会输出第1位和第0位,但实际外接的FLASH可以是8位、16位、32位不等。如果连接非32位存储器,在读数据时煟模樱械耐獠看娲⑵鹘涌冢ǎ牛停桑疲┗嶙远将实际地址左移若干位,以使外部地址总线引脚的最低位EA2根据FLASH位数的不同输出实际地址的第0位或第1位,然后再将几次读入的数据合成一个32位的值(外接FLASH的位数可以在EMIF寄存器中设置),而在写数据时,就需要编程者手动进行移位,具体方法是熗饨樱肝淮娲⑵魇弊笠疲参唬外接16位存储器时左移1位。
2 用FLASH实现DSP的程序自引导
TMS320C6000系列DSP包括多个型号,各个型号的程序自引导方法一致,下面以TMS320C6713为例来介绍程序自引导的实现过程。
2.1 TMS320C6713DSP简介
TMS320C6713是TI公司推出的TMS320C67xx系列浮点DSP中最新的一种芯片。TMS320C6713每周期可以执行8条32位指令;支持32/64位数据;具有最高225MHz、4.4ns指令周期的运行速度和1800MIPS或1350MFLOPS的处理能力;同时是有强大的外设支持能力;外部存储器接口(EMIF)可以很方便地和SDRAM、SBSRAM、FLASH、SRAM等同步和异步存储器相连,16位HPI接口可以和各种处理器熑纾校谩ⅲ校希祝牛遥校玫龋牻涌冢涣硗饣褂杏呕的多通道缓存串口和多通道音频串口(仅TMS320C6713),这些外部接口使设计人员可以很容易实现自己的应用系统。
2.2 TMS320C6713程序自引导功能的实现
断电时用慢速ROM或FLASH存储程序和初始化数据,上电后引导到内部或外部快速RAM中运行是现在普遍采用的一种设计DSP电路板的方法,该方法可靠、方便、灵活且成本较低。但对于不同的DSP有不同的程序自引导方法。本文只讨论TMS320C6000系列DSP的引导方法。
和以往TI公司的DSP(如3x、4x)采用引导表由固化在DSP内部的引导程序实现程序的自引导不同,TMS320C6000系列DSP采用的是一种新的引导方法,对于TMS320C6713,上电后,若选择从EMIF引导程序,则DSP自动将位于地址空间CE1(0x90000000~0x9FFFFFFF)开头的1kB代码传输到地址空间0处。它的数据传输采用默认时序,用户可以选择外部程序存储器的宽度(8位/16位/32位),然后由EMIF自动将几次读入的数据合成32位数据。传输由DSP中的EDMA通道以单帧的形式自动进行,传输完成后,程序从地址0处开始运行。因此,要在TMS320C671x中实现基于FLASH的自引导功能,必须将FLASH配置在DSP的CE1地址空间中。
以上工作均由DSP自动完成。很明显,自动传输的代码并不能满足绝大多数编程者对代码长度的要求,因此可在这段代码中加入数据传输功能,从而将实际工作中远大于1kB的代码由FLASH中读入到用户指定的存储空间,然后再将程序跳到实际有用的代码处运行。对FLASH编程并实现程序自引导的具体过程如下:
(1)对DSP正常运行程序的处理
Code Composer Studio(CCS)是TI公司开发的用于DSP产品的软件开发工具。由CCS得到的代码为目标文件格式(COFF),这种格式文件不能直接写入FLASH,而要先用其它语言(如C)编写文件,然后由转换工具进行转化。
在COFF格式下,程序被分成很多段(包括程序段、初始化数据段、未初始化数据段、自定义段等),每段都占据连续的存储空间,段与段之间相互独立。另外,在COFF文件中,除了段内的用户程序和数据外,还包含一些额外的信息,其中有COFF文件的版本、段的数量、段的长度和起始地址等,分析清楚这些信息,就可以编写自己的文件转换工具了。具体方法是:读入COFF文件,根据格式分析该文件的内容,再把用户程序和数据部分提取出来,仍分成一个个段,并在每个段前加入起始位置和段长度信息,同时在最后一个段的末尾加上结束标志,最后写入一个新的文件。在此过程中,因为COFF文件的字长为32bit,而FLASH宽度可能为8bit或16bit,因而要在两者之间进行手工转化。
(2)编写boot程序
boot程序的大小不能超过1kB,它主要完成以下几个功能:第一是配置DSP的EMIF寄存器,然后从FLASH中把各个段中的程序和数据拷贝到用户指定的存储器物理地址中,同时跳到程序的入口点。在此应当注意:C程序的入口点并非main(),而是c_int00,这是因为在调用main()函数之前,系统必须先建立C语言的运行环境。如为系统堆栈定义.stack段、建立初始化堆栈和祯指针、初始化全局和静态变量等。另外,由于boot程序本身也是COFF文件格式,所以也需格式转换。
(3)编写FLASH烧写程序
FLASH的烧写程序可以根据前面的介绍来编写,但要注意,应将boot程序写入CE1空间开始的1kB中,而将DSP正常工作程序写入1kB以后的地址空间中。
3 结束语
本文介绍了FLASH在系统编程和基于FLASH实现TMS320C6713 DSP程序自引导的过程。实际上,TMS320C6000系列DSP中其它类型(如C6201、C6701等)的boot也与本文所述相同,因此,完全可以相互借鉴。