(2) 并行自举引导
这种方式是比较常用的一种,外部存储器的字宽为8位或16位。在自举引导时,通过外部并行接口总线将这些代码从数据存储空间传送到程序存储空间,而且可以重新设置SWWSR及BSCR寄存器的内容。并行自举引导方式首先从地址为0FFFFH的I/O口读取自举表首地址的内容,如果此内容不符合8位或16位的引导方式,就从地址为0FFFFH的数据存储器读取,进行8位或16位并行自举引导。所以,在烧写Flash数据的同时,也要在0FFFFH烧入自举表的首地址。引导流程如图2所示。
图2 并行自举引导流程图
(3) 建立自举表
自举表内容不仅包括欲加载的各段代码,而且包括各段代码长度、各代码段存放的目标地址、程序入口地址等信息。若要完成自举引导功能,必须建立正确的自举表。自举表可以由hex500格式转换器自动生成;也可以手动建立自举表,就是把被烧写的程序直接放在烧写程序中,根据被烧写程序的相关信息手动建立自举表。
3 C5410 烧写Flash和并行自举引导
下面通过一个Flash烧写实例,介绍怎样将用户程序烧写进Flash,以及怎样手动建立自举表,并且脱离仿真器以并行自举引导方式使用户程序独立运行。被烧写和烧写程序如下:
.title “FLASH”
.mmregs
SWCR .set 002BH
TEMP .set 0060H
.data
.sect ".BOOT"
.label BOOTTABLE ; 自举表开始
.word 10AAH ; 16位自举标记
.word 7FFFH ; 7个等待周期(SWWSR)
.word 0F000H ; 块转换寄存器(BSCR)
.word 0000h ; 程序入口XPC
.word 0200h ; 程序入口地址(MAIN_START)
.word LOADEND - LOADSTART
; 程序块长度(0116H)
.word 0000h ; 存放目标XPC
.word 0100h ; 存放目标地址
LOADSTART: ;中断向量表开始地址
.copy “vector.asm”;复位处跳转MAIN_START
MAIN_START: ;被烧写的主程序
STM #0F7h,SP
STM #012Ch,PMST
;IPTR=01(中断向量指针为100,指向目标地址),MP/MC=0,OVLY=1,AVIS=0,DROM=1, CLKOFF=1
LOOPF:RSBX XF ;XF置低
CALL DELAY ;延时
SSBX XF ;XF置高
CALL DELAY
B LOOPF
DELAY:PSHM AR6
STM #0090H,AR6
DELAY_LOOP:
RPT #0FF0h
NOP
BANZ DELAY_LOOP,*AR6-
POPM AR6
RET
LOADEND ; 被烧写的程序结束
.space 20h
.mmregs
.label FINDTABLE
.word 8000h
.text
ERASE_WRITE_Flash: ;烧写程序开始
STM #0FFA0H,PMST
STM #07FFFH,SWWSR
STM #0FFFFH,SWCR
_RESETFlash ; Flash复位
_ERASEFlash ;擦除Flash
WRIFlashSTART: ;开始编程Flash
SSBX SXM
RSBX OVM
_RESETFLASH ; Flash复位
STM #8000H,AR0 ;Flash起始地址8000H
STM BOOTTABLE,AR5 ;被烧写的源地址(自举
;表首地址)
STM #( LOADEND- BOOTTABLE),AR4
; 写入011E个字
WRI_RPT
_WRITEFlash *AR0,*AR5 ;调入编程宏
LD *AR0+,A
LD *AR5+,A ;完成AR0和AR5地址自动加1
BANZ WRI_RPT,*AR4-
STM #0FFFFH,AR0; AR0指向数据空间的FFFF
;地址
STM FINDTABLE,AR5
_WRITEFlash *AR0,*AR5 ; 向数据空间的FFFF
;地址写入自举表的首地址8000H
ENDD: NOP
B ENDD
.end
被烧写的主程序是从MAIN_START开始,一直到LOADEND。程序的主要功能是不断改变XF引脚的状态。LOADSTART是中断向量文件(vector.asm)的开始,在中断复位(RESET)处放入一条跳转到MAIN_START指令(BD MAIN_START)。ERASE_WRITE_FLASH是烧写程序的开始,只要程序指针( PC)指向ERASE_WRITE_FLASH,开始运行就可以完成对Flash的烧写操作。从自举表首地址BOOTTABLE (0F8H)到LOADEND(0216H)存放的数据就是要写入Flash的内容,从LOADSTART到LOADEND的数据是DSP自举程序从Flash搬运到片内RAM的程序,具体如下:
00F8H: BOOTTABLE ; 自举表开始
0100H: LOADSTART ;中断向量表首地址
0100H: RESET :BD MAIN_START
... ;中断向量表的内容
0178H: RESERVED
0200H: MAIN_START
... ;主程序
0216H: LOADEND
被烧写的程序只需一个段,根据以上信息就可以完成自举表的内容,如表3所列。
表3 自举表
整个并行自举引导过程为:C5410上电复位后,判断MP/MC=0 处于微计算机工作方式,从片内ROM的0FF80H处执行中断向量表的分支转移指令(BD 0F800H),使程序跳转至0F800H处执行自举引导程序。自举引导程序完成初始化后,读取数据空间的0FFFFH地址的内容,找到自举表首地址8000H,从8000H处开始读取内容。首先,是16位自举标记(10AA)。然后分别是寄存器SWWSR及BSCR的内容,程序入口地址、代码段长度、存放代码段的目标地址等信息。最后,根据这些信息把Flash的8008H到811EH的程序搬运到片内RAM的100H开始的地址中,跳转至片内RAM 100H、即PC为100H、XPC为0,开始执行用户程序,完成用户程序的并行自举过程。
结语
把程序烧写入Flash后,复位C5410,使其处于微计算机工作方式;使用示波器测试XF引脚,观察程序运行正确与否。通过上述方法可完成C5410对Am29LV200B Flash 的烧写,很好地实现了C5410上电后的用户程序自举引导功能。
参考文献
1 TMS320VC5410 Bootloader SPRA609A Copyright (c) TI, 2000-04
2 Am29LV200B Copyright (c) 2002 Advanced Micro Devices, 2002-04-12
3 张雄伟, 曹铁勇. DSP芯片的原理与开发应用. 北京:电子工业出版社, 2001