在仿真環(huán)境下實(shí)現TMS320C6000系列DSP的程序自引導
關(guān)鍵詞:TMS320C6000;FLASH;boot loader
開(kāi)發(fā)DSP系統應用板,最終要脫離仿真器而獨立運行,這時(shí)就需要一個(gè)能在斷電后保存程序及初始化數據的存儲器。系統上電時(shí),由引導程序將DSP的應用程序從該存儲器引導到DSP應用板上的高速存儲器(如內部SRAM,SDRAM等)中。由于FLASH具有電信號刪除功能?且刪除速度快,集成度高,因而已成為此種存儲器的首選。
將用戶(hù)程序代碼寫(xiě)入FLASH的方法有兩種:第一種是用專(zhuān)門(mén)的FLASH編程器實(shí)現,第二種是通過(guò)系統微處理器與FLASH的接口來(lái)實(shí)現。第一種方法的主要優(yōu)點(diǎn)是使用方便可靠,但要求FLASH只能是雙列直插等一些可插拔的封裝形式,由于芯片制造工藝的提高,芯片的集成度越來(lái)越高,FLASH正向小型化、貼片式發(fā)展,從而使表面貼裝或PLCC封裝的FLASH難以利用編程器編程。第二種方法克服了第一種方法的缺點(diǎn),且使用靈活,因而在DSP系統中的應用日益廣泛。
由于FLASH的存取速度較慢,寫(xiě)入FLASH的程序將在系統上電時(shí)被DSP裝載到快速的存儲器中運行,這個(gè)過(guò)程稱(chēng)為boot loader。不同的DSP有不同的引導方式,本文將以TMS320C6713為例來(lái)介紹TMS320C6000系列的boot loader方式。
1?。疲蹋粒樱鹊墓ぷ鞣绞郊霸谙到y編程
目前,市場(chǎng)上的FLASH型號很多,但工作方式大體相同,下面以AM29LV160D為例進(jìn)行介紹。
1.1 AM29LV160D FLASH存儲器簡(jiǎn)介
AM29LV160D是AMD公司生產(chǎn)的2M8bit/1M16bit FLASH存儲器,它的數據寬度為8位、16位可選,采用3.3V供電,完全兼容JEDEC標準,并支持在系統編程,用戶(hù)只需向其內部的命令寄存器寫(xiě)入命令序列即可實(shí)現部分擦除、全部擦除、數據寫(xiě)入等功能;同時(shí)可提供硬件和軟件方法來(lái)檢查FLASH的操作執行情況。
圖1
1.2 編程方法
對FLASH的在系統編程就是通過(guò)一定的編程命令序列來(lái)控制FLASH的工作方式,這些命令序列是一些特定字符的組合,只要向FLASH中的特定寄存器以特定的順序輸入這些字符即可進(jìn)入相應的編程模式。AM29LV160D中的主要命令序列和寫(xiě)入地址如圖1所示。具體說(shuō)明如下:
●復位命令序列:對FLASH中任一地址寫(xiě)入“F0”,即可實(shí)現復位。
● 自動(dòng)選擇模式:此模式主要用于編程器編程時(shí),由編程器根據從數據線(xiàn)DQ7~DQ0讀出的識別碼自動(dòng)配置編程邏輯,當然也可以通過(guò)命令序列在在系統情況下將自動(dòng)選擇碼讀出。
●編程命令序列:程序可以以字節方式或字方式寫(xiě)入,這主要根據FLASH外部引腳BYTE的狀態(tài)而定。
●芯片擦除命令序列:FLASH編程時(shí)應先執行擦除命令,這是因為編程指令只能將數據由1變?yōu)椋?,反之則不行。
● 扇區擦除命令序列:為了編程方便及保護有用數據,數據擦除可以只擦除某些無(wú)用的扇區。
● 擦除暫停和恢復命令序列:這個(gè)命令序列只在進(jìn)行扇區擦除時(shí)有效,它允許編程者中斷一個(gè)扇區的擦除操作,接著(zhù)從沒(méi)有被擦除的扇區讀出或寫(xiě)入數據。
●寫(xiě)入命令:也分為字節模式和字模式,分別對應FLASH的8位和16位工作方式,具體為哪種模式,可由FLASH的BYTE腳的輸入來(lái)決定,低電平為字節模式,高電平為字模式。
在對FLASH進(jìn)行編程時(shí),FLASH提供硬件和軟件機制來(lái)獲得FLASH的狀態(tài),以確定數據寫(xiě)入或擦除操作是否完成。硬件方法主要是利用FLASH的外部引腳RY/BY的輸出信號在命令序列的最后一個(gè)寫(xiě)脈沖(WE)的上升沿之后有效。當該輸出為低電平時(shí),表示FLASH正在編程或擦除中,而當該輸出腳為高電平時(shí),即表示編程或擦除已完成。將此引腳與TMS320C671x系列DSP的ARDY引腳相連,即可實(shí)現硬件的自動(dòng)編程或擦除的完成判斷。C6000系列DSP與FLASH的連線(xiàn)圖如圖2所示。
軟件方法是利用從FLASH數據線(xiàn)讀取的數據來(lái)判斷FLASH的狀態(tài),讀取數據中的主要判斷位為DQ2、DQ3、DQ5、DQ6和DQ7,它們之間的相互組合提供了幾種軟件判斷狀態(tài)的方法,應用較多且較為簡(jiǎn)便的方法是在命令序列寫(xiě)入后,如果寫(xiě)入的是編程命令,則選擇一個(gè)地址,并循環(huán)讀取這個(gè)地址的數據。若裝置仍處于編程狀態(tài)之中,DQ7輸出為寫(xiě)入數據的補碼,而在編程完成后,DQ7輸出的是所選地址上的正確數據。如果寫(xiě)入的是擦除命令,那么?當裝置處于擦除狀態(tài)時(shí),則DQ7輸出為0,若擦除完成或擦除被中斷?DQ7輸出為1。選擇地址時(shí)應注意:若地址所在區域屬于FLASH中的保護區域,則DQ7輸出的FLASH狀態(tài)信息有效,有效時(shí)間只能持續大約1μs,然后輸出正確數據。而擦除命令擦除的范圍如果包括FLASH中的保護區域,那么命令將被忽略,此時(shí)DQ7輸出狀態(tài)信息有效,持續時(shí)間大約100μs。對FLASH的操作有時(shí)會(huì )出錯,出錯時(shí),FLASH將處于不正常狀態(tài),DQ7可能永遠也不會(huì )輸出地址上的正確數據,此時(shí)就需讀?。模眩档妮敵鲂畔?,若為1則表示操作失敗。其軟件流程圖如圖3所示。
對FLASH的編程既可以用匯編語(yǔ)言,也可以用C語(yǔ)言,以下給出部分C代碼。該程序代碼可采用TI公司專(zhuān)門(mén)用于TI公司系列DSP編程的Code Com-poser Studio 編程工具進(jìn)行編寫(xiě)。
void erase_flash(short * flash_ptr)
{
short * ctrl_addr1=(short *)((int)flash_ptr+(0x555<<2));
/*此處0x555地址左移兩位,按16位存儲器來(lái)看,本來(lái)只需左移一位,但在計算式中?地址flash_ptr是先轉換成int型再計算的,而要寫(xiě)入命令的地址0x555為16位地址,所以需乘2,因此應當再左移一位*/
short * ctrl_addr2=(short *)((int)flash_ptr+(0x2aa<<2));?
* ctrl_ addr1=0x00aa;
* ctrl_addr2=0x0055;
* ctrl_addr1=0x0080;
* ctrl_addr1=0x00aa;
* ctrl_addr2=0x0055;
* ctrl_addr1=0x0010;
}
void program_flash(short * source_ptr?short * flash ptr,short length)
{
short i?
short * ctrl_addr1=(short *)((int)flash_ptr+(0x555<<2));??
short * ctrl_addr2=(short *)((int)flash_ptr+0x2aa<<2));?
for(i=0;i<length;i++)
{
* ctrl_addr1=0x00aa;
* ctrl_addr2=0x0055;
* ctrl_addr1=0x00a0;
* flash_ptr++=*source_ptr?
}
}
在上面的程序中,對FLASH的命令序列的寫(xiě)入地址有一個(gè)左移指令,即若應寫(xiě)入命令的寄存器地址為0x555,實(shí)際編程時(shí),應先對0x555左移若干位,然后再對得到的地址寫(xiě)入命令。這是因為,TMS320C6000系列DSP為32位DSP,它的外部地址總線(xiàn)引腳的最低位(LSB)為EA2,即輸出地址的最低位為實(shí)際地址的第2位,而不會(huì )輸出第1位和第0位,但實(shí)際外接的FLASH可以是8位、16位、32位不等。如果連接非32位存儲器,在讀數據時(shí)?DSP的外部存儲器接口(EMIF)會(huì )自動(dòng)將實(shí)際地址左移若干位,以使外部地址總線(xiàn)引腳的最低位EA2根據FLASH位數的不同輸出實(shí)際地址的第0位或第1位,然后再將幾次讀入的數據合成一個(gè)32位的值(外接FLASH的位數可以在EMIF寄存器中設置),而在寫(xiě)數據時(shí),就需要編程者手動(dòng)進(jìn)行移位,具體方法是?外接8位存儲器時(shí)左移2位,外接16位存儲器時(shí)左移1位。
2 用FLASH實(shí)現DSP的程序自引導
TMS320C6000系列DSP包括多個(gè)型號,各個(gè)型號的程序自引導方法一致,下面以TMS320C6713為例來(lái)介紹程序自引導的實(shí)現過(guò)程。
2.1 TMS320C6713DSP簡(jiǎn)介
TMS320C6713是TI公司推出的TMS320C67xx系列浮點(diǎn)DSP中最新的一種芯片。TMS320C6713每周期可以執行8條32位指令;支持32/64位數據;具有最高225MHz、4.4ns指令周期的運行速度和1800MIPS或1350MFLOPS的處理能力;同時(shí)是有強大的外設支持能力;外部存儲器接口(EMIF)可以很方便地和SDRAM、SBSRAM、FLASH、SRAM等同步和異步存儲器相連,16位HPI接口可以和各種處理器?如PC、POWERPC等?接口;另外還有優(yōu)化的多通道緩存串口和多通道音頻串口(僅TMS320C6713),這些外部接口使設計人員可以很容易實(shí)現自己的應用系統。
2.2 TMS320C6713程序自引導功能的實(shí)現
斷電時(shí)用慢速ROM或FLASH存儲程序和初始化數據,上電后引導到內部或外部快速RAM中運行是現在普遍采用的一種設計DSP電路板的方法,該方法可靠、方便、靈活且成本較低。但對于不同的DSP有不同的程序自引導方法。本文只討論TMS320C6000系列DSP的引導方法。
和以往TI公司的DSP(如3x、4x)采用引導表由固化在DSP內部的引導程序實(shí)現程序的自引導不同,TMS320C6000系列DSP采用的是一種新的引導方法,對于TMS320C6713,上電后,若選擇從EMIF引導程序,則DSP自動(dòng)將位于地址空間CE1(0x90000000~0x9FFFFFFF)開(kāi)頭的1kB代碼傳輸到地址空間0處。它的數據傳輸采用默認時(shí)序,用戶(hù)可以選擇外部程序存儲器的寬度(8位/16位/32位),然后由EMIF自動(dòng)將幾次讀入的數據合成32位數據。傳輸由DSP中的EDMA通道以單幀的形式自動(dòng)進(jìn)行,傳輸完成后,程序從地址0處開(kāi)始運行。因此,要在TMS320C671x中實(shí)現基于FLASH的自引導功能,必須將FLASH配置在DSP的CE1地址空間中。
以上工作均由DSP自動(dòng)完成。很明顯,自動(dòng)傳輸的代碼并不能滿(mǎn)足絕大多數編程者對代碼長(cháng)度的要求,因此可在這段代碼中加入數據傳輸功能,從而將實(shí)際工作中遠大于1kB的代碼由FLASH中讀入到用戶(hù)指定的存儲空間,然后再將程序跳到實(shí)際有用的代碼處運行。對FLASH編程并實(shí)現程序自引導的具體過(guò)程如下:
(1)對DSP正常運行程序的處理
Code Composer Studio(CCS)是TI公司開(kāi)發(fā)的用于DSP產(chǎn)品的軟件開(kāi)發(fā)工具。由CCS得到的代碼為目標文件格式(COFF),這種格式文件不能直接寫(xiě)入FLASH,而要先用其它語(yǔ)言(如C)編寫(xiě)文件,然后由轉換工具進(jìn)行轉化。
在COFF格式下,程序被分成很多段(包括程序段、初始化數據段、未初始化數據段、自定義段等),每段都占據連續的存儲空間,段與段之間相互獨立。另外,在COFF文件中,除了段內的用戶(hù)程序和數據外,還包含一些額外的信息,其中有COFF文件的版本、段的數量、段的長(cháng)度和起始地址等,分析清楚這些信息,就可以編寫(xiě)自己的文件轉換工具了。具體方法是:讀入COFF文件,根據格式分析該文件的內容,再把用戶(hù)程序和數據部分提取出來(lái),仍分成一個(gè)個(gè)段,并在每個(gè)段前加入起始位置和段長(cháng)度信息,同時(shí)在最后一個(gè)段的末尾加上結束標志,最后寫(xiě)入一個(gè)新的文件。在此過(guò)程中,因為COFF文件的字長(cháng)為32bit,而FLASH寬度可能為8bit或16bit,因而要在兩者之間進(jìn)行手工轉化。
(2)編寫(xiě)boot程序
boot程序的大小不能超過(guò)1kB,它主要完成以下幾個(gè)功能:第一是配置DSP的EMIF寄存器,然后從FLASH中把各個(gè)段中的程序和數據拷貝到用戶(hù)指定的存儲器物理地址中,同時(shí)跳到程序的入口點(diǎn)。在此應當注意:C程序的入口點(diǎn)并非main(),而是c_int00,這是因為在調用main()函數之前,系統必須先建立C語(yǔ)言的運行環(huán)境。如為系統堆棧定義.stack段、建立初始化堆棧和禎指針、初始化全局和靜態(tài)變量等。另外,由于boot程序本身也是COFF文件格式,所以也需格式轉換。
(3)編寫(xiě)FLASH燒寫(xiě)程序
FLASH的燒寫(xiě)程序可以根據前面的介紹來(lái)編寫(xiě),但要注意,應將boot程序寫(xiě)入CE1空間開(kāi)始的1kB中,而將DSP正常工作程序寫(xiě)入1kB以后的地址空間中。
3 結束語(yǔ)
本文介紹了FLASH在系統編程和基于FLASH實(shí)現TMS320C6713 DSP程序自引導的過(guò)程。實(shí)際上,TMS320C6000系列DSP中其它類(lèi)型(如C6201、C6701等)的boot也與本文所述相同,因此,完全可以相互借鑒。
評論