利用Flash實(shí)現DSP對多個(gè)程序有選擇的加載
關(guān)鍵詞:Flash存儲器 DSP 主機接口 Bootloader 引導表
引 言
在TMS320C54X系列DSP系統的開(kāi)發(fā)中,由于DSP片內只有ROM和RAM存儲器,如要將用戶(hù)代碼寫(xiě)入ROM中,必須要由DSP芯片廠(chǎng)家來(lái)完成;但這樣做用戶(hù)就不能再更改代碼,很不實(shí)用。由于RAM在DSP掉電后不能再保存數據,因此,常常利用EPROM、Flash等一些外部存儲器來(lái)存放用戶(hù)代碼。在DSP上電工作后,利用DSP提供的boot機制,再將程序下載到DSP RAM中運行。如果使用EPROM外部存儲器存放用戶(hù)代碼,需要用代碼轉換工具將用戶(hù)代碼轉換為二進(jìn)制目標文件,然后用編程器將其燒寫(xiě)進(jìn)EPROM;而如果使用Flash存儲器存放用戶(hù)代碼,則可直接使用DSP仿真器和CCS(Code Composer Studio )仿真環(huán)境進(jìn)行在線(xiàn)編程,使用靈活方便,不再需要其它編程設備。在某一以太網(wǎng)通信系統中,我們就采用Flash存儲器來(lái)實(shí)現多份用戶(hù)代碼的有選擇加載。下面就以此系統為例介紹對TMS320VC54X DSP的一種用戶(hù)代碼加載的方法。
1 系統構架
??此通信系統基于802.3以太網(wǎng)標準,用以實(shí)現各終端之間的話(huà)音和其它數據的通信,以及實(shí)現局域網(wǎng)內終端與外界的話(huà)音和數據通信。為節約開(kāi)發(fā)成本,提高系統的可擴展性、通用性和靈活性,我們對每個(gè)網(wǎng)內終端采用同樣的硬件架構,通過(guò)使用不同的軟件代碼而使其實(shí)現不同的功能,發(fā)揮不同的作用。
??每一通信終端由2塊DSP芯片、1塊網(wǎng)卡、1塊CPLD和1塊FPGA以及Flash存儲器等器件組成可擴展的基本結構。其中,以TMS320VC5410 DSP作為主CPU,負責系統的邏輯控制和一般數據傳輸;以MS320VC5416 DSP作為從CPU,負責話(huà)音的編解碼和回聲消除、語(yǔ)音檢測等工作。2塊DSP之間通過(guò)主機接口(HPI)進(jìn)行通信。為了實(shí)現代碼的有選擇下載,可由FPGA配置一端口作為撥碼開(kāi)關(guān),使用戶(hù)通過(guò)調節撥碼開(kāi)關(guān),可以有選擇地下載存儲于Flash中的用戶(hù)代碼,其結構如圖1所示。
??配置撥碼開(kāi)關(guān)是為了擴充系統的功能,以實(shí)現一個(gè)硬件平臺的多種用途。我們可以將實(shí)現不同功能的多份用戶(hù)代碼都寫(xiě)入Flash存儲器中存放,通過(guò)硬件撥碼開(kāi)關(guān)的設置,選擇其中一份用戶(hù)代碼下載執行。在系統上電加載用戶(hù)代碼時(shí),系統先從Flash下載FPGA配置程序,然后通過(guò)FPGA讀出撥碼開(kāi)關(guān)的值,再根據此值從Flash中選擇對應的5410 DSP用戶(hù)代碼加載;而5416 DSP的用戶(hù)代碼加載是在5410代碼加載完成,啟動(dòng)運行后由5410程序從Flash中讀出相應的5416代碼,再通過(guò)HPI加載到5416的,以此實(shí)現5416 DSP的代碼加載與啟動(dòng)。
2 M29W800AB Flash存儲器介紹及使用
??在此系統中,我們選用的是M29W800AB Flash存儲器,其容量為512K16位, 分為16頁(yè),每頁(yè)32K。其中,第0頁(yè)有4個(gè)模塊:0x00~0x1fff、0x2000~0x2fff、0x3000~0x3fff、0x4000~0x7fff。其余各頁(yè),每頁(yè)為1個(gè)模塊,共有19個(gè)模塊。
??對Flash的操作要靠寫(xiě)入一系列特定的地址和數據序列來(lái)完成。在每次對Flash寫(xiě)入之前,要對其原來(lái)的內容進(jìn)行擦除。Flash的擦除包括塊擦除和芯片擦除兩種。塊擦除是對一個(gè)模塊進(jìn)行擦除,芯片擦除是擦除整個(gè)Flash的內容。因此,對Flash的操作,是以模塊為基本單元的。對Flash的操作由指令決定,其必須滿(mǎn)足Flash的時(shí)序要求,每條指令需要1~6個(gè)不等的指令周期。主要操作指令包括讀數據指令、編程指令、復位指令、自動(dòng)選擇指令和擦除指令。每個(gè)指令周期由一個(gè)命令構成,每個(gè)命令代碼所執行的任務(wù)如表1所列。
表1 Flash的命令說(shuō)明
HEX代碼 | 命 令 |
00h | 有效/保留 |
10h | 芯片擦除確認 |
20h | 保留 |
30h | 模塊擦除繼續/確認 |
80h | 建立擦除 |
90h | 讀電平信號/模塊保護狀態(tài) |
A0h | 編程 |
B0h | 擦除中止 |
F0h | 讀陣列/復位 |
??下面以M29W800AB Flash的塊擦除指令為例,具體說(shuō)明Flash的操作時(shí)序:塊擦除指令需要6個(gè)總線(xiàn)周期,先以2個(gè)解鎖周期開(kāi)始,然后是1個(gè)擦除建立周期,接下來(lái)又是2個(gè)解鎖周期,最后是1個(gè)擦除確認周期,其指令時(shí)序如表2所列。
表2 Flash擦除指令說(shuō)明
周期 | 第1周期 | 第2周期 | 第3周期 | 第4周期 | 第5周期 | 第6周期 |
地址 | 5555h | 2AAAh | 5555h | 5555h | 2AAAh | 模塊地址 |
數據 | AAh | 55h | 80h | AAh | 55h | 30h |
??其C語(yǔ)言程序設計代碼如下:
#define flash ((volatile unsigned int*)0x8000)
Block_Erase(ADDR){
flash[0x5555] = 0x00AA;
wait(1000);
flash[0x2AAA] = 0x0055;
wait(1000);
flash[0x5555] = 0x0080;
wait(1000);
flash[0x5555] = 0x00AA;
wait(1000);
flash[0x2AAA] = 0x0055;
wait(1000);
flash[ADDR] = 0x0030;
}
??需要注意的是,Flash相對于DSP來(lái)說(shuō)是慢速設備,編程時(shí),對Flash的訪(fǎng)問(wèn)需要有足夠的延時(shí)等待。對其它指令這里就不一一介紹了。要了解更多內容,可參考具體的Flash存儲器手冊。
3 引導裝載
??TMS320VC5410和TMS320VC5416片內ROM中固化有TI公司的引導裝載(Bootloader)程序,用于在上電復位時(shí)把用戶(hù)代碼從外部存儲器引導到片內RAM中運行。引導程序是在一些片內固化的一個(gè)程序,它負責上電時(shí)初始化存儲器。換句話(huà)說(shuō),它將程序從非易失性存儲器(如Flash存儲器)中調入系統的存儲器中。其提供的片內引導模式有: HPI(主機接口)引導、并行EPROM引導、并行I/O引導和串行口引導等。下面先介紹這兩塊芯片的上電引導過(guò)程。
??DSP上電復位后,先檢測其MP/MC引腳,如果MP/MC=“0”,表示使用片內ROM引導。此時(shí),DSP從0xFF80處開(kāi)始執行TI的片內引導程序。進(jìn)入引導程序后,HINT引腳變?yōu)榈碗娖?,然后開(kāi)始檢測INT2是否為低電平(有效)。如有效,則進(jìn)入HPI引導方式;否則,檢測INT3引腳。如有INT3請求中斷,則進(jìn)入串行引導方式;否則,就進(jìn)入并行引導方式。在本系統中,我們采用TI公司提供的Bootlooder程序進(jìn)行引導裝載,為此,應將MP/MC引腳接低電平。引導程序流程如圖2所示。
3.1 HPI模式實(shí)現TMS320VC5416的程序加載
??按以上設計,5416DSP的程序加載采用HPI(主機接口)模式。對于HPI引導模式,必須將HINT和INT2引腳連接在一起,以保證Bootloader程序能檢測到INT2有效。當檢測其為低電平時(shí),進(jìn)入HPI引導方式。主處理器5410啟動(dòng)運行后,5410程序從Flash中下載5416程序,通過(guò)5410與5416之間的HPI寫(xiě)入5416 RAM。在將程序寫(xiě)入5416時(shí),要按照5416程序的cmd文件配置,將從Flash中讀出的代碼寫(xiě)入5416程序空間的代碼段。寫(xiě)完代碼后,還應將5416代碼的起始地址寫(xiě)入5416的0x7f單元,將0寫(xiě)入0x7e單元,起始地址可在CCS仿真環(huán)境中編譯5416代碼后看出,此時(shí)PC所指向的位置就是代碼的起始地址。這是因為,當5416進(jìn)入HPI引導方式后,Boodloader程序開(kāi)始檢測0x7f單元的內容(0x7e和0x7f兩單元內容在Boodloader程序開(kāi)始執行時(shí)就清零)。當檢測到其內容不為零時(shí),即將0x7e的內容賦給XPC,將0x7f的內容賦給PC,程序跳轉到PC所指向位置執行用戶(hù)代碼。這樣就實(shí)現了從片5416的程序加載啟動(dòng)。圖3是HPI模式加載用戶(hù)代碼的流程。
3.2 并行加載模式實(shí)現TMS320VC5410的程序加載
??5410主處理器的用戶(hù)代碼加載采用并行模式加載。在本系統中,有多份5410用戶(hù)代碼存儲于Flash中。系統上電后,先要從Flash中下載FPGA配置代碼,然后讀出撥碼開(kāi)關(guān)的值,再選擇相應的用戶(hù)代碼下載,完成后,跳轉到用戶(hù)代碼的入口地址開(kāi)始執行用戶(hù)代碼。為此,需要設計一啟動(dòng)程序以實(shí)現以上功能。啟動(dòng)程序的內容包括下載FPGA配置代碼,讀拔碼開(kāi)關(guān)值,并根據此值選擇下載相應的5410用戶(hù)代碼到其cmd文件配置的相應程序空間。完成后,跳轉到用戶(hù)代碼起始地址。代碼的起始地址通過(guò)CCS仿真環(huán)境編譯后獲得,啟動(dòng)程序的下載運行,則要依靠TI的片內引導程序,采用16位并行模式引導加載,需要構建引導表。所謂引導表就是引導程序要調入的代碼。引導表中除了包括源代碼之外,還包含一些附加信息。這些信息指導引導程序的具體執行過(guò)程。因此,可以說(shuō)引導表是由程序代碼和一些附加信息組成的一種數據結構。在這里,我們需要用啟動(dòng)程序構建引導表,并將引導表也寫(xiě)入Flash中。
??在此系統中,Flash存儲器映射為DSP的0x8000~0xffff數據空間。對Flash操作時(shí),首先要選擇頁(yè),每一頁(yè)都對應為DSP的0x8000~0xffff地址的數據空間。需要注意:除了將引導表寫(xiě)入Flash外,還應將引導表的起始地址(對于DSP處理器而言的地址,如果在Flash中為0,則對DSP即為0x8000)寫(xiě)入Flash第一頁(yè)的最后一個(gè)單元(0x7fff單元),即DSP存儲空間的0xFFFFh單元。
??引導程序進(jìn)入并行加載模式后,將查詢(xún)數據空間的0xFFFFh單元,直到讀入一個(gè)有效的地址數據。此數據為用戶(hù)引導表的入口地址。這時(shí),引導程序就跳轉到Flash中的用戶(hù)引導表開(kāi)始執行。需要注意的是,對于不同型號和廠(chǎng)家的Flash,其引導表的格式和內容是不同的。下面就M29W800AB Flash引導表的格式及我們所配置的內容說(shuō)明如下:
10AAh(16位模式) |
7fff(SWWSR寄存器值) |
8000h(BSCR寄存器值) |
0h(啟動(dòng)程序運行的XPC值) |
d08h(啟動(dòng)程序運行起始的PC值) |
22f8h(啟動(dòng)程序的長(cháng)度) |
0h(啟動(dòng)程序裝載的起始地址XPC) |
d08h(啟動(dòng)程序裝載起始地址PC) |
啟動(dòng)程序代碼… |
連接8個(gè)單元的0h(表示引導表結束) |
??程序根據引導表的內容將用戶(hù)代碼下載到指定的程序空間中,并將指定的程序入口地址值賦給PC,使程序從此處開(kāi)始執行,從而完成5410 DSP的引導啟動(dòng)。并行引導流程如圖4所示。
??在系統的實(shí)際調試過(guò)程中,通過(guò)HPI加載5416代碼時(shí),要注意5410和5416的時(shí)鐘要匹配。一般來(lái)說(shuō),要求從片時(shí)鐘為主片時(shí)鐘的1.25倍以上。在此系統中,系統基準時(shí)鐘為8MHz,5410啟動(dòng)時(shí)鐘設為8MHz,5416設為10倍頻80MHz。
??本系統最大的優(yōu)點(diǎn)是實(shí)現了一機多用,擴展了系統的功能,增強了系統的靈活性和通用性,在實(shí)際應用中已取得了良好的效果。
評論