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