时间:2022-06-30 03:07:12
摘要:本文以实际系统开发基础为背景,阐述了TMS320C55X系列DSP对FLASH在线烧写的方法,给出了系统的硬件连接示意图和完整的烧写程序,并研究了自举引导的实现方法以及大程序的二次引导方法。
关键词:TMS320C55X;FLASH;Bootloader;烧写;二次引导
引 言
随着数字信号处理技术的快速发展,DSP被广泛的应用到各种数字信号处理系统中。最终开发的系统要想脱离仿真器运行,必须将程序代码存储在非易失性存储器中。FLASH存储器以其大容量和可在线编程等特点已成为DSP系统的一个基本配置。如何将程序烧写进FLASH,并在上电时加载进DSP内部的RAM是FLASH在DSP系统中应用的两个基本技术问题。本文以基于TI公司的TMS320VC5509A和ATMEL公司的AT49LVl024 FLASH开发的系统为背景,介绍该系统引导相关的硬件设计,烧写软件设计以及自举引导、二次引导等实现方法。
TMS320VC55D9A的自举引导
TMS320VC5509A每次上电复位后,在执行完一系列初始化(配置堆栈寄存器、关闭中断、程序临时入口、符号扩展、兼容性配置)工作后,根据事先配置的自举模式,通过固化在ROM内的BOOTLOADER程序进行程序引导。VC5509A的引导模式选择是通过四个模式选择引脚BOOTM[0:3]的配置来完成的。在本系统中,采用EMIF(外部存储接口)并行引导模式(16位数据宽度),则需将BOOTM[3:0]设置成1011即可。
通过EMIF接口可以灵活地和各种同步或异步存储器件无缝连接。通过EMIF可以扩展VC5509A的存储空间到128Mbit(SDRAM),存储空间共被分为CE0-CE3。在EMiT的并行引导模式中,ROM中固化的Bootloader程序是以字地址0x200000为首地址开始加载程序。地址0x200000即位CEI空间的首地址,所以FLASH必须接在DSP的CEI空间上。在加载时,EMIF的CEI空间已经默认配置成异步静态随机存储器(SRAM)接口,并且在时序上采用了最差情况设置(即最慢访问速度),充分保证了时间裕量,使得程序代码被顺利的加载到DSP的内存中。
Bootloader在引导程序时,程序代码是以引导表格式加载的。tms320vc55x的引导表结构中包括了用户程序的代码段和数据段以及相应段在内存中的指定存储位置,此外还包括了程序入口地址、部分寄存器的配置值、可编程延时时间等信息(见表1)。
其中,程序入口地址是引导表加载结束后,用户程序开始执行的地址;寄存器配置数目决定了后面有多少个寄存器需要配置;只有当延时标志为0xFFFF时,延时才被执行;延时长度决定了在寄存器配置后延时多少个CPU周期后才进行下一个动作;段长度、段起始地址和数据则为用户程序中定义的各个段的内容,并且可以重复添加;最后以0x00000000(32个0)作为引导表的结束标志。
要生成引导表,可以将CCS最终编译生.成的out文件通过CCS自带的hex55.exe转换程序得到。将hex55.exe、.out文件、.cmd文件放在同一个文件夹中,通过dos命令格式调用hex55.exe,即可完成.out文件到hex格式的引导表文件的转化。CMD文件用来提供引导表的相关配置信息,以下为一个CMD文件的实例:
FlashBootTest.out;输入的.out文件
-boot;说明创建boot文件
-v5510:2;生成55X boot文件格式
-paralle116;使用串行加载方式
-a;ASCII格式
-reg_config 0xlc00,0x6cd2:在地址0xlc00
的寄存器写入0x6cd2,配置CPU时钟
-delay0x100;延时0x100个CPU时钟周期
-o FlashBootTest.hex;输出.hex文件
FLASH的烧s和自举的实现
TMS320VC5509A和AT49LV1024的硬件设计
AT49LV1024是ATMEL公司3V供电系统的FLASH芯片,16位位宽,容量为64K字。VC5509A(PGE封装)只有14条地址线,只能寻址16K字的SRAM空间。要想寻址64K字地址空间的话,FLASH地址线的高两位则需要通过其他IO线控制。在本系统中通过GP104和GP106与FLASH的高两位地址相连达到此目的,其连接示意图如图1所示。但是在Bootloader自举引导程序的时候,并不能控制GPIO引脚,也就是只能引导最大16K字的程序。对于大于16K字的程序,则需要进行二次引导。
二次引导技术
所谓二次引导,通过DSP内部ROM固化的Bootloader引导用户自己编写一个引导程序,其功能和ROM内固化的Bootloader相同,再通过此引导程序加载系统最终运行的程序代码,并在加载结束后,把PC值置为新的程序入口地址。由于在用户编写的引导程序中,可以控制GIP04和GP106,所以可达到64K字地址空间的寻址目的。其具体实现椎图如图2所示。
数据烧写程序设计
FLASH的数据可直接读取,但对FLASH的编程和擦除操作则需要通过一系列命令才能进行。AT49LVl024的写操作只能将1变成0,而0变成1操作必须通过擦除操作进行。所以每次写FLASH之前,必须进行片擦除,使存储单元值变成0xFFFF,于能进行编程。
擦除命令:需要六个周期,其操作命令如表2所示。
编程命令需要四个周期,其操作命令如表3所示。
编程和擦除操作都需要一定的周期的时间(AT49LV1024的单字编程时间是20μs,整片擦除时间是10s),用户可以通过查询标志数据线DQ6和DQ7来确定编程或擦除是否完毕。当片子正处于编程或擦除状态时,连续读任意单元的值,DQ6的值将一直处于0、1交替变化,当编程或擦除结束时,读DQ6则得到一个恒定值。本文即通过此方法来判断操作是否结束。
根据FLASH的编程和擦除命令,编写了相应的C语言程序如下,其中SetGPI046Addr(Addr)子程的作用是根据所传递的Addr值配置相应的GPI04和GPI06即高两位地址的值。
・片擦除程序
#define FLASH_BASE_ADDR=0x200000;
//设定FLASH的基地址,CE1的首地址
void ChipErase(void)
{
SetGPI046Addr(0x5555);//设定FLASH的
地址值0x5555的GPI04和GPI06电平
*(volatile Uint16*)(FLASH_BASE_ADDR+0x5555)=0xaa;//向
FLASH的地址0x5555写入0xaa
SetGPl046HiAddr(Ox2aaa);
*(volatile Uint16*)(FLASH_BASE_ADDR+0x2zna)=0x55;
SetGPI046HiAddr(0x5555);
*(volatile Uint16*)(FLASH_BASE_ADDR+0x5555)=0x80;
SetGPI046HiAddr(0x5555);
*(volatile Uint16*)(FLASH_BASE_ADDR+0x5555)=0xaa;
SetGPI046HiAddr(0x2aaa);
*(volatile Uint16*)(FLASH BASE_ADDR+0x2aaa)=0x55;
SetGPI046HiAddr(0x5555);
*(volatile Uint16*)(FLASH_BASE_ADDR+0x5555)=0x10;
WriteOrEraselsOve();//等待撩除完毕
}
・单字编程程序
void WriteWord(Uint16 Addr,Uint16 Val)
{
SetGPl046HiAddr(0x5555);
*(volatile Uint16*)
(FLASH_BASE ADDR+0x5555)=0xaa;
SetGPl046HiAddr(0x2aaa);
*(volatile Uint16*)
(FLASH_BASE_ADDR+0x2aaa)=0x55;
SetGPI046HiAddr(0x5555);
*(volatile Uint16*)
(FLASH 13ASE_ADDR+0x5555)=0xa0;
SetGH046HiAddr(Addr);
*(volatile Uint16*)(FLASH_BASE_ADDR+
Addr)=Val;//写进编程数据
WriteOrEraselsOver();//等待编程结束
}
・编程和擦除结束确认程序
void WriteOrEraselsOver(void)
{
volmile Uint16 LastDQ6,CurrentDQ6;
SetGPI046HiAddr(0x0);
LastDQ6=(*(volatile Uint16*)FLASH_BASE_ADDR)&0x40;//取DQ6的值
CurrentDQ6=(*(volatile Uint16*)FLASH_BASE_ADDR)&0x40;
While(1)//等待两次连续读DQ6的相等
{
LastDQ6=CurrentDQ6;
CurrentDQ6=(*(VolatileUint16*)FLASH BASE_ADDR)&0x40;
if(LastDQ6==CurrentDQ6)
break;//当两次连续读DQ6的相等时,跳
出循环
}
}
本系统采用CCS仿真环境下对FLASH在线编程。先建立一个FLASH的烧写工程,并在工程中将要烧写进FLASH引导表文件,通过CCS的LOAD DATA功能直接加载dsp的内存中,根据加载的首地址和数据长度,在仿真环境下烧进flash中。值得注意的是,程序加载的内存空间不能和FLASH的烧写程序重叠,否则将烧写失败。
需要补充的是,经HEX55.exe转化后的hex格式的引导表文件是不能直接导入CCS中的。CCS只支持其特别规定的DAT格式文件通过LOADDATA导入内存中,所以引导表在导入之前必须先进行转化。转化成DAT格式文件这个工作可以通过VC编写一个简单的C语言转化程序来实现。
结 语
本文阐述了一种针对TMS320VC55x系列DSP简单有效的FLASH烧写方法,并提出了程序自举引导的实现方法,包括大程序二次引导的实现方法。本文讨论的引导方法包括硬件设计及相关程序已在实际开发CMOS图像采集项目中使用,并成功运行。