做DSP最應(yīng)該懂得157個(gè)問(wèn)題(3)
二十八.如何選擇DSP?
選擇DSP可以根據(jù)以下幾方面決定:
1)速度: DSP速度一般用MIPS或FLOPS表示,即百萬(wàn)次/秒鐘。根據(jù)您對(duì)處理速度的要求選擇適合的器件。一般選擇處理速度不要過(guò)高,速度高的DSP,系統(tǒng)實(shí)現(xiàn)也較困難。
2)精度: DSP芯片分為定點(diǎn)、浮點(diǎn)處理器,對(duì)于運(yùn)算精度要求很高的處理,可選擇浮點(diǎn)處理器。定點(diǎn)處理器也可完成浮點(diǎn)運(yùn)算,但精度和速度會(huì)有影響。
3)尋址空間: 不同系列DSP程序、數(shù)據(jù)、I/O空間大小不一,與普通MCU不同,DSP在一個(gè)指令周期內(nèi)能完成多個(gè)操作,所以DSP的指令效率很高,程序空間一般不會(huì)有問(wèn)題,關(guān)鍵是數(shù)據(jù)空間是否滿足。數(shù)據(jù)空間的大小可以通過(guò)DMA的幫助,借助程序空間擴(kuò)大。
4)成本: 一般定點(diǎn)DSP的成本會(huì)比浮點(diǎn)DSP的要低,速度也較快。要獲得低成本的DSP系統(tǒng),盡量用定點(diǎn)算法,用定點(diǎn)DSP。
5)實(shí)現(xiàn)方便: 浮點(diǎn)DSP的結(jié)構(gòu)實(shí)現(xiàn)DSP系統(tǒng)較容易,不用考慮尋址空間的問(wèn)題,指令對(duì)C語(yǔ)言支持的效率也較高。
6)內(nèi)部部件:根據(jù)應(yīng)用要求,選擇具有特殊部件的DSP。如:C2000適合于電機(jī)控制;OMAP適合于多媒體等。
二十九.DSP同MCU相比的特點(diǎn)?
1)DSP的速度比MCU快,主頻較高。
2)DSP適合于數(shù)據(jù)處理,數(shù)據(jù)處理的指令效率較高。
3)DSP均為16位以上的處理器,不適合于低檔的場(chǎng)合。
4)DSP可以同時(shí)處理的事件較多,系統(tǒng)級(jí)成本有可能較低。
5)DSP的靈活性較好,大多數(shù)算法都可以軟件實(shí)現(xiàn)。
6)DSP的集成度較高,可靠性較好。
三十.DSP同嵌入CPU相比的特點(diǎn)?
1)DSP是單片機(jī),構(gòu)成系統(tǒng)簡(jiǎn)單。 2)DSP的速度快。 3)DSP的成本較低。 4)DSP的性能高,可以處理較多的任務(wù)。
三十一.如何編寫C2000片內(nèi)Flash?
DSP中的Flash的編寫方法有三中:
1.通過(guò)仿真器編寫:在我們的網(wǎng)頁(yè)上有相關(guān)的軟件,在銷售仿真器時(shí)我們也提供相關(guān)軟件。其中LF240x的編寫可以在CCS中加入一個(gè)插件,F(xiàn)24x的編寫需要在windows98下的DOS窗中進(jìn)行。具體步驟見軟件中的readme。有幾點(diǎn)需要注意: a.必須為MC方式; b.F206的工作頻率必須為20MHz; c.F240需要根據(jù)PLL修改C240_CFG.I文件。建議外部時(shí)鐘為20MHz。 d.LF240x也需要根據(jù)PLL修改文件。 d.如果編寫有問(wèn)題,可以用BFLWx.BAT修復(fù)。
2.提供串口編寫:TI的網(wǎng)頁(yè)上有相關(guān)軟件。注意只能編寫一次,因?yàn)榫帉懗绦驎?huì)破壞串口通信程序。
3.在你的程序中編寫:TI的網(wǎng)頁(yè)上有相關(guān)資料。
三十二.如何編寫DSP外部的Flash? DSP的外部Flash編寫方法: 1.通過(guò)編程器編寫:將OUT文件通過(guò)HEX轉(zhuǎn)換程序轉(zhuǎn)換為編程器可以接受的格式,再由編程器編寫。 2.通過(guò)DSP軟件編寫:您需要根據(jù)Flash的說(shuō)明,編寫Flash的編寫程序,將應(yīng)用程序和編寫Flash的程序分別load到RAM中,運(yùn)行編寫程序編寫。 三十三.對(duì)于C5000,大于48K的程序如何BOOT?對(duì)于C5000,片內(nèi)的BOOT程序在上電后將數(shù)據(jù)區(qū)的內(nèi)容,搬移到程序區(qū)的RAM中,因此FLASH必須在RESET后放在數(shù)據(jù)區(qū)。由于C5000,數(shù)據(jù)區(qū)的空間有限,一次BOOT的程序不能對(duì)于48K。解決的方法如下: 1.在RESET后,將FLASH譯碼在數(shù)據(jù)區(qū),RAM放在程序區(qū),片內(nèi)BOOT程序?qū)⒊绦駼OOT到RAM中。 2.用戶初試化程序發(fā)出一個(gè)I/O命令(如XF),將FLASH譯碼到程序區(qū)的高地址。開放數(shù)據(jù)區(qū)用于其它的RAM。 3.用戶初試化程序中包括第二次BOOT程序(此程序必須用戶自己編寫),將FLASH中沒(méi)有BOOT的其它代碼搬移到RAM中。 4.開始運(yùn)行用戶處理程序。 三十四.DSP外接存儲(chǔ)器的控制方式對(duì)于一般的存儲(chǔ)器具有RD、WR和CS等控制信號(hào),許多DSP(C3x、C5000)都沒(méi)有控制信號(hào)直接連接存儲(chǔ)器,一般采用的方式如下: 1.CS有地址線和PS、DS或STRB譯碼產(chǎn)生; 2./RD=/STRB+/R/W; 3./WR=/STRB+R/W。
三十三.對(duì)于C5000,大于48K的程序如何BOOT?
對(duì)于C5000,片內(nèi)的BOOT程序在上電后將數(shù)據(jù)區(qū)的內(nèi)容,搬移到程序區(qū)的RAM中,因此FLASH必須在RESET后放在數(shù)據(jù)區(qū)。由于C5000,數(shù)據(jù)區(qū)的空間有限,一次BOOT的程序不能對(duì)于48K。解決的方法如下:
1.在RESET后,將FLASH譯碼在數(shù)據(jù)區(qū),RAM放在程序區(qū),片內(nèi)BOOT程序?qū)⒊绦駼OOT到RAM中。
2.用戶初試化程序發(fā)出一個(gè)I/O命令(如XF),將FLASH譯碼到程序區(qū)的高地址。開放數(shù)據(jù)區(qū)用于其它的RAM。
3.用戶初試化程序中包括第二次BOOT程序(此程序必須用戶自己編寫),將FLASH中沒(méi)有BOOT的其它代碼搬移到RAM中。
4.開始運(yùn)行用戶處理程序。
三十四.DSP外接存儲(chǔ)器的控制方式
對(duì)于一般的存儲(chǔ)器具有RD、WR和CS等控制信號(hào),許多DSP(C3x、C5000)都沒(méi)有控制信號(hào)直接連接存儲(chǔ)器,一般采用的方式如下:
1.CS有地址線和PS、DS或STRB譯碼產(chǎn)生;
2./RD=/STRB+/R/W; 3./WR=/STRB+R/W。
三十五.GEL文件的功能?
GEL文件的功能同emuinit.cmd的功能基本相同,用于初始化DSP。但它的功能比emuinit的功能有所增強(qiáng),GEL在CCS下有一個(gè)菜單,可以根據(jù)DSP的對(duì)象不同,設(shè)置不同的初始化程序。以TMS320LF2407為例:
#define SCSR1 0x7018 ;定義scsr1寄存器
#define SCSR2 0X7019 ;定義scsr2寄存器
#define WDKEY 0x7025 ;定義wdkey寄存器
#define WDNTR 0x7029 ;定義wdntr寄存器
StartUp() ; 開始函數(shù)
{
GEL_MapReset(); ; 存儲(chǔ)空間復(fù)位 GEL_MapAdd(0x0000,0,0x7fff,1,1); 定義程序空間從0000-7fff 可讀寫
GEL_MapAdd(0x8000,0,0x7000,1,1); 定義程序空間從8000-f000 可讀寫
GEL_MapAdd(0x0000,1,0x10000,1,1); 定義數(shù)據(jù)空間從0000-10000可讀寫
GEL_MapAdd(0xffff,2,1,1,1); 定義i/o 空間0xffff可讀寫
GEL_MapOn(); 存儲(chǔ)空間打開
GEL_MemoryFill(0xffff,2,1,0x40); 在i/o空間添入數(shù)值40h
*(int *)SCSR1=0x0200; 給scsr1寄存器賦值
*(int *)SCSR2=0x000C; 給scsr2寄存器賦值,在這里可以進(jìn)行mp/mc方式的轉(zhuǎn)換
*(int *)WDNTR=0x006f; 給wdntr寄存器賦值
*(int *)WDKEY=0x055; 給wdkey寄存器賦值
*(int *)WDKEY=0x0AA; 給wdkey寄存器賦值
}
三十六.使用TI公司模擬器件與DSP結(jié)合使用的好處。
1)在使用TI公司的DSP的同時(shí),使用TI公司的模擬可以和DSP進(jìn)行無(wú)縫連接。器件與器件之間不需要任何的連接或轉(zhuǎn)接器件。這樣即減少了板卡的尺寸,也降低了開發(fā)難度。
2)同為TI公司的產(chǎn)品,很多器件可以固定搭配使用。少了器件選型的煩惱
3)TI在CCS中提供插件,可以用于DSP和模擬器件的開發(fā),非常方便。
三十七.C語(yǔ)言中可以嵌套匯編語(yǔ)言?
可以。在ANSI C標(biāo)準(zhǔn)中的標(biāo)準(zhǔn)用法就是用C語(yǔ)言編寫主程序,用匯編語(yǔ)言編寫子程序,中斷服務(wù)程序,一些算法,然后用C語(yǔ)言調(diào)用這些匯編程序,這樣效率會(huì)相對(duì)比較高
三十八.在定點(diǎn)DSP系統(tǒng)中可否實(shí)現(xiàn)浮點(diǎn)運(yùn)算?
當(dāng)然可以,因?yàn)镈SP都可以用C,只要是可以使用c語(yǔ)言的場(chǎng)合都可以實(shí)現(xiàn)浮點(diǎn)運(yùn)算。
三十九.JTAG頭的使用會(huì)遇到哪些情況?
1)DSP的CLKOUT沒(méi)有輸出,工作不正常。
2)Emu0,Emu1需要上拉。
3)TCK的頻率應(yīng)該為10M。
4)在3.3V DSP中,PD腳為3.3V 供電,但是仿真器上需要5V電壓供電,所以PP仿真器盒上需要單獨(dú)供電。
4)仿真多片DSP。在使用菊花鏈的時(shí)候,第一片DSP的TDO接到第二片DSP的TDI即可。注意當(dāng)串聯(lián)DSP比較多的時(shí)候,信號(hào)線要適當(dāng)?shù)脑黾域?qū)動(dòng)。
四十.include頭文件(.h)的主要作用
頭文件,一般用于定義程序中的函數(shù)、參數(shù)、變量和一些宏單元,同庫(kù)函數(shù)配合使用。因此,在使用庫(kù)時(shí),必須用相應(yīng)的頭文件說(shuō)明。
四十一.DSP中斷向量的位置 1)2000系列dsp的中斷向量只能從0000H處開始。所以在我們調(diào)試程序的時(shí)候,要把DSP選擇為MP(微處理器方式),把片內(nèi)的Flash屏蔽掉,免去每次更改程序都要重新燒寫Flash工作。 2)3x系列dsp的中斷向量也只能在固定的地址。 3)5000,6000系列dsp的中斷向量可以重新定位。但是它只能被重新定位到Page0范圍內(nèi)的任何空間。 四十二.有源晶振與晶體的區(qū)別,應(yīng)用范圍及用法 1)晶體需要用DSP片內(nèi)的振蕩器,在datasheet上有建議的連接方法。晶體沒(méi)有電壓的問(wèn)題,可以適應(yīng)于任何DSP,建議用晶體。 2)有源晶振不需要DSP的內(nèi)部振蕩器,信號(hào)比較穩(wěn)定。有源晶振用法:一腳懸空,二腳接地,三腳接輸出,四腳接電壓。 四十三.程序經(jīng)常跑飛的原因 1)程序沒(méi)有結(jié)尾或不是循環(huán)的程序。 2)nmi管腳沒(méi)有上拉。 3)在看門狗動(dòng)作的時(shí)候程序會(huì)經(jīng)常跑飛。 4)程序編制不當(dāng)也會(huì)引起程序跑飛。 5)硬件系統(tǒng)有問(wèn)題。
四十二.有源晶振與晶體的區(qū)別,應(yīng)用范圍及用法
1)晶體需要用DSP片內(nèi)的振蕩器,在datasheet上有建議的連接方法。晶體沒(méi)有電壓的問(wèn)題,可以適應(yīng)于任何DSP,建議用晶體。
2)有源晶振不需要DSP的內(nèi)部振蕩器,信號(hào)比較穩(wěn)定。有源晶振用法:一腳懸空,二腳接地,三腳接輸出,四腳接電壓。
四十三.程序經(jīng)常跑飛的原因
1)程序沒(méi)有結(jié)尾或不是循環(huán)的程序。
2)nmi管腳沒(méi)有上拉。
3)在看門狗動(dòng)作的時(shí)候程序會(huì)經(jīng)常跑飛。
4)程序編制不當(dāng)也會(huì)引起程序跑飛。
5)硬件系統(tǒng)有問(wèn)題。
四十四.并行FLASH引導(dǎo)的一點(diǎn)經(jīng)驗(yàn)
最近BBS上關(guān)于FLASH和BOOT的討論很活躍,我也多次來(lái)此請(qǐng)教。前幾天自制的DSP板引導(dǎo)成功,早就打算寫寫這方面的東西。我用的DSP是5416,以其為核心,做了一個(gè)相對(duì)獨(dú)立的子系統(tǒng)(硬件、軟件、算法),目前都已基本做好。 下面把在FLASH引導(dǎo)方面做的工作向大家匯報(bào)一下,希望能對(duì)大家有所幫助。本人經(jīng)驗(yàn)和文筆都有限,寫的不好請(qǐng)大家諒解。
硬件環(huán)境:
DSP:TMS320VC5416PGE160
FLASH:SST39VF400A-70-4C-EK 都是貼片的,F(xiàn)LASH映射在DSP數(shù)據(jù)空間的0x8000-0xFFFF
軟件環(huán)境: CCS v2.12.01
主程序(要燒入FLASH的程序): DEBUG版,程序占用空間0x28000-0x2FFFF(片內(nèi)SARAM),中斷向量表在0x0080-0x00FF(片內(nèi)DARAM),數(shù)據(jù)空間使用0x0100-0x7FFF(片內(nèi)DARAM)。 因?yàn)镕LASH是貼片的,所以需要自己編一個(gè)數(shù)據(jù)搬移程序,把要主程序搬移到FLASH中。在寫入FLASH數(shù)據(jù)時(shí),還應(yīng)寫入引導(dǎo)表的格式數(shù)據(jù)。最后在數(shù)據(jù)空間的0xFFFF處寫入引導(dǎo)表的起始地址(這里為0x8000)。
搬移程序: DEBUG版,程序空間0x38000-0x3FFFF(片內(nèi)SARAM),中斷向量表在0x7800-0x78FF(片內(nèi)DARAM),數(shù)據(jù)空間使用0x5000-0x77FF(片內(nèi)DARAM)。 搬移程序不能使用與主程序的程序空間和中斷向量表重合的物理空間,以免覆蓋。 燒寫時(shí),同時(shí)打開主程序和搬移程序的PROJECT,先LOAD主程序,再LOAD搬移程序,然后執(zhí)行搬移程序,燒寫OK! 附:搬移程序(僅供參考)
volatile unsigned int *pTemp=(unsigned int *)0x7e00; unsigned int iFlashAddr;
int iLoop; /* 在引導(dǎo)表頭存放并行引導(dǎo)關(guān)鍵字 */
iFlashAddr=0x8000;
WriteFlash(iFlashAddr,0x10aa);
iFlashAddr++; /* 初始化SWWSR值 */
WriteFlash(iFlashAddr,0x7e00);
iFlashAddr++; /* 初始化BSCR值 */
WriteFlash(iFlashAddr,0x8006);
iFlashAddr++; /* 程序執(zhí)行的入口地址 */
WriteFlash(iFlashAddr,0x0002);
iFlashAddr++;
WriteFlash(iFlashAddr,0x8085);
iFlashAddr++; /* 程序長(zhǎng)度 */
WriteFlash(iFlashAddr,0x7f00);
iFlashAddr++; /* 程序要裝載到的地址 */
WriteFlash(iFlashAddr,0x0002);
iFlashAddr++;
WriteFlash(iFlashAddr,0x8000);
iFlashAddr++;
for (iLoop=0;iLoop<0x7f00;iLoop++)
{ /* 從程序空間讀數(shù)據(jù),放到暫存單元 */
asm(" pshm al");
asm(" pshm ah");
asm(" rsbx cpl");
asm(" ld #00fch,dp");
asm(" stm #0000h, ah");
asm(" MVDM _iLoop, al");
asm(" add #2800h,4,a");
asm(" reada 0h");
asm(" popm ah");
asm(" popm al");
asm(" ssbx cpl"); /* 把暫存單元內(nèi)容寫入FLASH */
WriteFlash(iFlashAddr,*pTemp);
iFlashAddr++; } /* 中斷向量表長(zhǎng)度 */
WriteFlash(iFlashAddr,0x0080);
iFlashAddr++; /* 中斷向量表裝載地址 */
WriteFlash(iFlashAddr,0x0000);
iFlashAddr++;
WriteFlash(iFlashAddr,0x0080);
iFlashAddr++;
for (iLoop=0;iLoop<0x0080;iLoop++) { /* 從程序空間讀數(shù)據(jù),放到暫存單元 */
asm(" pshm al");
asm(" pshm ah");
asm(" rsbx cpl");
asm(" ld #00fch,dp");
asm(" stm #0000h, ah");
asm(" MVDM _iLoop, al");
asm(" add #0080h,0,a");
asm(" reada 0h");
asm(" popm ah");
asm(" popm al");
asm(" ssbx cpl"); /* 把暫存單元內(nèi)容寫入FLASH */
WriteFlash(iFlashAddr,*pTemp);
iFlashAddr++;
} /* 寫入引導(dǎo)表結(jié)束標(biāo)志 */
WriteFlash(iFlashAddr,0x0000);
iFlashAddr++;
WriteFlash(iFlashAddr,0x0000); /* 在數(shù)據(jù)空間的0xFFFF寫入引導(dǎo)表起始地址 */
iFlashAddr=0xffff;
WriteFlash(iFlashAddr,0x8000);
存儲(chǔ)器相關(guān)文章:存儲(chǔ)器原理
晶振相關(guān)文章:晶振原理
評(píng)論