时间:2024-09-03
陕西凌云电器集团有限公司设计所 张 亮 刘延海
TMS320C6713 DSP的FLASH自引导及一种另类的烧写方法
陕西凌云电器集团有限公司设计所张亮刘延海
FLASH存储器是在EPROM和EEPROM的基础上发展起来的一种非易失性存储器,在掉电情况下仍能保证数据不丢失,并能够在不离开电路板或数据设备的情况下实施檫除和在编程操作。由于其具备结果简单、维护便利、存取速度快、对环境适应性强、抗震性好等优点十分适用于嵌入式系统的设计和开发,并且以成为目前流行的数字信号处理系统的一个基本配置。
TI高速信号处理器TMS320C6000系列DSP需要从外部的ROM存储器中引导程序,由于外部存储器的种类很多,TI不在提供统一的烧写工具,需要使用者自行解决,如何将写好的程序烧写入ROM中并能让DSP引导运行起来,是TMS320C6000系列DSP开发过程中的重点和难点之一。本文主要介绍基于TMS320C6713 DSP的FLASH自引导及一种另类的FLASH烧写方法。
DSP加电后,RESET信号为低,芯片复位。在RESET信号上升沿,读取BOOTMODE[4:0]状态,以此来决定DSP的存储器映射方式、地址0处得存储器类型及复位后芯片的自引导方式。
TMS320C6713 DSP有三种引导方式,其操作过程分别如下:
1)不加载。CPU直接开始执行地址0处得存储器中的指令。如果该处存储器是SDRAM,那么DSP会先挂起,等待SDRAM的初始化完成。
2)主机加载。核心CPU停留在复位状态,芯片其余部分保持正常状态,在这期间,外部主机通过主机接口初始化CPU的存储空间,包括片内配置寄存器。主机完成所有的初始化工作后,结束引导过程,CPU退出复位状态,开始执行地址0处得指令。
3)ROM加载。位于外部CE1空间的ROM中的程序首先通过DMA/EDMA被搬入地址0处。尽管加载过程是在芯片从复位信号被释放后才开始的,但是当芯片仍处于复位时,就开始了上述传输过程。传输完成之后,CPU退出复位状况,开始执行地址0处得指令。
本文介绍的DSP的Flash自引导属于上述 3种引导模式中的ROM加载模式,TMS320C6713 DSP每次只能搬移1Kb大小的数据到地址0处,而实际使用中程序肯定会大于1K,因此必须进行二次引导搬运(secondary bootloader)。二次引导搬运是指,DSP启动后,CPU被锁住,DMA/EDMA自动从外部Flash首地址搬移1Kb的程序到DSP内部cache的首地址,搬移完成,激活CPU,运行该1Kb的程序,而该1Kb程序是二次引导搬运程序,即将真正需要运行的程序从外部Flash搬运至DSP内部cache中,完成后,进入中断c_int00(),进行DSP系统的初始化,开始运行main()主程序,完成自启动。下面介绍二次引导搬运程序也就是Bootloader()程序的编写。
首先Bootloader()程序一般编写都是采用汇编语言来实现,可以在互联网上找到很多现成的例子,这里就不多做介绍。其实用C语言也一样可以实现,并且简单易懂。将Bootloader()程序写入***.c的文件中然后加入到目标工程中即可,具体程序如下:
//Flash使用的是AMD公司的AM29LV033C(4M*8-Bit)
#define MEM_ADDR0x00000400
#define FLASH_ ADDR0x90000400
#define EMIF_GCR0x01800000
#pragma CODE_SECTION(bootload,".boot_load");
extern far void c_int00(void);
void bootload(void)
{register int code_i , code_Num;
*(unsigned char *)EMIF_GCR = 0x3300;
code_Num = 0x10000; // 这个地址存放的是要搬移的字节数,可根据实际情况修改
for((code_i) = 0;(code_i)<(code_Num);(code_i)++)
{
*(unsigned char *)(MEM_ADDR+(code_i)) = *(unsigned char *)(FLASH_ADDR + (code_i));
}
c_int00();
}
修改目标工程的.cmd文件,将Bootloader程序指向DSP内部RAM中的前1Kb地址中(粗体为需加入的代码),目标工程的其他代码放在其后,必须避开这1Kb(0x400)的空间。
MEMORY
{
BOOT_RAM: org =0x0000000len = 0x0000400
IRAM: org = 0x0000400len = 0x0002FC00
}
SECTIONS
{
.boot_load > BOOT_RAM
………..//省略若干
.cio > IRAM
}
配置好引导方式和引导文件,还需将目标程序的生成的目标代码写入Flash中。一般的方法是用TI的编译工具CCS编译连接生成目标文件(.out文件),但该.out文件不是COFF文件格式,FLASH不支持这种文件,所以不能直接写入FLASH中,必须使用TI公司提供的工具hex6x.exe将.out转换.hex文件,再通过工具hex2bin.exe转换为.bin文件,根据具体使用的Flash型号编写相应的烧写程序将.bin文件写入Flash中。
本文介绍Flash烧写方法是将DSP片内RAM中运行的程序直接烧写入Flash中,首先通过JTAG将目标文件的.out文件下载到片内RAM,这时再通过JTAG下载一个Flash烧写程序,将片内RAM中的程序写入Flash中即可,省去了前面转换文件格式的过程。创建一个FlashBurn工程,将她所占用的数据空间避开前面要烧写目标程序所使用的数据空间。因为前面加载的工程文件已经占用了片内RAM前面的地址,如果地址重叠的话,后面加载的Flash烧写程序会改变前面工程文件占用的片内RAM地址中的内容,导致烧写内容错误。可以通过前面工程文件生成的.map文件查看工程文件所占用的片内RAM地址。如下:
MEMORY CONFIGURATION
nameoriginlengthusedattrfill
-----------------------------------------------------------
BOOT_RAM0000000000000400000000a0RWIX
IRAM000004000002fc00000197acRWIX
工程文件分配长度为0x2fc00字节,实际使用0x197ac字节。Flash烧写程序避开0x19bac(0x400+0x197ac)之前的地址即可,推荐这个地址尽可能的大于分配的地址0x30000(0x400+0x2fc00)。
Flashburn工程文件的.cmd文件如下
MEMORY
{
IRAM: org = 0x00030000len = 0x00000C00
}
这样Flashburn.out文件就会下载到0x00030000~0x00030C00地址之间,不会把之前下载的.out文件冲掉。
下载Flashburn.out文件并点击运行,首先檫除整片FLASH,由于FLASH型号不同所以檫除指令有所差异,具体檫除指令可以查询所使用芯片的数据手册,这里不作具体描述。其次将片内RAM中0x00000000的数据(也就是Bootloader的代码)写进0x90000000,具体写多少可以根据Map文件决定,也可以直接写1K数据。最后把从0x00000400的开始代码写进0x90000400之后.写进去的字节数就是上述.map文件中的0x197ac。
到此,片内RAM中从0x00000000开始存放的目标文件的代码就全部写进flash中去了,可以通过CCS窗口去查看是不是一样。
断开电源,再开电,DSP首先把0x900000000开始的1K字节搬移进片内,也就是Bootloader,然后Bootloader把代码从0x90000400搬移到片内的0x00000400,搬移完成之后,就跳到C_int00去执行程序,完成了自启动。
本文实现了TMS320C6713 DSP的FLASH自引导及FLASH的烧写,工程实现简单可靠,并提出一种另类的FLASH烧写方法,有助于大家对DSP引导系统的理解。
参考文献
[1]Texas Instruments:TMS320C6713B FLOATING-POINT DIGITAL SIGNAL PROCESSOR data sheet(SPRS294BOCTOBER 2005-REVISED JUNE 2006).
张亮(1982—),男,工程师,现供职于陕西凌云电器集团有限公司设计所,主要从事数字电路设计、图像处理、嵌入式方面的应用与开发。
刘延海(1983—),男,工程师,现供职于陕西凌云电器集团有限公司设计所,主要从事数字电路设计、图像处理、嵌入式方面的应用与开发。
作者简介:
我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自各大过期杂志,内容仅供学习参考,不准确地方联系删除处理!