1 概述
DSP系統(tǒng)的引導裝載是指在系統(tǒng)加電后,系統(tǒng)自行將一段存儲在外部非易失性存儲器中的代碼移植到內部DSP的高速RAM中并執(zhí)行的過程。因此,在引導裝載系統(tǒng)中,外部非易失性存儲器和DSP的性能顯得尤為重要。FLASH存儲器是一種高密度、非易失性的電可擦寫存儲器,而且單位存儲比特的價格比傳統(tǒng)的EPROM要低,所以十分適合于作為外擴存儲器。在系統(tǒng)加電之前,必須先將引導程序和用戶程序寫入FLASH中。編程時,除了可以利用專用的硬件編程器實現對FLASH的編程之外,FLASH通常還支持DSP軟件編程以實現同樣的功能。當系統(tǒng)加電之后,一般首先在FLASH中運行引導程序,并由其自行完成對用戶程序的移植操作,然后再由DSP高速運行移人到DSP片內的用戶程序。本文介紹了TI公司的TMS320VC5410定點DSP和ST公司的M29W400T FLASH存儲器的基本特點和主要結構,給出了通過DSP對FLASH進行軟件編程的具體方法,同時介紹了實現一個完整的引導裝載系統(tǒng)的實現方案。
2 硬件描述
2.1器件簡介
TMS320VC5410數字信號處理器是美國TI公司推出的TMS320VC54x系列定點DSP中的一種,它具有144管腳的LQFP封裝,采用3.3V的I/O電壓和2.5V的核電壓供電方式,具有3個獨立的16位數據總線和1個程序總線的多總線并行結構,其低功耗和高速度適用于便攜式系統(tǒng)的開發(fā)。由于本文涉及到DSP對FLASH的存儲器地址操作;因此,在此對相關內容加以介紹。
DSP的存儲空間包括程序空間和數據空間,它們均劃分為64k X l6位的頁面。其中DSP片內存儲資源包括16k X l6位的可掩膜ROM以及可高速運行的4個2k X 16位的DARAM和7個8k X l6位的SARAM。DSP有兩種工作模式:微處理器模式和微計算機模式,分別對應MP/MC=1和0。本系統(tǒng)中采用的是加電后從外擴的FLASH中啟動,即采用微處理器模式,所以沒有用到DSP內部ROM中固化的引導程序,而是采用早先寫入FLASH中的自行設計的引導程序。
TMS320VC5410的存儲空間映射如圖1所示,它最大可支持128個存儲頁面,尋址空間為8Mb。在圖1中,當MP/MC=1時,程序空間的第0和第1頁面對應于圖中最左邊的兩列,數據空間的第0頁面對應于圖中最右邊的一列,其中的外部空間(External)即對應外擴的FLASH,只有這部分FLASH存儲空間才可以被DSP訪問到。由此可知,DSP對FLASH進行讀寫操作的前提是,FLASH在DSP存儲空間中至少是可見的。
M29W400系列是ST公司推出的FLASH存儲器,該系列器件十分適合于用作外擴存儲器。M29W400T是該系列中的一種,它采用3V單電源供電,并采用TSOP封裝形式。
M29W400T存儲器的容量為4MB,分為11個不同大小的塊結構,它支持8位或16位操作模式。本文采用16位操作模式。M29W400T的外形封裝如圖2所示,管腳功能見表1所列。M29W400T最重要特點就是無需額外提供高電壓即可通過一些特殊的命令字序列實現對各個塊的讀寫和擦除,并且可重復進行十萬次以上。這樣使得通過DSP軟件編程實現對M29W400T的讀寫操作成為可能,并十分適合于系統(tǒng)的調試和開發(fā)。
2.2系統(tǒng)連接
本系統(tǒng)由TMS320VC5410和M29W400T以及相關的電源管理單元等構成,具體的連接電路如圖3所示。圖中,DSP與FLASH是主從關系,由DSP的相關輸出管腳來控制FLASH的擦除和讀寫。其中A0-A17為地址線,DO-D15為數據線,MSTRB為存儲選通信號,R/W是讀寫脈沖信號,OE和WE分別為讀使能和寫使能,CE為片使能,BYTE為8位或16位數據模式選擇(圖3中BYTE接高電壓為16位模式)。當系統(tǒng)按如圖3所示進行連接后,DSP的前一半4MB地址空間數與FLASH的4MB地址空間一一對應,因此,FLASH中的地址值即為DSP中的地址值,這樣,對地址的操作就變得極為方便。
FLASH中用于存放引導程序段和用戶代碼段,由DSP軟件編程寫入。當系統(tǒng)脫機加電時,DSP首先從外部FLASH指定的引導程序段的起始位置處開始執(zhí)行引導裝載,即將原先存儲在FLASH中的用戶代碼移植到DSP片內的RAM中,然后將程序指針設置為用戶程序的起始地址,接下來便可利用DSP資源去高速執(zhí)行用戶程序。
2.3 DSP對FLASH的操作
對照圖1的地址映射關系,如果采用的是微處理器模式(MP/MC=1),并且設置寄存器OVLY=I,那么由于連接的關系使得FLASH的起始地址0x0000和DSP的起始地址0x0000重合,在DSP第0頁程序空間中可見的FLASH的地址范圍應為0x8000-0xFFFF。
在擦除或讀寫FLASH之前,必須先執(zhí)行相應的命令字序列,即在指定的FLASH地址處寫入指定的指令代碼,M29W400T的命令字序列如表2所示。
表2中的某些FLASH地址空間對照圖1恰好對應于DSP的內部地址空間,即對DSP而言是不可見的,所以需要考慮地址的重映射。文中以對FLASH寫人為例,FlashWrite表示一次底層的總線寫操作。
未考慮地址重映射時,命令字序列為:
FlashWrite(0x5555L,0x00AA);// lst cycle
FlashWrite(0x2AAAL.0x0055);// 2nd cycle
FlashWrite(Ox5555L,OxOOAO);// 3rd cycle
(寫入命令)
FlashWrite(myaddress,mydata);// 將數據
mydata寫入FLASH地址myaddress
由圖1可知,當MP=1和OVLY=1時,FLASH地址0x5555L和0x2AAAL在DSP中不屬于外部空間,即對DSP是不可見的。這樣DSP執(zhí)行上述語句時,根本沒有對FLASH進行相應的操作,從而導致即使FLASH地址myaddress是DSP可見的,也無法實現數據寫入的功能。
仔細分析FLASH的命令字序列可知,其實前三句命令字序列中真正起作用的地址位是A0-A14,而高地址位A15-A17可以是任意值,于是考慮加一個地址偏移量0x8000,以使得重映射后的FLASH地址在DSP中是可見的。修改后的代碼為:
#define OFFSET Ox8000
FlashWrite(((k5555L+OFFSET),0x00AA);// 19tcycle
FlashWrite((0x2AAAL+OFFSET),0x0055);// 2ndcycle
FlashWrite((0x5555L+OFFSET),0x00A0);
// 3rdf cycle(重映射的寫入命令)
FlashWrite(myaddress,mydata): // 將數據mydata
寫入FLASH地址myaddress
這樣,在DSP中就可以對外部FLASH進行寫入操作了,而其前提是FLASH地址myaddress在DSP中可見。其它的擦除和讀操作也要對照圖1作類似的地址重映射。
在DSP將數據寫入FLASH之前,只有先刪除數據所在塊,然后才能重新寫入。擦除和寫操作之前都要執(zhí)行如表2所示的相應命令字序列。其中要寫入的數據部分即為引導程序以及用戶程序經過編譯、連接后的目標代碼,為M29W400T可識別的HEX格式。
3 軟件描述
3.1 功能分析
引導裝載系統(tǒng)主要由引導程序和用戶程序兩部分構成,最后都存儲在外擴的M29W400T的指定地址中。以上主要敘述的是如何將目標代碼寫入M29W400T,下面敘述如何設計引導程序和用戶程序,以及生成最后目標代碼的方法。
由于DSP采用微計算機工作模式。因此,在加電后,DSP將首先執(zhí)行0xFF80處的中斷向量表起始處的跳轉命令,然后轉向0xF800處的引導程序并實現代碼移植功能。完畢后,再次跳轉到移植后的用戶程序的起始地址并執(zhí)行。
以一個完整的引導裝載系統(tǒng)為例,設用戶程序是從TMS320VC5410的XF管腳輸出一個均勻方波。此段代碼也可以被其它用戶程序替代,因此本文的引導裝載系統(tǒng)具有一定的通用性。
3.2 代碼實現
利用TI公司的DSP集成開發(fā)套件CCS可以生成*.out格式的目標代碼,首先要建立引導程序段、用戶程序段、中斷向量表和連接命令文件四部分。引導程序段負責將用戶程序段和中斷向量表裝載到目標地址,用戶程序段是實現用戶系統(tǒng)功能的核心代碼(本文僅以實現輸出一個方波為例),中斷向量表包括自啟時的跳轉處理和中斷服務程序的人口;連接命令文件則是分配各個程序段在DSP地址空間中的位置,協(xié)助生成目標代碼,在這四部分中,引導程序段是設計重點,它負責將中斷向量表和用戶代碼段從片外的M29W400T移植到片內的RAM中,并且將程序指針指向用戶代碼段起始地址。其引導程序段(1Oad.asm)的命令代碼如下:
.def load_start
.sect,“l(fā)oad_prg”
load_start:
ssbx intm ;關中斷
rsbx sxm ;符號擴展模式設置為0
ld #0,dp ;定義數據頁指針為0
nop
nop
nop
1d #0ff80h,a ;移植中斷向量表,
0xff80為中斷向量表的舊起始地址
stm # VECT_NEW,arl;VECT_NEW表示中斷向量表的新起始地址
rpt#(VECT_LEN_1);VECT_LEN表示中斷向量表的長度
reada * arl+
nop
ld # MAIN_OLD,a ;移植用戶程序段,
MAm_OlD表示用戶程序段的舊起始地址
stm # MAIN-NEW,arl ;MAIN_NEW表示用戶程序段的新起始地址
rpt#(MAIN_LEN_1) ;MAIN_LEN表示用戶程序段的長度
reada * arl+
endboot:
orm # 020h,@ldh ;
設置OVLY=1,使得內部RAM同時映射到DSP數據和程序空間
ld # MAIN_NEW,a
bacc a ;程序指針指向用戶程序段的起始地址
.end
用戶程序段(main.asm)代碼如下:
.def main_start
.sect “main_prg”
main_start:
loop: rsbx xf ;實現XF的復位和置位
nop
ssbx Xf
nop
b loop
.end
中斷向量表(vect.asm)如下:
.mmregs
.Ief main_ start
.ref lOad_start
.def reset
.def nmi
.sect‘’.vectors‘’
reset: bd load_start ;加電后,跳轉到自啟程序段起始地址
stm #200,sp
nmi: rete ;
此表中只包含NMI中斷入口,也可以類似添加其他中斷入口
nop
nop
nop
.end
連接命令文件(boot.cmd)的配置如下:
vect.obj
main.obj
load.obj
-O boot.out
SECTIONS
{
main_prg:load=MAIN_OID,run=MAIN_NEW
vectors: load=0ff80h,run=VECF_NEW
load_prg:load=0f800h
}
上述引導程序經過CCS編譯及連接后,生成的目標文件boot.out是TMS320VC5410能夠識別的COFF格式,但是M29W400T不支持這種格式,所以不能直接寫入FLASH中。而CCS自身帶有多種HEX類型的轉換程序。因此,在經過格式轉換后,即可得到對應于上文提到的一系列數據和地址mydata和myaddress,此時就可以在聯(lián)機情況下利用CCS以DSP軟件編程方式將目標代碼寫入到M29W400T之中。一旦寫入成功,便可以脫機加電自啟系統(tǒng)。同時,在經一段時間后,還可用示波器測得XF管腳輸出的均勻脈沖方波,以證明引導裝載成功。
責任編輯:gt
評論
查看更多