TMS320VC55x系列DSP的Flash引导方法研究
1 引言
随着数字信号处理技术的快速发展,DSP(数字信号处理器)越来越广泛地应用于各种数字信号处理系统中。最终开发的系统要想脱离仿真器运行,必须将程序代码存储在非易失性存储器中。Flash存储器以其大容量和可在线编程等特点已成为DSP系统的一个基本配置。如何将程序烧写进Flash,并在上电时加载到DSP内部的RAM是Flash在DSP系统中应用的两个基本技术问题。本文以基于TI公司的TMS320VC5509A和Atmel公司的AT49LV1024 Flash开发的系统为背景,详细介绍了系统引导相关的硬件设计、烧写软件设计以及自举引导和二次引导等实现方法。
2 TMS320VC5509A的自举引导
2.1 TMS320VC5509A的自举模式配置
TMS320VC5509A每次上电复位后,在执行完一系列初始化(配置堆栈寄存器、关闭中断、程序临时入口、符号扩展、兼容性配置)工作后,根据预先配置的自举模式,通过固化在ROM内的Bootloader程序进行程序引导。VC5509A的引导模式选择是通过4个模式选择引脚BOOTM[0:3]配置完成的。 BOOTM0~3引脚分别与GPIO1、2、3、0相连。在本系统设计中,采用EMIF(外部存储接口)并行引导模式(16位数据宽度),只需将BOOTM[3:0]设置成1011即可。
EMIF为外部存储接口,通过EMIF接口可以灵活地和各种同步或异步存储器件无缝连接。通过EMIF可以将VC5509A的存储空间扩展到128 Mbit(SDRAM),存储空间共被分为CE0~CE3四个段,每段占用不同的地址。在EMIF的并行引导模式中,ROM固化的Bootloader程序是以0x200000为首地址开始加载程序。0x200000即为CE1空间的首地址,所以Flash必须接在DSP的CE1空间上。在加载时。EMIF的CE1空间已经默认配置成异步静态随机存储器(SRAM)接口,并且在时序上采用了最差情况设置(即最慢访问速度),充分保证了时间裕量,使得程序代码顺利地加载到DSP的内存中。
2.2 TMS320VC5509A的引导表
Bootloader在引导程序时,程序代码是以引导表格形式加载的。TMS320VC55x的引导表结构中包括了用户程序的代码段和数据段以及相应段在内存中的指定存储位置,此外还包括了程序人口地址、部分寄存器的配置值、可编程延时时间等信息。
其中,程序入口地址是引导表加载结束后,用户程序开始执行的地址;寄存器配置数目决定了后面有多少个寄存器需要配置;只有当延时标志为0xFFFF时,延时才被执行;延时长度决定了在寄存器配置后延时多少个CPU周期才进行下一个动作;段长度、段起始地址和数据则为用户程序中定义的各个段的内容,并且可以重复添加;最后以0x00000000(32个0)作为引导表的结束标志。 若要生成引导表,可用CCS最终编译生成的,out文件通过CCS自带的hex55.exe转换程序得到。将hex55.exe、.out文件、.0cmd文件放在同一个文件夹中,通过DOS命令调用hex55.exe。即可完成.out文件到hex格式的引导表文件的转化。.CMD文件用于提供引导表的相关配置信息,以下为一个.CMD文件的实例:
3 Flash的烧写和自举的实现
3.1 TMS320VC5509A和AT49LV1024的硬件没计
AT49LV1024是Atmel公司一款3 V供电系统的Flash存储器,16位位宽,容量为64 KB(16条地址线)。VC5509A(PGE封装)只有14条地址线,只能寻址16 KB的SRAM空间。要想寻址64 KB地址空间的话,Flash地址线的高两位则需要通过其他I/O线控制。在本系统中通过GPIO4和GPIO6与Flash的高两位地址相连实现,但是在Bootloader自举引导程序时,并不能控制GPIO引脚,也就是只能引导最大16 KB的程序。对于大于16 KB的程序,则需要进行二次引导。
3.2 二次引导技术
所谓二次引导,就是通过DSP内部ROM固化的Bootloader引导用户自行编写一个引导程序,其功能和ROM固化的Bootloader相同,再通过此引导程序加载系统最终运行的程序代码,并在加载结束后,把PC值置为新的程序入口地址。在用户编写的引导程序中控制GIPO4和GPIO6,即可实现64 KB地址空间寻址。
3.3 数据烧写程序设计
Flash的数据可直接读取,但对Flash的编程和擦除操作则需要通过一系列命令才能进行。AT49LV1024的写操作只能将1变成0,而0变成1必须通过擦除操作进行。所以每次写Flash之前必须进行片擦除,使存储单元值变成0xFFFF,才能进行编程。
擦除命令需要6个周期。
编程和擦除操作都需要一定周期的时间(AT49LV1024的单字编程时间是20μ8,整片擦除时间是10 s),用户可以通过查询标志数据线DQ6和DQ7确定编程或擦除是否完毕。当器件正处于编程或擦除状态时,连续读任意单元的值,DQ6的值将一直在0、1之间交替变化,当编程或擦除结束时,读DQ6则得到一个恒定值。本文即通过此方法判断操作是否结束。 根据Flash的编程和擦除命令,编写了相应的C语言程序,其中SetGPIO46Addr(Addr)子程序的作用是根据所传递的Addr值配置相应的GPIO4和GPIO6即高两位地址的值。
3.3.1 片擦除程序
3.3.2 单字编程程序
3.3.3 编程和擦除结束确认程序
3.4 程序的烧写实现
本系统在CCS仿真环境下对Flash进行在线编程。先建立一个Flash的烧写工程,并在工程中将要烧写进Flash的引导表文件通过CCS的LOADDATA功能直接加载进DSP的内存,根据加载的首地址和数据长度,在仿真环境下烧进Flash中。值得注意的是,程序加载的内存空间不能与Flash的烧写程序重叠,否则烧写失败。
需要补充的是,经hex55.exe文件转化后的hex格式的引导表文件是不能直接导入CCS中的。CCS只支持将特别规定的DAT格式文件通过LOADDATA导入内存,所以在导入之前必须先将引导表转化成DAT格式文件,这个工作可以由VC编写一个简单的C语言转化程序实现。
4 结束语
本文阐述了一种针对TMS320VC55x系列DSP简单有效的Flash烧写方法,并提出了程序自举引导的实现方法,包括大程序二次引导的实现方法。本文讨论的引导方法包括硬件设计及相关程序,已在笔者的实际开发CMOS图像采集项目中使用并成功运行。
|