TMS320C6711的FLASH引導裝載系統研究
1 概述
在一些脫機運行的DSP系統中,用戶(hù)代碼需要在加電后自動(dòng)裝載運行。DSP系統的引導裝載(Bootload)是指在系統加電時(shí),由DSP將一段存儲在外部非易失性存儲器中的代碼移植到高速存儲器單元中去執行。這樣既可利用外部存儲單元來(lái)擴展DSP本身有限的ROM資源,又能充分發(fā)揮DSP內部資源的效能。因此,在裝載系統中,外部非易失性存儲器和DSP的性能顯得尤為重要。FLASH是一種高密度、非易失性的電可擦寫(xiě)存儲器,而且單位存儲比特的價(jià)格比傳統EPROM要低,十分適合用于低功耗、小尺寸和高性能的便攜式系統。本文介紹了TI公司TMS320C6711浮點(diǎn)DSP芯片和SST公司SST39VF040 FLASH存儲器的基本特點(diǎn),同時(shí)給出了一具完整的用FLASH來(lái)實(shí)現系統引導裝載的實(shí)現方案。
2 硬件設計
2.1 器件介紹
整個(gè)系統由DSP(TMS320C6711),外部FLASH存儲器(SST39VF040)以及電源管理單元等構成。下面主要介紹前面兩個(gè)模塊。TMS320C6711數字信號處理器是美國TI公司推出的TMS320C6000系列浮點(diǎn)DSP的一種,它采用256管腳的BGA封裝,3.3V的I/O電壓和1.8V的內核電壓供電方式,并具有兩級cache緩存結構和高達900MFLOPS的峰值運算能力,可廣泛應用于圖像處理等系統中。 SST39VF040是SST公司推出的FLASH存儲器,該器件十分適合用作外擴存儲器,它的存儲容量為4MB,采用3.3V單電源供電,無(wú)需額外提供高電壓即可通過(guò)一些特殊的命令字序列實(shí)現對各個(gè)子模塊的讀寫(xiě)和擦除,并且可以重復十萬(wàn)次以上,因而可通過(guò)DSP軟件編程來(lái)實(shí)現對它的讀寫(xiě)操作,十分適合于系統的調試和開(kāi)發(fā)。
2.2 硬件連接
DSP訪(fǎng)問(wèn)片外存儲器主要通過(guò)外部存儲器接口(EMIF),它不僅具有很強的接口能力,可以和各種存儲器直接接口,而且還具有很高的數據吞吐能力,最高可達1200MB/s。TMS320C6711的EMIF支持8位、16位和32位寬的所有存儲器,當從這些窄位寬的存儲空間讀寫(xiě)數據時(shí),EMIF會(huì )將多個(gè)數據打包成一個(gè)32位的值,而不必增加額外電路。TMS320C6711與SST39VF040的連接電路如圖1所示。
該電路主要通過(guò)DSP的相關(guān)輸出管腳來(lái)控制FLASH的擦除和讀寫(xiě)。其中,A0"A18為地址線(xiàn),DQ0"DQ7為數據線(xiàn),OE和WE分別為輸出使能和寫(xiě)使能,CE1為片使能。由于TMS320C6711默認的引導模式是從外部CE1空間的8位FLASH來(lái)引導裝載,所以,TMS320C6711的CE1和FLASH的片選CE相連。如果是從16位或32位FLASH引導,則只需將HD[4:3]設置成相應的值即可。
2.3 EMIF寄存器的配置
由于TMS320C6000在異步接口上更加方便,因此,用戶(hù)可以靈活地設置讀寫(xiě)周期以實(shí)現與不同速度、不同類(lèi)型的異步器件的直接接口。EMIF接口由一組存儲器映射的寄存器進(jìn)行 控制與維護,包括配置各個(gè)空間存儲器類(lèi)型和設置讀寫(xiě)時(shí)序等。和異步器件接口時(shí)需配置CE空間控制寄存器,由它來(lái)控制存儲器的讀寫(xiě)周期,本系統用到了CE1空間,故需要設置CE1空間控制寄存器的值。在設置CE1空間控制寄存器時(shí),應滿(mǎn)足以下條件:
?。?)異步讀時(shí): SETUP+STROBE≥(tacc(m)+tsu+tdmax)/tcyc SETUP+STROBE+HOLD≥(trc(m))/tcye HOLD≥(th-tdmin-toh(m)/tcye HOLD≥(th-tdmin-toh(m)/tcye
(2)異步寫(xiě)時(shí): STROBE≥(twp(m)/tcye SETUP+STROBE≥(txw(m))/tcye HOLD≥(Max(tih(m),twr(m))/tcye SETUP+STROBE+HOLD≥(twc(m))/tcye
(3)附加參數TA:TA≥(tohz(m))/tcye 以上參數可以從芯片手冊里查到,并可據此得以滿(mǎn)足上述條件的CE1值:CE1=1161C901h。
3 軟件設計
引導裝載系統主要由實(shí)現自加載功能的定制代碼和用戶(hù)程序兩部分構成,最后都存儲在外擴SST39VF040的指定地址中。其中如何寫(xiě)定制代碼是設計的重點(diǎn),它負責將中斷向量表和用戶(hù)代碼段從片外FLASH移植到其它高速存儲器中,并且將程序指針指向用戶(hù) 代碼段的起始地址。
3.1 FLASH引導過(guò)程
對于許多DSP應用 系統,常常需要從FLASH裝載程序到DSP以便使它能夠脫機運行。設置完芯片裝載方式后,FLASH引導裝載的具體過(guò)程如下: 首先將位于外部CE1空間的FLASH(即圖1中的SST39VF040)中的程序通過(guò)EDMA自動(dòng)搬入內部RAM的地址0處(參見(jiàn)圖2),實(shí)際上,盡管加載過(guò)程RAM的地址0處(參見(jiàn)圖2),實(shí)際上,盡管加載過(guò)程是在芯片復位信號被釋放后才開(kāi)始的,但是當芯片開(kāi)始復位時(shí),就開(kāi)始準備上述傳輸了。用EDMA進(jìn)行 的加載過(guò)程是一個(gè)單幀數據塊的傳輸過(guò)程,數據塊的大小為1kB,當然這1kB的數據必須包括用于實(shí)現自加載功能的定制代碼,1kB的數據傳輸完成后,CPU退出復位狀態(tài),開(kāi)始執行地址0處的自加載功能的定制代碼,同時(shí)把其它的初始化段從FLASH拷貝到相應的高速存儲器處,之后初始化C變量以換行用戶(hù)程序。
3.2 鏈接
在鏈接自加載功能的定制代碼和其它代碼時(shí),需要特別注意該程序COFF(公共目標文件格式)段的放置。因為有時(shí)候需要對某些段制定兩個(gè)不同的地址:一個(gè)導入地址,一個(gè)運行地址。導入地址用來(lái)決定裝載器把段的原始數據放在何處,而運行地址就是該段代碼運行的地方。任何對段的引用都是指它的運行地址。因此,如果給某個(gè)段指定不同的導入地址和運行地址,在程序訪(fǎng)問(wèn)該段之前,都需要把它從導入地址拷貝到運行地址處,當然這個(gè)拷貝過(guò)程有時(shí)是自動(dòng)進(jìn)行的,有時(shí)需要人工介入,即由自加載功能的定制代碼來(lái)完成。如前面提到的1kB數據拷貝就是EDMA自動(dòng)完成的。顯然,制定兩個(gè)不同地址的目的是為了加快代碼的執行速度。鏈接可由*.cmd文件來(lái)實(shí)現。代碼在鏈接在應遵循以下原則: (1)所有代碼和初始化數據都必須有一個(gè)FLASH的導入地址; (2)所有非常數數據據都有一個(gè)RAM運行 地址; (3)未初始化的數據無(wú)需獨立的導入地址; (4)從FLASH拷貝到RAM的代碼要有一個(gè)FLASH導入地址和RAM運行 地址。
3.3 寫(xiě)自加載功能的定制代碼
通常1kB的定制代碼需要包括以下三個(gè)部分:
?。?)配置EMIF寄存器。只有正確配置了EMIF的值,它才有可能訪(fǎng)問(wèn)外部存儲器FLASH和SDRAM;
?。?)拷貝初始化段。對于既有導入地址,又有運行地址的初始化段,需要把它從導入地址拷貝到它的運行地址處,處時(shí)還必須參考.map文件來(lái)確定要搬移的數據塊的大小,這些段代碼的搬移可以用匯編指令MOV來(lái)實(shí)現,也可以用TMS320C6711的EDMA來(lái)實(shí)現。由于用EDMA搬移數據要對EDMA參數進(jìn)行設置,所以通常采用MOV指令來(lái)實(shí)現;
?。?)轉向C程序的入口_c_int00,即跳轉到main()函數的入口處。
該自加載功能的代碼如下: BOOT_SIZE .equ 0x9800 ;待裝載代碼的大小 FLASH_START .equ 0x90000000 ;FLASH起始地址 BOOT_START .equ 0x0000000 ;L2 sram起始地址 EMIF_GCR .equ 0x01800000 ;EMIF全局控制寄存器的地址 EMIF_CE1 .equ 0x01800004 ;CE1空間控制寄存器的地址 EMIF_CE1-8 .equ 0x1161C901 ;CE1空間控制寄存器的值 .sect ".boot_load" .global_boot .ref_c_int00 _boot: mvkl EMIF_GCR,A4 mvkl 0x3300,B4 mvkh EMIF_GCR,A4 mvkh 0x3300,B4 stw B4,*A4 ;配置EMF全局控制寄存器 mvk1 EMIF_CE1,A4 mvk1 EMIF_CE1-8,B4 mvkh EMIF_CE1,A4 mvkh EMIF_CE1-8,B4 stw B4,*A4 ;配置CE1空間控制寄存器 mvkl BOOT_START+1024,A4 ;待搬移數據的目標地址 mvkl FLASH_START+1024,B4 ;待搬移數據的源地址 mvkh BOOT_START+1024,A4 mvkh FLASH_START+1024,B4 zer0 A1 _boot_loop1: 數據搬移 ldb *B4++,B5 mvkl BOOT_SIZE,B6 add 1,A1,A1 mvkh BOOT_SIZE,B6 ;B6為待搬移數據塊大小,可根據實(shí)際情況來(lái)修改 cmplt A1,B6,B0 nop stb B5,*A4++ [B0]b_boot_loop1 nop 5 mvk1 .S2_c_init00,B0 mvkh .S2_c_int00,B0 B .S2 B0 ;轉向C程序的入口 nop 5
3.4 FLASH編程
建立好了上述定制代碼段、用戶(hù)程序段、中斷向量表和鏈接命令文件后,便可利用TI公司的DSP集成開(kāi)發(fā)環(huán)境CCS進(jìn)行編譯、調試及鏈接,之后生成的目標文件*.out就是DSP能夠識別的COFF格式。為了使系統能夠脫機運行,需要把該目標文件的代碼寫(xiě)入FLASH中,往FLASH中寫(xiě)入目標代碼可以采用以下兩種方法:
?。?)用硬件仿真器XDS510/560通過(guò)JTAG口對FLASH進(jìn)行在線(xiàn)編程。此時(shí)需要把*.out文件數據放入緩沖存儲器,然后按照FLASH芯片手冊提供的編程格式把緩沖存儲器里的數據寫(xiě)入FLASH。 (2) 利用編程器進(jìn)行編程。由于編程器不支持*.out文件模式,不能直接寫(xiě)入FLASH中,所以必須將*.out文件轉換成編程器可讀入的*.hex格式,這可以通過(guò)CCS軟件中的轉換工具hex6x來(lái)實(shí)現,轉換時(shí)要注意hex.cmd文件的寫(xiě)法,而且整個(gè)文件轉換過(guò)程是在DOS提示符下完成的。
4 結論
利用上述方法可使系統在脫機狀態(tài)下實(shí)現引導裝載,本次實(shí)驗所用的用戶(hù)代碼段的功能是利用 DSP的多通道緩沖串口發(fā)送一個(gè)字符串給PC機的RS232口。按照前面的方法寫(xiě)好定制代碼段、用戶(hù)程序段、中斷向量表和鏈路命令文件并進(jìn)行編譯、鏈接、格式轉換以及寫(xiě)入FLASH之后,系統就可以實(shí)現脫機運行了。這樣,給DSP系統加電后,就可以通過(guò)串行口調試軟件在PC機上接收到DSP所發(fā)送的字符串以證明引導裝載成功。由于用戶(hù)代碼段也可以被其它程序代替,因此,本文設計的引導裝載系統其有一定的通用性。
評論