<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > TMS320VC5416并行自舉的巧妙實(shí)現

TMS320VC5416并行自舉的巧妙實(shí)現

作者: 時(shí)間:2007-03-09 來(lái)源:網(wǎng)絡(luò ) 收藏
摘要:提出了一種巧妙實(shí)現并行自舉的方法,即采用“兩次下載法”,利用自身對FLASH編程,以實(shí)現的并行自舉。這種在系統編程的DSP自舉實(shí)現方式無(wú)需文件轉換,簡(jiǎn)單靈活。以TI公司的TMS320VC5416和閃爍存儲器SST39VF200為例,介紹了該方法的具體實(shí)現過(guò)程。 關(guān)鍵詞:DSP TMS320VC5416 FLASH SST39VF200 并行自舉 隨著(zhù)信息技術(shù)的飛速發(fā)展,器(DSP)得到了廣泛的應用?,F今的高速DSP內存不再基于FLASH結構,而是采用存取速度更快的RAM結構。DSP掉電后其內部RAM中的程序和數據將全部丟失,所以在脫離仿真器的環(huán)境中,DSP芯片每次上電后必須自舉,將外部存儲區的執行代碼通過(guò)某種方式搬移到內部存儲區,并自動(dòng)執行。目前應用非常廣泛的是TI公司的5000系列DSP,常用的自舉方式有并行自舉、串行自舉、主機接口(HPI)自舉和I/O自舉。HPI自舉需要有一個(gè)主機(如單片機)進(jìn)行干預,雖然可以通過(guò)這個(gè)主機對DSP內部工作情況進(jìn)行監控,但電路復雜、成本高;串口自舉代碼加載速度慢;I/O自舉僅占用一個(gè)端口地址,代碼加哉速度快,但一般的外部存儲器都需要接口芯片來(lái)滿(mǎn)足DSP的自舉時(shí)序,故電路復雜,成本高;并行自舉加載速度快,雖然需要占用DSP數據區的部分地址,但無(wú)需增加其它接口芯片,電路簡(jiǎn)單。因此在TI公司的5000系列DSP中,并行自舉得到了廣泛的應用。 將可執行代碼燒錄到外部存儲器,傳統的做法是通過(guò)編程器完成。先利用CCS軟件中的hex500.exe文件將要寫(xiě)入的*.out文件轉換成編程器能夠識別的*.hex文件格式,再用編程器將轉換后的*.hex文件燒錄到外部EEROM中。然后,隨著(zhù)芯片制造工藝的不斷提高,芯片集成度越來(lái)越高,存儲器正向小型化、貼片式的方向發(fā)展,很多貼片封裝的存儲器很難用編程器編程,更不可能頻繁插拔。與傳統的EEROM相比,FLASH存儲器具有支持在線(xiàn)擦寫(xiě)且擦寫(xiě)次數多、速度快、功耗低、容量大、價(jià)格低廉等優(yōu)點(diǎn)。目前在很多FLASH芯片采用3.3V單電源供電,與DSP連接時(shí)無(wú)需采用電平轉換芯片,因此電路連接簡(jiǎn)單。在系統編程,利用系統本身的DSP直接對外掛的FLASH存儲器編程,節省了編程器的費用和開(kāi)發(fā)時(shí)間、使得DSP執行代碼可以在線(xiàn)更新。 這里,在可執行代碼的FLASH燒錄方面,不再采用hex500.exe文件對*.out文件進(jìn)行轉換,而是妙巧妙地采用“兩次下載法”,利用DSP對FLASH的寫(xiě)操作將可執行代碼直接寫(xiě)到外掛FLASH中去。 本文以一片TMS320VC5416外掛一片SST69VF200 FLASH存儲器為例,介紹如何通過(guò)DSP對FLASH在系統編程,以實(shí)現DSP并行自舉的具體方法,并給出了DSP的C程序部分源碼。1 DSP和FLASH構成的自舉系統 DSP在自舉過(guò)程中,是將外部的存儲區當作數據存儲區來(lái)訪(fǎng)問(wèn)的。因此在設計時(shí),雖然FLASH內部存儲的是代碼,但對于DSP而言依然是數據。由于TMS320VC5416的數據總線(xiàn)是16位的,所以選用16位總線(xiàn)接口的FLASH存儲器。數據區中的0x0000~0x7FFF對應為DSP內存的RAM區,所以DSP要對外部的FLASH操作只能訪(fǎng)問(wèn)0x8000~0xFFF的32K字存儲區。 DSP自舉系統的基本連接如圖1所示。自舉系統中的選用的FLASH為SST公司的SS39VF200,該FLASH存儲器為128K字容量,16位總線(xiàn)接口。為了簡(jiǎn)化起見(jiàn),圖中沒(méi)有對FLASH進(jìn)行分頁(yè)處理,僅僅是把它當成外部數據存儲區來(lái)處理。由于SS39VF200的讀信號OE和寫(xiě)信號WE是分開(kāi)的,且寫(xiě)信號的優(yōu)先級高于讀信號,而DSP的讀寫(xiě)共用一個(gè)引腳,所以將DSP的讀寫(xiě)信號與FLASH的寫(xiě)信號相連接,而將其讀信號OE直接接地,FLASH的片選信號CE直接與DSP的數據區選擇信號OE相連接,這表明將FLASH作為DSP的數據存儲區進(jìn)行訪(fǎng)問(wèn)。如上所述,DSP只能訪(fǎng)問(wèn)外部數據區的0x8000~0xFFF區域的數據,因此對于39VF200而言,可以將最高位地址A16直接接地。對于上述電路連接方法,39VF200存儲器從0x0000開(kāi)始的32K的空間是無(wú)法訪(fǎng)問(wèn)的。 2 TMS320VC5416對SST39VF200的在系統編程 2.1 SS39VF200芯片介紹 SST39VF200的操作不像一般的RAM和ROM,除了讀數據的過(guò)程一樣外,其它的操作都不相同,必須按照一定的順序來(lái)執行。 2.2 TMS320VC5416對SST39VF200的編程操作 通常,在對FLASH進(jìn)行編程之前,必須將FLASH中待寫(xiě)的區域進(jìn)行擦除,然后才能進(jìn)行編程操作。需要注意的是,每次對FLASH發(fā)出操作命令后,必須等到FLASH完成本次操作才能發(fā)送下一個(gè)操作命令。判斷FLASH執行命令完畢的方式有兩種,一是利用數據位D7判斷,如果FLASH尚未完成操作,則讀該位總是為低,完成操作后該位變成高;二是利用數據位D6判斷,如果FLASH尚未完成操作,則相鄰兩次讀到的D6位的值不同。當兩次讀到的D6位的值都是一樣的,表明FLASH完成了本次操作。 下面以數據位D6判斷操作完成與否,說(shuō)明TMS320VC5416對SST39VF200寫(xiě)操作的具體過(guò)程,其它操作過(guò)程與該過(guò)程基本相同。 Void Word_Program(uint * Ad,uint DQ) //Ad為編程地址,DQ為編程數據 { uint *Ad_Temp,Temp1,Temp2; //定義臨時(shí)地址指針和數據變量 Ad_Temp=(uint *)(0x55555); //第一個(gè)寫(xiě)周期 *Ad_Temp=0x5555; //給地址0x5555,寫(xiě)數據0x00AA Ad_Temp=(uint *)(0x2AAA); //第二個(gè)寫(xiě)周期 *Ad_Temp=0x0055; //給地址0x2AAA,寫(xiě)數據0x0055 Ad_Temp=(uint *)(0x5555); //第三個(gè)寫(xiě)周期 *Ad_Temp=0x00A0; //給地址0x5555寫(xiě)數據0x00A0 *Ad=DQ; //給編程地址寫(xiě)編程數據 Again;Temp1=*Ad %26;amp; 0x0040; //兩次讀D6(Toggle Bit) Temp2=*Ad %26;amp; 0x0040; If(Temp1!=Temp2) //判斷是否命令執行結束,否則繼續讀Toggle Bit goto Again; }圖23 TMS320VC5416的并行自舉 通過(guò)在系統編程可以實(shí)現將執行代碼寫(xiě)入FLASH。如果確定FLASH中用戶(hù)程序代碼的存儲格式并正確自舉以實(shí)現脫機運行是整個(gè)在系統編程的重點(diǎn)。 3.1 自舉表 在介紹DSP并行自舉過(guò)程之前,必須對DSP的自舉表加以說(shuō)明。必須對DSP的自舉表加以說(shuō)明。自舉表需按照TI公司規定的格式來(lái)創(chuàng )建。該表中存放在DSP初始化時(shí)要用到的特殊寄存器如SWWSR、BSCR等的值、程序入口地址、各段的目標首地址和長(cháng)度以及要執行的代碼。 3.2 并知自舉過(guò)程 完整的并行自舉的流程圖如圖2所示。 SST39VF200 FLASH存儲器是16位的,所以實(shí)際采用的是16位并行自舉,DSP內部的引導程序從數據空間地址0xFFFF讀取自舉表首地址,最后從自舉表中將可執行代碼搬移到DSP對應的RAM中。 3.3 "兩次下載法"實(shí)現并行自舉 如何按照規定的自舉表格式將表中的各項內容寫(xiě)入到外掛的FLASH中去?普通的做法是利用hex200.exe文件將*.out文件轉換后*.hex格式,然后讀取*.hex文件,將其寫(xiě)入FLASH。這里采用一種更簡(jiǎn)便的“兩次下載法”將自舉表寫(xiě)入FLASH,整個(gè)過(guò)程無(wú)需文件轉換和文件讀取,并且完成此過(guò)程的代碼很小,幾乎不占用DSP內部的存儲空間。 所謂的“兩次下載法”就是通過(guò)仿真器對DSP進(jìn)行兩次加載來(lái)完成自舉表的建立。第一次加載用戶(hù)希望自舉的可執行代碼,稱(chēng)為代碼1,加載完后不運行此代碼;緊接著(zhù)加載建立自舉表的代碼,稱(chēng)為代碼2。代碼1是DSP脫機運行時(shí)的代碼,代碼2僅僅是把代碼1按照自舉表的格式寫(xiě)入到外部FLASH中的代碼。需要注意的是,代碼1和代碼2在分配程序存儲空間時(shí)不可以重疊,而且代碼2的數據空間必須包含代碼1和外部FLASH共同占用的空間,因為它要把代碼1按訪(fǎng)問(wèn)數據的方法寫(xiě)到外部FLASH中。由于下載完代碼1后并沒(méi)有運行,而是緊接著(zhù)下載代碼2,兩者的程序存儲區又不重疊,因此下載完碼2后,先前下載的代碼1仍舊在DSP中,只是被代碼2看成數據而已?!皟纱蜗螺d法”的具體操作步驟如下: (1)將DSP的MP/MC引腳置高,讓DSP工作在微處理器方式。 (2)將代碼1通過(guò)仿真器下載到DSP中,但不運行該代碼。 (3)將代碼2通過(guò)仿真器下載到DSP中,運行此代碼。 (4)代碼2運行結束后,去掉仿真器,并將MP/MC引腳置低,讓DSP工作在微型計算機方式。 (5)復位DSP,觀(guān)察程序運行的結果是否正常。 “兩次下載法”中兩次代碼的存儲區分配情況如圖3所示。圖中,代碼1中的數據段起始地址為0xA,數據段結束地址這0xB,代碼段起始地址為0xC,代碼段結束地址為0xD,其中0xB和0xC可以是同一地址,也可是不同地址;代碼2中的數據段起始地址為0xG,數據段結束地址為0xFFFF,代碼段起始地址為0xE,代碼段結束地址為0xF,其中0xF和0xG可以是同一地址,也可以是不同地址。對TMS320VC5416而言,因其0x0000~0x7FFF對應的是內部的32K字空間,所以?xún)蓚€(gè)表中的地址大小關(guān)系為0xG<0xC<0xD<0x8000。 基于上述思想,假設代碼1的程序段為0x4000~0x7FFF,數據段為0x3000~0x3FFF,代碼2的程序段為0x2000~0x2FFF,數據段為0x3000~0xFF7F(需要注意的是,代碼2的數據段必須包含代碼1的代碼段和FLASH所占據的地址空間,代碼2的代碼段絕對不能與代碼1的代碼段有重疊),外部FLASH占據的地址空間為0x8000~0xFF7F,自舉表的首地址從0x8000開(kāi)始,并且SWWSR和BSCR的值分別為0x0E38和0x8806,程序入口地址為0x004089,代碼1長(cháng)度為16K字,代碼1的存放起始地址為0x004000,那么代碼2在FLASH中建立自舉表的程序如下: UINT I; //定義臨時(shí)變量 UINT *Addr1,*Addr2; //定義臨時(shí)地址指針變量 Addr1=(uint *)0xffff; Word_Program(Addr1,0x8000); //在數據空間0xffff地址寫(xiě)自舉表起始地址0x8000 Addr1=(uint *)0x8000; //自舉表首地址 Word_Program(Addr1,0x10AA); //自舉總線(xiàn)寬度為16位,即第一個(gè)字為0x10AA Addr1++; //累為地址 Word_Program(Addr1,0x0E38); //SWWSR的值 Addr1++; //累加地址 Word_Program(Addr1,0x8806); //BRSC的值 Addr1++; //累加地址 Word_Program(Addr1,0); //程序入口地址XPC為0 Addr1++; //累加地址 Word_Program(Addr1,0x4089); //程序入口地址PC為0x4089 Addr1++; //累加地址 Word_Program(Addr1,0x4000); //代碼長(cháng)度為0x4000 Addr1++; //累加地址 Word_Program(Addr1,0); //目標程序入口地址XPC為0 Addr1++; Word_Program(Addr1,0x4000); //目標程序入口地址PC為0x4000 Addr1+; //累加地址 Addr2=(uint *)0x4000 //代碼1起始地址 for(I=0;I<0x4000;I++) //寫(xiě)代碼1到FLASH,長(cháng)度為16K字 Word_Program(Addr1++,*(Addr1++)); Word_Program(Addr1,0x0000); //自舉表結尾的一個(gè)字寫(xiě)入0x0000,自舉表建立結束 代碼2除了上面的自舉表的建立外還包括FLASH的擦除和自舉表數據的校驗。需要注意的是,在對FLASH進(jìn)行寫(xiě)操作之前,必須對其進(jìn)行擦除,擦除部分的程序可參考前面的Word_Program()子函數。 這樣,通過(guò)簡(jiǎn)單的“兩次下載法”,利用代碼2將要脫機運行的代碼1以自舉表的格式寫(xiě)到FLASH存儲器中,校驗正確后DSP即可脫機工作了。 采用“兩次下載法”利用DSP自身對FLASH進(jìn)行編程,可實(shí)現DSP的并行自舉。這種在系統編程的DSP自舉實(shí)現方式簡(jiǎn)單靈活。文中給出的硬件電路僅適用于程序代碼小于32K字的系統中。在一般DSP系統中,都會(huì )有FPGA等可編程器件,利用它們可以靈活地對FLASH進(jìn)行分頁(yè)操作。這樣,在程序量超過(guò)32K字的情況下,此方法也適用。

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>