摘? 要: 介紹了利用DSP編程實現(xiàn)對FLASH的讀寫操作,設計并實現(xiàn)了一個引導裝載" title="引導裝載">引導裝載系統(tǒng)的模型,給出了一個簡單的測試用的實例,。整個方案有較大的靈活性和實用性,。?
關鍵詞: 數(shù)字信號處理器? FLASH存儲器? 引導裝載?
?
在一些脫機運行的DSP系統(tǒng)中,用戶代碼需要在加電后自行裝載運行。DSP系統(tǒng)的引導裝載(Bootload)是指在系統(tǒng)加電時,DSP將一段存儲在外部的非易失性存儲器中的代碼移植" title="代碼移植">代碼移植到內部的高速存儲單元中去執(zhí)行,。這樣既利用了外部的存儲單元擴展DSP本身有限的ROM資源,又充分發(fā)揮了DSP內部資源的效能,。盡管用戶代碼在一段時期相對是固定的,但是如果直接將其掩膜到內部ROM中去的話,一方面受容量以及價格的限制,另一方面則在系統(tǒng)代碼升級上顯得不是很靈活方便,。FLASH是一種高密度、非易失性的電可擦寫存儲器,而且單位存儲比特的價格比傳統(tǒng)的EPROM要低,十分適合于低功耗,、小尺寸和高性能的便攜式系統(tǒng),。除了可以采用專用的硬件編程器把代碼灌入FLASH中之外,也可以利用現(xiàn)成的DSP通過軟件編程" title="軟件編程">軟件編程來實現(xiàn)同樣的功能。本文論述的正是如何通過DSP軟件編程來實現(xiàn)對FLASH的讀寫操作,并介紹一個簡單的系統(tǒng)引導裝載方案的實現(xiàn),。?
1 系統(tǒng)描述?
本系統(tǒng)由DSP(TMS320VC5410)及外部的FLASH(M29W400T)以及相關的電源管理單元等構成,。DSP與FLASH的連接如圖1所示。DSP與FLASH是主從關系,由DSP的相關輸出管腳控制FLASH的擦除和讀寫,。其中,A0~A17為地址線,D0~D15為數(shù)據(jù)線,/MSTRB為存儲選通信號,R/W是讀寫脈沖信號,/OE和/WE分別為讀使能和寫使能,/CE為片使能,/BYTE為8位或16位數(shù)據(jù)模式選擇(圖中接高電壓為16位模式),。FLASH用于存放引導程序" title="引導程序">引導程序段和用戶代碼,由DSP軟件編程來寫入。當系統(tǒng)脫機加電時,DSP首先從外部FLASH指定的引導程序段的起始位置處開始執(zhí)行引導裝載,。所謂引導裝載,就是將原先存儲在FLASH中的用戶代碼移植到DSP內部的高速執(zhí)行單元,然后將程序指針設置為用戶代碼的起始地址,。這樣,接下來就可以利用DSP資源高速執(zhí)行用戶代碼了。?
?
?
2 DSP對FLASH的操作?
2.1 DSP及FLASH簡介?
TMS320VC5410是TI公司的C54x系列的定點DSP,具有低功耗和高速度,常用于便攜式系統(tǒng)開發(fā),。其內部存儲資源包括256Kb的可掩膜ROM以及可高速運行的128Kb的DARAM和896Kb的SARAM,。ROM中固化了TI提供的引導裝載代碼,本方案采用自編的引導程序。?
ST公司的M29W400系列的FLASH容量為4Mb,分為11個不同大小的塊結構,支持8位或16位操作模式,。通過特殊的命令字序列可以對每一塊獨立進行擦除和讀寫,。與以往的FLASH相比,它由外部單電壓供電,無需額外提供高電壓即可實現(xiàn)擦除及寫入,因而在系統(tǒng)設計上無需考慮特殊的電平匹配。本方案采用16位模式,。?
2.2 地址映射方式?
由于用DSP操作FLASH,必然涉及到FLASH的實際地址在DSP中的映射方式,。TMS320VC5410的地址空間如圖2所示,包括數(shù)據(jù)空間和程序空間,具體的映射方式由DSP內部的一些寄存器決定。它使用頁面擴展機制,最多可以尋址8192Kb的程序空間,。假設FLASH的起始地址0x0000和DSP的起始地址0x0000重合,那么FLASH中只有對應于DSP外部空間的那部分地址,才是DSP可見的,。比如,本方案中采用微處理器模式(MP=1)且OVLY=1時,則DSP第0頁程序空間中可見的FLASH的地址范圍為0x8000~0xFFFF。?
?
?
在擦除或讀寫FLASH之前,必須先執(zhí)行相應的命令字序列,即在指定的FLASH地址處寫入指定的指令代碼,。而整個FLASH地址空間并非和DSP的地址空間一一對應,所以需要考慮地址的重映射,。?
現(xiàn)以對FLASH寫入為例。未考慮地址重映射時,命令字序列如下所示:?
FlashWrite(0x5555L,,0x00AA ),;//1st cycle? ?
FlashWrite(0x2AAAL,0x0055 ),;//2nd cycle ?
FlashWrite(0x5555L,,0x00A0 );//Program command ?
FlashWrite(myaddress,,mydata ),;//put mydata into myaddress?
由圖2可知,當MP=1和OVLY=1時,FLASH地址0x5555L和0x2AAAL在DSP中位于外部空間之外,是不可見的。這樣DSP執(zhí)行上述語句時,根本沒有對FLASH進行相應的操作,從而導致即使FLASH地址myaddress是DSP可見的,也無法實現(xiàn)數(shù)據(jù)寫入的功能,。?
仔細分析FLASH的命令字序列可知,前三句命令字序列中真正起作用的地址位是A0~A14,而高地址位A15~A17可以是任意值,。于是考慮加一個偏移量0x8000,使得重映射后的FLASH地址在DSP中是可見的,。修改后的代碼如下所示:?
#define OFFSET 0x8000?
FlashWrite((0x5555L+OFFSET),0x00AA),; //1st cycle? ?
FlashWrite((0x2AAAL+OFFSET),,0x0055); //2nd cycle ?
FlashWrite((0x5555L+OFFSET),,0x00A0),;//Program command ?
FlashWrite(myaddress,mydata),;//put mydata into myaddress?
這樣,,在DSP中就可以對外部FLASH進行寫入操作了,前提是FLASH地址myaddress在DSP中可見。擦除和讀操作也要對照圖2作類似的地址重映射,不一一累述,。?
2.3 擦除和讀寫過程描述?
在DSP將數(shù)據(jù)寫入FLASH之前,先要刪除數(shù)據(jù)所在塊,然后才能重新寫入,。擦除和寫操作之前都要執(zhí)行相應的命令字序列,而讀操作則可以直接進行。而且要寫入的數(shù)據(jù)部分應為引導程序段以及用戶代碼是經過編譯,、連接后的目標代碼,且為FLASH可識別的HEX格式,。?
3 引導裝載模型設計?
3.1 引導裝載原理?
加電前,DSP設置為微處理器模式(MP=1)。加電后,DSP首先執(zhí)行0xFF80處的中斷向量表" title="向量表">向量表起始處的跳轉命令,轉向0xF800處的引導程序段并實現(xiàn)代碼移植功能,。完畢后,再次跳轉到移植后的用戶程序段的起始地址并執(zhí)行之,。?
3.2 邏輯功能分塊?
引導裝載系統(tǒng)包括引導程序段、用戶程序段,、中斷向量表和連接命令文件四部分,。引導程序段負責將用戶程序段和中斷向量表裝載到目標地址,用戶程序段是實現(xiàn)用戶系統(tǒng)功能的核心代碼,中斷向量表包括加電后的跳轉處理和中斷服務程序的入口,連接命令文件則是分配各個程序段在DSP地址空間中的位置。?
3.3 具體代碼實現(xiàn)?
引導程序段(load.asm)如下:?
??????? .def load_start ?
??? ??? .sect ″load_prg″ ?
load_start: ?
??????? ssbx intm?????????? ,;關中斷?
??????? rsbx??? sxm?????????,;符號擴展模式設置為0?
??? ??? ld #0,dp???????????,;定義數(shù)據(jù)頁指針為0?
??? ??? nop?
??? ??? nop?
??? ??? nop ?
?????? ?ld #0ff80h,,a?? ??????? ;移植中斷向量表,0xff80為中斷向量表的舊起始地址?
??????? stm #VECT_NEW,, ar1 ??? ,;VECT_NEW表示中斷向量表的新起始地址?
??????? rpt #(VECT_LEN-1) ? ;VECT_LEN表示中斷向量表的長度?
??????? reada *ar1+ ?
??? ??? nop ?
?? ???? ld #MAIN_OLD,,a?? ,;移植用戶程序段,MAIN_OLD表示用戶程序段的舊起始 地址?
??????? stm #MAIN_NEW,ar1 ,;MAIN_NEW表示用戶程序段的新起始地址?
??????? rpt #(MAIN_LEN-1) ? ,;MAIN_LEN表示用戶程序段的長度?
??????? reada *ar1+ ?
endboot: ?
??? ??? orm #020h,@1dh???? ;設置OVLY=1,使得內部RAM同時映射到DSP數(shù)據(jù)和程序空間?
????? ? ld #MAIN_NEW,,a ?
????????bacc a????????????? ,;程序指針指向用戶程序段的起始地址?
??????? .end?
??? 用戶程序段(main.asm)如下:?
??????? .def main_start?
??????? .sect ″main_prg″?
main_start:?
??????? USER_PRG??????????? ;此處添加用戶程序段?
??????? .end?
??? 中斷向量表(vect.asm)如下:?
??????? .mmregs ?
??? ??? .ref 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_OLD,,run=MAIN_NEW ?
??? ?? vectors:??????? load=0ff80h,run=VECT_NEW ?
??? ?? load_prg:????? ? load=0f800h ?
??? }?
4 寫入目標代碼?
上述引導程序經過CCS編譯及連接后,生成的目標文件boot.out是DSP能夠識別的COFF格式,。但是FLASH不支持這種格式,所以不能直接寫入FLASH中,。CCS自帶有多種HEX類型的轉換程序,比如常見的有Intel格式等。但是不同的HEX類型有不同的格式和頭尾開銷,比如Intel格式中除了數(shù)據(jù)之外還有起始符,、字節(jié)個數(shù),、起始地址、類型以及校驗位等各種信息,并非純粹數(shù)據(jù)的HEX格式表示,。了解了Intel格式的文件結構之后,就可以從中提取出需要寫入FLASH中的代碼的HEX格式及相應的地址,即對應上面提到的mydata和myaddress,。然后就可以利用上面的方法,用DSP將引導系統(tǒng)各個部分的代碼在脫機運行前寫入FLASH。?
5 簡單測試實例?
利用上述方法,使得系統(tǒng)在脫機狀態(tài)下實現(xiàn)引導裝載,并且從DSP的XF端口輸出均勻脈沖波形,。直接修改用戶程序段可用如下的代碼取代用戶程序段中的USER_PRG,。?
??? loop:?? rsbx xf?
?????? nop?
?? ??? ssbx xf?
?? ??? nop?
????? ?b loop?
經過編譯、連接,、格式轉換以及寫入FLASH之后,系統(tǒng)就可以實際脫機運行了,。加電一段時間后,可以通過示波器測量得到XF端口的均勻脈沖波形,證明引導裝載成功。?
參考文獻?
1 TMS320VC5410 Fixed-point Digital Signal Processor Data Manual.TI Inc.,,Dec.,,2000?
2 M29W400 Data Sheet.ST Inc.,Nov.,,1999?
3 Software Drivers for M29F400 and M29W400 FLASH Memories.ST Inc.,,March,2000?
4 TMS320C54x Assembly Language Tools User’s Guide.TI Inc.,,Dec.,,1999