《DSP器件及應(yīng)用》課件第7章_第1頁(yè)
《DSP器件及應(yīng)用》課件第7章_第2頁(yè)
《DSP器件及應(yīng)用》課件第7章_第3頁(yè)
《DSP器件及應(yīng)用》課件第7章_第4頁(yè)
《DSP器件及應(yīng)用》課件第7章_第5頁(yè)
已閱讀5頁(yè),還剩355頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第7章DSP應(yīng)用系統(tǒng)軟件設(shè)計(jì)7.1程序設(shè)計(jì)基本要素7.2主要DSP硬件模塊編程舉例7.3應(yīng)用系統(tǒng)軟件設(shè)計(jì)舉例7.4一般DSP應(yīng)用系統(tǒng)軟件設(shè)計(jì)考慮7.5小結(jié)

7.1程序設(shè)計(jì)基本要素

DSP?是一種高性能的特殊單片機(jī),它的程序設(shè)計(jì)和單片機(jī)有一些相似之處,那就是程序代碼自身必須具有完整系統(tǒng)的特性,這個(gè)完整系統(tǒng)不是要求具備全面的功能,而是要求具備完成某個(gè)(或某些)功能的完備程序結(jié)構(gòu)。

對(duì)于一個(gè)常見(jiàn)系統(tǒng)的軟件設(shè)計(jì),必須掌握的程序的基本要素包括:常用指令和偽指令組成的匯編代碼,用于接口、實(shí)時(shí)信號(hào)處理和控制;C語(yǔ)言代碼及庫(kù)函數(shù),用于軟件接口、人機(jī)接口和數(shù)值計(jì)算;鏈接控制命令文件,用于執(zhí)行代碼的生成。這三者組成了程序的基本結(jié)構(gòu)——工程項(xiàng)目。匯編語(yǔ)言的“庫(kù)”仍是一些匯編范疇的文件,不具備常見(jiàn)庫(kù)的特征,不能算是真正的庫(kù)。

而程序設(shè)計(jì)中,需要一些像旋轉(zhuǎn)因子、濾波系數(shù)等的常數(shù)數(shù)據(jù)段,因此,如何用?Matlab生成系數(shù),直至程序調(diào)用文件的方法,在舉例中也得到了體現(xiàn)。7.1.1常用偽指令

1.段定義偽指令

段定義偽指令(DirectivesThatDefineSections)將定義程序中的一些段,包括數(shù)據(jù)段和代碼段,這些段可能是既定內(nèi)容,也可能是預(yù)留空間。段定義是為了方便地將它們安排到程序空間或數(shù)據(jù)空間。這個(gè)安排由cmd文件指定,在鏈接時(shí)完成。注意,數(shù)據(jù)段可安排到程序空間,特別是程序執(zhí)行運(yùn)算中要用到的系數(shù)或常數(shù)。段定義偽指令的符號(hào)及功能詳見(jiàn)表7.1。

2.初始化常數(shù)偽指令

初始化常數(shù)偽指令(DirectivesThatInitializeConstants(DataandMemory))用來(lái)定義一些常數(shù),這些常數(shù)可以根據(jù)需要按照不同的格式表示,如整數(shù)、浮點(diǎn)數(shù)、字符串等。由于TMS320'C2000為定點(diǎn)運(yùn)算,因此非定點(diǎn)數(shù)在匯編程序中要用程序處理后才能使用。初始化常數(shù)偽指令的符號(hào)及功能詳見(jiàn)表7.2。

3.安置段程序計(jì)數(shù)器偽指令

安置段程序計(jì)數(shù)器偽指令(DirectivesThatAligntheSectionProgramCounter)用來(lái)設(shè)置段邊界位置,這種設(shè)置對(duì)像FFT那樣的算法是很必要的,因?yàn)槲环崔D(zhuǎn)尋址中地址的運(yùn)算要以長(zhǎng)度N/2為基礎(chǔ),N為FFT點(diǎn)數(shù)。如果沒(méi)有這種功能,cmd中的資源設(shè)置及配置要繁雜些。安置段程序計(jì)數(shù)器偽指令的符號(hào)和功能詳見(jiàn)表7.3。

4.設(shè)置列表輸出格式偽指令

設(shè)置列表輸出格式偽指令(DirectivesThatFormattheOutputListing)用來(lái)控制源程序的打印格式,目的是為了保證打印文件的可讀性和美觀(guān)性。設(shè)置列表輸出格式偽指令的符號(hào)及功能詳見(jiàn)表7.4。

5.調(diào)用說(shuō)明偽指令

調(diào)用說(shuō)明偽指令(DirectivesThatReferenceOtherFiles)用來(lái)聲明模塊可以被調(diào)用,?或說(shuō)明要調(diào)用的模塊,以便讓匯編器和鏈接器正常地工作。調(diào)用說(shuō)明偽指令的符號(hào)及功能詳見(jiàn)表7.5。

6.條件匯編偽指令

條件匯編偽指令(ConditionalAssemblyDirectives)主要是考慮到代碼的重用性,根據(jù)不同的條件,將相應(yīng)的源代碼匯編成目標(biāo)代碼,這樣既解決了源代碼的多功能性問(wèn)題,又解決了目標(biāo)代碼要求的高效唯一性問(wèn)題。使用條件匯編需要一定的編程經(jīng)驗(yàn)和熟練程度。條件匯編偽指令的符號(hào)及功能詳見(jiàn)表7.6。

7.匯編時(shí)符

匯編時(shí)符(Assembly-TimeSymbols)是為了編程方便使用的一種中間助記符號(hào),將數(shù)據(jù)或符號(hào)用一種具有意義的字符串表達(dá),便于記憶和編程。匯編完成后,這些符號(hào)將被還原成數(shù)據(jù)或程序代碼,鏈接中已再找不到,因此得名。它和標(biāo)號(hào)、段名等不一樣,標(biāo)號(hào)、段名等鏈接后仍可找到蹤影,并為符號(hào)調(diào)試帶來(lái)便利。匯編時(shí)符的符號(hào)及功能詳見(jiàn)表7.7。

8.有關(guān)宏的偽指令

從源程序上看,宏匯編和子程序調(diào)用有著類(lèi)似的地方,但二者存在根本的區(qū)別。調(diào)用子程序?qū)嶋H上是將程序指針PC轉(zhuǎn)移到子程序所在的位置去執(zhí)行,因而有保存斷點(diǎn)的過(guò)程;宏調(diào)用則是復(fù)制一段代碼,由匯編器而不是DSP本身完成調(diào)用過(guò)程。使用宏,一是為了簡(jiǎn)化編程,二是為了程序具有更好的可讀性,三是為了保證程序的執(zhí)行速度。有關(guān)宏的偽指令(MiscellaneousDirectives)的符號(hào)及功能詳見(jiàn)表7.8。下面以“求兩數(shù)的最小值并將結(jié)果放在ACCL中”為例說(shuō)明如何定義和調(diào)用宏以及宏中的標(biāo)號(hào)如何處理,詳見(jiàn)表7.9。

這里,xadr為直接地址。宏定義方法1使用帶“?”號(hào)的標(biāo)號(hào)是為了在多次調(diào)用宏時(shí)不至于出現(xiàn)標(biāo)號(hào)重復(fù)的錯(cuò)誤,而宏定義方法2使用宏內(nèi)局部標(biāo)號(hào)來(lái)保證在多次調(diào)用宏時(shí)不至于出現(xiàn)標(biāo)號(hào)重復(fù)的錯(cuò)誤。這兩種用法都是標(biāo)準(zhǔn)的。

9.其它偽指令

其它偽指令包括程序必須用到的像程序結(jié)束“.end”和存儲(chǔ)器映射寄存器符號(hào)說(shuō)明“.mmregs”等,詳見(jiàn)表7.10。

10.宏匯編語(yǔ)言源程序的建立

編制匯編語(yǔ)言源程序,除要了解DSP相應(yīng)指令集和偽指令外,還應(yīng)該掌握一定的編程方法和樹(shù)立良好的編程風(fēng)格。模塊化、結(jié)構(gòu)化的編程風(fēng)格往往會(huì)起到事半功倍的效果,這實(shí)際上是讓代碼模塊具有可重用性。

一般,將常用的變量、符號(hào)、數(shù)據(jù)段等設(shè)計(jì)成公用部件,同時(shí)將常用算法、控制過(guò)程等設(shè)計(jì)成宏或子程序模塊,這樣以后遇到類(lèi)似情況,可以直接調(diào)用。宏和子程序均有利于程序的邏輯性和可讀性,但這兩種用法卻有不同的特點(diǎn)。宏調(diào)用實(shí)際上是用符號(hào)(一條假指令)替代一塊代碼,這樣編程和閱讀都方便;而子程序調(diào)用則需將程序指針轉(zhuǎn)移到子程序所在位置去執(zhí)行,為了能正確返回,還必須保護(hù)現(xiàn)場(chǎng),而且程序指針的轉(zhuǎn)移還會(huì)破壞流水線(xiàn),因此這種方法會(huì)花費(fèi)更多的程序執(zhí)行時(shí)間,速度相對(duì)較慢。

宏調(diào)用快速,但多次調(diào)用時(shí),由于多次復(fù)制代碼段,造成占用程序存儲(chǔ)空間較大。而子程序調(diào)用時(shí),由于代碼模塊只存在于一個(gè)地方,因此盡管速度有所減緩,但占用存儲(chǔ)空間較少。因此,在要求速度的實(shí)時(shí)場(chǎng)合應(yīng)使用宏,以簡(jiǎn)化編程并保持高速度,在存儲(chǔ)容量有限的場(chǎng)合,應(yīng)犧牲速度(對(duì)時(shí)間不敏感的慢速情況),采用子程序調(diào)用的方法,以降低存儲(chǔ)器的占用量。

良好的編程方法和風(fēng)格靠積累得到,不同種類(lèi)間的編程可以相互借鑒,對(duì)提高編程能力不無(wú)好處。7.1.2鏈接控制命令文件的修改

鏈接控制命令文件(LinkerCommandFiles,?.cmd)也稱(chēng)鏈接器命令文件,是將由匯編語(yǔ)言和C語(yǔ)言源程序經(jīng)過(guò)匯編和編譯生成的目標(biāo)文件(?.obj)按一定的格式組織起來(lái),形成可以被開(kāi)發(fā)系統(tǒng),如XDS510硬件仿真器和CCS,加載到DSP隨機(jī)存儲(chǔ)器,或固化到DSP非易失存儲(chǔ)器的公共目標(biāo)文件格式(CommonObjectFileFormat,COFF)的“可執(zhí)行”文件(?.out),這個(gè)文件也可以被轉(zhuǎn)化為其它二進(jìn)制文件格式,以便將代碼固化于片外非易失存儲(chǔ)器中。TI公司提供了像DSPHEX(格式:dsphex[–options]filename)這樣的轉(zhuǎn)換工具。

1.匯編語(yǔ)言的段

段(sections)是指連續(xù)占用存儲(chǔ)空間的一個(gè)數(shù)據(jù)塊和代碼塊。程序按段組織,每行匯編代碼都從屬于一個(gè)段,由段偽指令指明該段的屬性。

目標(biāo)文件COFF至少包含以下三個(gè)默認(rèn)段:代碼段(?.text),通常包含可執(zhí)行代碼;常數(shù)/系數(shù)數(shù)據(jù)段(.data),通常包含初始化后的數(shù)據(jù);變量/保留數(shù)據(jù)段(.bss),通常為未初始化變量保留空間。

而段的類(lèi)型有初始化段和非初始化段兩種。初始化段包含數(shù)據(jù)或代碼,包括?.text段、?.data段以及自定義段?.sect等。非初始化段用于為未初始化變量保留存儲(chǔ)空間,包括?.bss段和?.usect自定義段。通常非初始化段被分配到RAM區(qū)。匯編程序時(shí),匯編器要對(duì)段進(jìn)行處理。偽指令?.text、?.data和?.sect告訴匯編器停止匯編當(dāng)前的段,而開(kāi)始匯編進(jìn)入指定的段。但?.bss和?.usect偽指令不終止當(dāng)前的段而開(kāi)始一個(gè)新段,它們只是簡(jiǎn)單地臨時(shí)離開(kāi)當(dāng)前的段。?.bss和?.usect偽指令可出現(xiàn)在初始化段的任何地方,而不會(huì)影響相互之間的內(nèi)容安排。

“段”通過(guò)一個(gè)安置過(guò)程建立起來(lái),如圖7.1所示。例如,當(dāng)匯編器第一次遇到一個(gè)?.data偽指令時(shí),.data段是空的。跟在第一個(gè)?.data偽指令后的指令被匯編進(jìn)?.data段,直到遇到?.text、.sect或?.asect偽指令。如果匯編器在后面還遇到?.data偽指令,則將跟在這些?.data偽指令后面的語(yǔ)句匯編進(jìn)已經(jīng)存在的?.data段。這樣就形成了單個(gè)可被連續(xù)分配到存儲(chǔ)器中的?.data段。圖7.1“段”的安置過(guò)程

2.C語(yǔ)言的段

C語(yǔ)言有7個(gè)定義好的段,沒(méi)有了匯編語(yǔ)言中的?.data段,詳見(jiàn)表7.11。

表7.11中描述了C語(yǔ)言經(jīng)編譯器編譯后,生成的匯編語(yǔ)言對(duì)應(yīng)的段,這些段要在鏈接控制命令文件中加以正確的配置。其中,“0頁(yè)”指的是程序空間,?“1頁(yè)”指的是數(shù)據(jù)空間。?特別地,對(duì)?.cinit段,?若“編譯選項(xiàng)”?中?“自動(dòng)初始化(Autoinitialization)”選用了?“-c”?選項(xiàng)(-coption),?設(shè)置成“ROMModel”模式,那么,目標(biāo)文件中的?.cinit段通過(guò)下載器加載(固化)到存儲(chǔ)器的初始化表中,運(yùn)行時(shí)由引導(dǎo)例程(bootroutine)將其轉(zhuǎn)移到?.bss段空間中;而“-cr”選項(xiàng)(-croption)則是“RAMModel”模式,這時(shí),目標(biāo)文件中的?.cinit段通過(guò)下載器直接加載到存儲(chǔ)器的?.bss段空間中。

3.鏈接控制命令文件的修改

在鏈接控制命令文件(?.cmd)中要設(shè)置三項(xiàng)內(nèi)容,即鏈接參數(shù)指定、存儲(chǔ)資源說(shuō)明和存儲(chǔ)資源配置。鏈接參數(shù)指定即指定輸入輸出文件,以及像C語(yǔ)言中堆棧大小的設(shè)置等參數(shù);存儲(chǔ)資源說(shuō)明即可利用的全部存儲(chǔ)器資源的說(shuō)明;存儲(chǔ)資源配置則是段在存儲(chǔ)資源中的具體定位(配置)。

在CC或CCS中,默認(rèn)的輸入文件是集成環(huán)境中編譯匯編成的目標(biāo)文件(?.obj),默認(rèn)的輸出文件則是鏈接好的COFF格式“可執(zhí)行”文件(?.out),以工程項(xiàng)目名稱(chēng)命名。當(dāng)然,重寫(xiě)一次輸入文件也是允許的。如果鏈接中用到其它輸入文件,則可直接列出其(路徑)名稱(chēng);如果要生成其它輸出文件,則可直接列出其(路徑)名稱(chēng);其它基本參數(shù)的設(shè)置情況詳見(jiàn)表7.12。這實(shí)際上就是CC或CCS中的鏈接設(shè)置選項(xiàng)。存儲(chǔ)資源說(shuō)明由偽指令MEMORY完成,每個(gè)存儲(chǔ)資源包括存儲(chǔ)塊所屬頁(yè)(PAGE)、名稱(chēng)、起始地址和長(zhǎng)度這幾個(gè)參數(shù)。頁(yè)分為程序頁(yè)P(yáng)AGE0、數(shù)據(jù)頁(yè)P(yáng)AGE1和I/O頁(yè)P(yáng)AGE2;名稱(chēng)可根據(jù)含義自定;起始地址以O(shè)RG(ORIGIN)表示,長(zhǎng)度用LENGTH表示,十六進(jìn)制數(shù)可表示成像“0x8000”或“0f000h”的形式。

存儲(chǔ)資源配置用偽指令SECTIONS完成,和MEMORY一樣,采用統(tǒng)一的格式,將“段”指向存儲(chǔ)資源中的相應(yīng)名稱(chēng),即可完成配置過(guò)程。

為了增強(qiáng)可讀性,.cmd文件也需要設(shè)置注釋?zhuān)⑨尫肅語(yǔ)言的格式“/*……*/”。一個(gè)典型的?.cmd文件示例如下:7.1.3程序基本結(jié)構(gòu)

程序基本結(jié)構(gòu)就是CC或CCS中的工程項(xiàng)目的結(jié)構(gòu)。一個(gè)典型的工程項(xiàng)目包括源程序文件、鏈接控制命令文件和庫(kù)函數(shù)文件三個(gè)組成部分。由于源程序文件中,一般將常用的說(shuō)明、定義和專(zhuān)用常數(shù)等設(shè)計(jì)成獨(dú)立的文件存放,以便日后經(jīng)常性地使用,因此又多出了一個(gè)包含文件部分。庫(kù)函數(shù)文件則是經(jīng)過(guò)匯編、編譯后,可以直接用于鏈接的功能程序模塊的集合,在完全匯編語(yǔ)言程序中一般不用,而在C語(yǔ)言程序中則常常是必須要加以調(diào)用的。在實(shí)時(shí)采集、處理和控制等要求速度的場(chǎng)合,一般采用單純的匯編語(yǔ)言(?.asm)程序,以求程序的執(zhí)行效率;在大運(yùn)算量、高精度處理場(chǎng)合,則采用C語(yǔ)言(?.c)程序,以求編程效率;對(duì)于兩者均有要求的時(shí)候,混合編程(.c+.asm)則是明智的選擇。

1.匯編語(yǔ)言源程序

用匯編語(yǔ)言編寫(xiě)源程序代碼,結(jié)構(gòu)似乎非常簡(jiǎn)單,它是將零散的、只有原始單一功能的匯編語(yǔ)句(機(jī)器語(yǔ)言的助記符)有機(jī)地結(jié)合成具有一定目標(biāo)功能的程序。

以下是一段程序舉例。上面文件IIR4.ASM是一段實(shí)現(xiàn)4階IIR濾波器的程序,完成256個(gè)輸入數(shù)據(jù)的低通濾波功能,截止頻率為

/4,對(duì)應(yīng)200kHz采樣率時(shí)為25kHz。256個(gè)輸入數(shù)據(jù)信號(hào)用Matlab生成,計(jì)算輸出y(n)的差分方程式為(7.1)4階IIR濾波由宏指令I(lǐng)IR4實(shí)現(xiàn)。宏指令中,存儲(chǔ)器的結(jié)構(gòu)和濾波運(yùn)算的流程在圖7.2中清楚地展示了出來(lái)。計(jì)算輸出y(n)的差分方程見(jiàn)式(7.1),反復(fù)調(diào)用這個(gè)宏指令I(lǐng)IR4可實(shí)現(xiàn)一個(gè)數(shù)據(jù)流的濾波處理(上例中調(diào)用256次)。但由于每次調(diào)用宏均會(huì)復(fù)制一段代碼,因此調(diào)用次數(shù)過(guò)多將會(huì)導(dǎo)致存儲(chǔ)容量的不足。采用循環(huán)措施可解決此問(wèn)題,只是這樣做會(huì)增加程序執(zhí)行時(shí)間。圖7.24階IIR濾波器實(shí)現(xiàn)方框圖

IIR4宏里使用了乘累加及數(shù)據(jù)移動(dòng)指令macd和單指令重復(fù)指令rpt。每次計(jì)算y(n)時(shí),首先將累加器ACC和乘積寄存器P清零,以清除隨機(jī)初值造成的錯(cuò)誤,然后連續(xù)進(jìn)行10次乘累加及數(shù)據(jù)移動(dòng)操作,從u(n-4)*b4開(kāi)始到y(tǒng)(n-1)*a4結(jié)束的9次乘累加是必要的,最后一次是為了把第九次乘積P的值累加進(jìn)取而設(shè),而這次的成績(jī)是作廢的。這樣,在ACC中即得y(n),同時(shí)u(n)和y(n)均被移位(延時(shí)),即分別變成了u(n-1)和y(n-1)。

程序中的包含文件將在7.1.4節(jié)中講述。鏈接控制命令文件(IIR4.cmd)如下:實(shí)際操作中,首先打開(kāi)“SetupCC‘C2000”,將工作環(huán)境設(shè)置為軟件仿真模式,然后運(yùn)行CC’C2000,在命令菜單欄中選擇“Project”,新建一個(gè)工程(“New”),取名IIR4,再按前述新建一個(gè)源文件“IIR4.asm”,保存至工程項(xiàng)目所在目錄中,并將其添加到工程項(xiàng)目中(“AddFilestoProject”)。用同樣的方法建立“IIR4.cmd”。編譯(“Project\Rebuildall”)無(wú)誤后,下載(“File\LoadProgram”)程序(工程項(xiàng)目所在目錄中的“IIR4.out”)到仿真環(huán)境中調(diào)試執(zhí)行。程序生成出錯(cuò)是因?yàn)镻roject選項(xiàng)BuildOptions的輸出模組OutputModule未選中AbsoluteExecutable,以及CInitialization選項(xiàng)未選中NoAutoinitialization。CC編譯環(huán)境默認(rèn)為C語(yǔ)言(混合)編程環(huán)境,純匯編時(shí)要特別聲明。否則,在復(fù)位向量處應(yīng)以_c_int0命名(將start換成_c_int0)。

另外,如果建立過(guò)程中出現(xiàn)找不到DSPA等程序的情況,那是因?yàn)闆](méi)有指出其路徑,可用Windows的環(huán)境設(shè)置指向其程序所在路徑(默認(rèn)安裝路徑為C:\tic2xx\c2000\cgtools\bin),或者簡(jiǎn)單地將其拷貝到CC的執(zhí)行路徑中(默認(rèn)安裝路徑為C:\tic2xx\cc\bin)。選中“Debug\Run”直接執(zhí)行程序,然后用“Debug\Halt”停止執(zhí)行,這時(shí)使用視圖功能“View”菜單中的圖形調(diào)試選項(xiàng)“Graph”的“時(shí)間波形/頻率特性”功能“Time/Frequency”進(jìn)行波形和頻譜分析。在圖形屬性的對(duì)話(huà)框(“GraphPropertyDialog”)中的顯示類(lèi)型(“DisplayType”)選項(xiàng)中選中雙時(shí)域波形(“DualTime”)功能,修改圖的上半部分起始地址(“StartAddress–upperdisplay”)為“0x200”、下半部分起始地址(“StartAddress-lowerdisplay”)為“0x300”、采集緩沖區(qū)大小(“AcquisitionBufferSize”)為“256”、顯示數(shù)據(jù)區(qū)大小(“DisplayDataSize”)為“256”、DSP數(shù)據(jù)類(lèi)型(“DSPDataType”)選擇“16-bitsignedinteger”,其它保持默認(rèn)狀態(tài),則可顯示出圖的上半部分為輸入信號(hào)波形,下半部分為濾波后的信號(hào)波形,如圖7.3所示。圖7.34階IIR濾波器效果可見(jiàn),在濾波器設(shè)計(jì)時(shí)設(shè)計(jì)得很好的效果,在實(shí)際實(shí)現(xiàn)過(guò)程中則差得多。原因何在?主要是IIR濾波器的字長(zhǎng)效應(yīng),在運(yùn)算過(guò)程中將乘累加的32位結(jié)果變成了輸出的16位結(jié)果,而這16位是要參與反饋運(yùn)算的。

比較好的解決辦法是采用二階節(jié)級(jí)聯(lián),這樣會(huì)減輕字長(zhǎng)效應(yīng)。將圖7.2中的4階IIR濾波器實(shí)現(xiàn)方框圖去掉輸入、輸出的最后兩個(gè)延時(shí),就變成了二階節(jié)的形式。為了對(duì)比,這里給出兩個(gè)二階節(jié)級(jí)聯(lián)的源程序IIR4_cas.asm。鏈接控制命令文件IIR4_cas.cmd如下:上述程序執(zhí)行結(jié)果示于圖7.4中。與圖7.3對(duì)比,級(jí)聯(lián)兩個(gè)IIR二階節(jié)的濾波效果比4階IIR直接型濾波器的效果好得多。這兩個(gè)例子的完整程序已放置于光盤(pán)中。圖7.4級(jí)聯(lián)兩個(gè)IIR二階節(jié)濾波效果

2.C語(yǔ)言源程序

用純粹的C語(yǔ)言編寫(xiě)的源程序,過(guò)程非常簡(jiǎn)單,但是這樣做帶來(lái)的后果是執(zhí)行速度的降低。建立一個(gè)完整工程項(xiàng)目的方法和純匯編的方式大體相同,只是要添加一個(gè)庫(kù)函數(shù)文件rts2xx.lib(在CC的安裝目錄下的\c2000\cgtools\lib路徑中)。程序設(shè)計(jì)完全按C語(yǔ)言的標(biāo)準(zhǔn)和要求進(jìn)行,如程序中有且僅有一個(gè)含有main()函數(shù)的源文件等。

下面給出一個(gè)C語(yǔ)言編程的例子,產(chǎn)生一個(gè)混疊1~4kHz四種正弦波信號(hào)的多諧波數(shù)據(jù),源程序?yàn)镾ineWave.c,鏈接控制命令文件為SineWave.cmd,編譯環(huán)境用CC默認(rèn)情況即可,結(jié)果如圖7.5所示,程序在SineWave_C工程目錄中。圖7.5C語(yǔ)言程序產(chǎn)生疊加正弦波的多諧波信號(hào)

3.C和匯編混合編程

為了兼顧編程效率和代碼效率,常采用C和匯編的混合編程模式。在混合編程模式下,匯編語(yǔ)言程序完成硬件接口和高速運(yùn)算的功能,C語(yǔ)言程序完成通常的計(jì)算、總體程序結(jié)構(gòu)和繁雜的事務(wù)管理等功能。

混合編程模式中的匯編語(yǔ)言程序常以子程序的形式出現(xiàn),即構(gòu)成了C函數(shù),因此編程中要符合C的風(fēng)格參數(shù)傳遞和結(jié)構(gòu)要求。

在C語(yǔ)言中插入單句匯編語(yǔ)句的方法僅完成簡(jiǎn)單的功能,一般只用在DSP中特定硬件部件的定式初始化中,而非變量式的控制上。如果用這種方法對(duì)存儲(chǔ)器或寄存器進(jìn)行操作,可能會(huì)破壞C工作環(huán)境中的變量及數(shù)據(jù)。說(shuō)明符asm完成該功能,語(yǔ)法格式為

asm(“assemblertext”);標(biāo)準(zhǔn)應(yīng)用是將匯編模塊設(shè)計(jì)成標(biāo)準(zhǔn)C函數(shù)。事實(shí)上,TI公司對(duì)TMS320'C2000系列DSP提供了極為豐富的用常用匯編語(yǔ)言設(shè)計(jì)成的子程序或標(biāo)準(zhǔn)C函數(shù)模塊,速度比直接使用C編程快得多,注冊(cè)用戶(hù)可以免費(fèi)下載使用。如譜分析模塊(C24xFastFourierTransform[FFT]Library.zip)、數(shù)字濾波模塊(C24xFilterLibrary.zip)、定點(diǎn)數(shù)學(xué)運(yùn)算模塊(C24xFixed-PointMathLibrary.zip)、信號(hào)發(fā)生器模塊(C24xSignalGeneratorLibrary.zip)和軟件測(cè)試平臺(tái)模塊(C24xSoftwareTestBench(STB)Library.zip)等。而對(duì)于控制應(yīng)用,也有一套完整的子程序或標(biāo)準(zhǔn)C庫(kù)函數(shù)(GeneralTools&SoftwareforTMS320LF240xControllers)供使用。

TMS320‘C2000大類(lèi)中的TMS320’C28xx系列DSP,由于其32位的結(jié)構(gòu),TI提供了對(duì)應(yīng)的另外一套程序模塊套件。

很多應(yīng)用中,需要開(kāi)發(fā)者自己設(shè)計(jì)專(zhuān)用的C函數(shù)模塊,因此需要搞清楚被調(diào)用的匯編C函數(shù)與調(diào)用者之間的必要交接和參數(shù)傳遞。

C語(yǔ)言程序調(diào)用匯編語(yǔ)言寫(xiě)成的函數(shù),其相關(guān)操作如圖7.6所示?,F(xiàn)以軟件低通濾波為例,舉例說(shuō)明如下。圖7.6C語(yǔ)言程序調(diào)用匯編語(yǔ)言程序的相關(guān)操作設(shè)C語(yǔ)言調(diào)用函數(shù)為

[b0,b1,b2,…,bn]=func(a0,a1,a2,…,an);

這里,[b0,b1,b2,…,bn]用于函數(shù)返回結(jié)果,也可為一個(gè)結(jié)構(gòu)體,為了便于書(shū)寫(xiě),故意寫(xiě)成偽碼形式。func(a0,a1,a2,…,an)為匯編語(yǔ)言寫(xiě)成的被調(diào)函數(shù),a0,a1,a2,…,an為實(shí)際傳遞參數(shù)。

調(diào)用函數(shù)時(shí),首先是完成軟堆棧的一系列操作,然后是下一語(yǔ)句對(duì)應(yīng)的首條匯編指令地址(對(duì)應(yīng)PC值)入棧(8級(jí)硬棧),接著交由匯編函數(shù)執(zhí)行。軟堆棧的堆棧指針SP由AR1擔(dān)任,函數(shù)幀的幀指針FP則由AR0擔(dān)任。這兩個(gè)指針均針對(duì)地址增量方向增量修改。函數(shù)幀是指每個(gè)函數(shù)體使用的軟堆棧集合。

軟堆棧的一系列操作包括函數(shù)傳遞參數(shù)。當(dāng)程序交由匯編函數(shù)執(zhí)行時(shí),已完成了堆棧的操作,此時(shí)堆棧指針SP指向一個(gè)空閑的地址單元。SP減1后指向參數(shù)傳遞區(qū),這個(gè)區(qū)域按倒序依次存放著a0、a1、a2、…、an等參數(shù)。如果參數(shù)是長(zhǎng)整型等32位數(shù)值,則高位字在低地址,而低位字在高地址。軟堆棧的一系列操作也包括函數(shù)返回結(jié)果(結(jié)構(gòu)體)空間預(yù)留,設(shè)置在調(diào)用函數(shù)幀中。對(duì)于幾個(gè)返回值的情況,首個(gè)返回值b0置于ACC中,其余返回值則在參數(shù)之前的堆棧位置,按倒序依次存放為b1、b2、…、bn。對(duì)于結(jié)構(gòu)體返回值的情況,實(shí)際上是將結(jié)構(gòu)體的地址作為參數(shù)傳遞中的最后一個(gè)參數(shù)(附加參數(shù))傳遞給被調(diào)函數(shù),因此被調(diào)函數(shù)可以直接賦值給結(jié)構(gòu)體。由于硬件堆棧只有8級(jí),每次調(diào)用函數(shù)或發(fā)生中斷必然保存斷點(diǎn),結(jié)果均會(huì)占用至少一個(gè)堆棧單元,這樣很容易造成堆棧溢出,導(dǎo)致程序運(yùn)行混亂,因此有必要采用軟堆棧來(lái)緩沖。同時(shí),為了C代碼的正常返回和原現(xiàn)場(chǎng)(程序執(zhí)行的狀態(tài)環(huán)境等)的正?;謴?fù),原來(lái)函數(shù)幀的幀指針和堆棧指針以及必要的現(xiàn)場(chǎng)狀態(tài)須加以保護(hù)。

這樣,接下來(lái)的軟堆棧的操作如下:

(1)把返回地址從硬件堆棧中彈出到軟件堆棧;

(2)保存AR0(FP)和AR1(SP)寄存器;

(3)保存狀態(tài)寄存器ST1和ST0;

(4)如果匯編代碼用到了AR6和AR7寄存器,則應(yīng)該保存這兩個(gè)寄存器;

(5)執(zhí)行用戶(hù)的匯編代碼(實(shí)際函數(shù)體功能);

(6)根據(jù)上面的返回信息返回結(jié)果(如果有的話(huà));

(7)重設(shè)AR1為當(dāng)前輔助寄存器,然后按(4)到(1)的步驟反向執(zhí)行這幾步操作;

(8)函數(shù)返回。

程序執(zhí)行結(jié)果如圖7.7所示,實(shí)際程序(在Cca工程目錄中)如下。圖7.7C語(yǔ)言程序調(diào)用匯編語(yǔ)言函數(shù)結(jié)果波形圖●匯編語(yǔ)言函數(shù)其中,包含文件IIR4COEF.h內(nèi)容如下:

Coefb4.sect“Coefb4”

.word119,24,173,24,119,1874,-7379,12459,-10534

●?C語(yǔ)言主函數(shù)●鏈接控制命令文件

C語(yǔ)言中保留了4個(gè)內(nèi)核寄存器AR0、AR1、AR6、AR7(AR6、AR7保留用于關(guān)鍵字register或優(yōu)化使用),以及兩個(gè)狀態(tài)寄存器ST0、ST1,在匯編函數(shù)中使用時(shí)必須加以保護(hù),而AR1則是絕對(duì)不可用于函數(shù)功能代碼中的。

順便指出,在調(diào)試程序中,有些常見(jiàn)錯(cuò)誤并不容易被發(fā)現(xiàn),特別是匯編語(yǔ)言程序中,如編程中錯(cuò)誤地使用了中文符號(hào),將標(biāo)號(hào)置于第1列(行首)后面,將指令(或偽指令)置于第1列(行首)的位置,文件路徑包含有中文字符等。這是由軟件開(kāi)發(fā)工具的基本要求或版本局限造成的,開(kāi)發(fā)者只能適應(yīng)。7.1.4Matlab生成系數(shù)的方法

7.1.3小節(jié)中IIR4程序中的兩個(gè)包含文件可用Matlab生成。其中,“INPUT.inc”是數(shù)據(jù)輸入文件,在實(shí)際操作中應(yīng)該是實(shí)際采樣數(shù)據(jù),這里暫時(shí)采用軟件仿真的方式來(lái)作為入門(mén)練手,可用人工產(chǎn)生數(shù)據(jù)的辦法。下面是生成兩個(gè)30kHz和50kHz正弦波疊加的Matlab程序,采樣頻率為200kHz,生成的數(shù)據(jù)文件為“INPUT.inc”。這個(gè)例子生成的數(shù)據(jù)比較簡(jiǎn)單,實(shí)際上Matlab有很豐富的函數(shù),可生成雷達(dá)、通信以及醫(yī)學(xué)電子等各種領(lǐng)域的確知或隨機(jī)仿真信號(hào)。

而濾波系數(shù)文件的生成相對(duì)復(fù)雜些,因?yàn)閷?shí)際上這是一個(gè)濾波器設(shè)計(jì)過(guò)程,要涉及到數(shù)字信號(hào)處理原理的內(nèi)容,就是常說(shuō)的“算法”。不過(guò)由于Matlab的完備性,這項(xiàng)工作并不困難。

以下是一個(gè)設(shè)計(jì)直接型四階IIR濾波器的Matlab程序,生成“IIR4COEF.h”系數(shù)文件。由于直接型IIR濾波器對(duì)字長(zhǎng)極為敏感,實(shí)際應(yīng)用中大多采用二階節(jié)級(jí)聯(lián)型結(jié)構(gòu)。以下是一個(gè)將直接型四階IIR濾波器設(shè)計(jì)轉(zhuǎn)換為兩個(gè)二階節(jié)的Matlab程序,生成“IIR4_cas.h”系數(shù)文件。需要注意的是,在Matlab中,同樣不能使用漢字或加減號(hào)作為程序文件或命令名,否則將找不到該文件或命令。

7.2主要DSP硬件模塊編程舉例

7.2.1幾個(gè)特殊I/O引腳編程舉例

TMS320‘C2000系列DSP中有幾個(gè)特殊I/O引腳,它們是XF、BIO、IO3~I(xiàn)O0等,在TMS320’C24xx中還有PORTA~PORTF等6個(gè)通用I/O端口。這些端口對(duì)DSP在控制領(lǐng)域中的應(yīng)用提供了極大的方便。

1.XF、BIO、IO3~I(xiàn)O0的使用

基于TMS320F206的XF、BIO、IO3~0的簡(jiǎn)單應(yīng)用類(lèi)似于第6章的圖6.7(使用F206EVM實(shí)驗(yàn)?zāi)0?,按鍵控制BIO引腳電平進(jìn)行狀態(tài)切換,IO2接紅色、XF接綠色發(fā)光二極管顯示狀態(tài)變化。編制匯編程序描述如下:上述程序見(jiàn)于CDROM的程序路徑,子目錄工程名稱(chēng)為Peripheral_IO,包含文件init.h具有常用的說(shuō)明定義參數(shù),包含文件vector.h則給出了中斷向量的定義,程序中中斷返回部分使用的標(biāo)號(hào)就是在向量包含文件給出的。鏈接控制命令文件和前面的例子類(lèi)似。該程序執(zhí)行結(jié)果是當(dāng)監(jiān)測(cè)到按鍵K100按下接通時(shí),BIO為低,紅綠燈齊亮;松開(kāi)時(shí),BIO為高,則交替發(fā)亮一段時(shí)間。程序只對(duì)BIO檢測(cè)一次,可方便地修改為連續(xù)檢測(cè)的方式,這時(shí)交替次數(shù)和延時(shí)可適當(dāng)減少。

應(yīng)注意到,當(dāng)需要使用源程序調(diào)試時(shí),可以設(shè)置BuildOptions中Assembler的g參數(shù),即選中EnableSourceLevelDebugging選項(xiàng);而只需反匯編調(diào)試時(shí),則禁止。

PORTA端口的使用

TMS320LF2407具有4個(gè)8位通用IO端口PORTA/B/C/E、1個(gè)1位通用IO端口PORTD和1個(gè)7位通用IO端口PORTF,它們與其它片內(nèi)外設(shè)復(fù)用IO引腳,默認(rèn)情況下連接于通用IO端口。下面PORTA為例,說(shuō)明IO端口的使用方法。

其實(shí)IO端口的使用極為簡(jiǎn)單,硬件電路可以這樣連接,將IOPA4~I(xiàn)OPA7作為輸入,分別通過(guò)4個(gè)10kΩ電阻上拉到電源VCC,并且分別通過(guò)4個(gè)按鍵接地;將IOPA0~I(xiàn)OPA3作為輸出,以灌電流方式分別將4個(gè)150Ω電阻和4個(gè)發(fā)光二極管LED串聯(lián),端接于IOPA0~I(xiàn)OPA3和電源VCC之間。當(dāng)有鍵按下時(shí),相應(yīng)的IOPA4~I(xiàn)OPA7口被置低,程序檢測(cè)后設(shè)置對(duì)應(yīng)IOPA0~I(xiàn)OPA3位為低,相應(yīng)的LED被點(diǎn)亮。7.2.2中斷編程舉例

DSP的中斷具有復(fù)用的特點(diǎn),在‘C2xx中,和

復(fù)用一個(gè)管腳/,而INT2和INT3則共用一個(gè)屏蔽位和中斷向量。因此,實(shí)際應(yīng)用中,除設(shè)置全局中斷屏蔽位INTM、中斷屏蔽寄存器IMR外,還要通過(guò)中斷控制寄存器ICR的MODE、MINT2、MINT3位進(jìn)一步區(qū)分和以及INT2和INT3的禁止特性。同樣地,ICR中的FINT2、FINT3位輔助中斷標(biāo)志寄存器IFR判別INT2和INT3的中斷標(biāo)志。下面給出一個(gè)實(shí)際匯編語(yǔ)言編程的例子。按圖6.6中的F206EVM實(shí)驗(yàn)板的外中斷連接電路接法,用跳線(xiàn)帽接通J101第二行(外部INT1中斷口),并通過(guò)接口J100送入一個(gè)TTL電平的方波信號(hào),作為INT1的中斷觸發(fā)信號(hào)。方波頻率選用10~50Hz。程序設(shè)計(jì)成接收中斷后由異步串行口UART發(fā)送一個(gè)字符,其輸出再經(jīng)過(guò)如圖6.21所示的RS232電平轉(zhuǎn)換電路后向PC機(jī)傳輸。在PC機(jī)一端則可使用像串口大師(ComMaster)一類(lèi)的調(diào)試程序接收數(shù)據(jù)。使用10Hz方波信號(hào),采用單獨(dú)下降沿觸發(fā)模式,5秒內(nèi)可收到50個(gè)字符(ASIIC字符“5”或二進(jìn)制35h);采用上升沿/下降沿雙沿觸發(fā)模式,5秒內(nèi)則可收到100個(gè)字符。該程序見(jiàn)于第2章2.5節(jié)最后的程序舉例。注意,這是一個(gè)并不完善的串行發(fā)送程序,在程序中,不管UART的發(fā)送寄存器是否為空,只要有中斷,就發(fā)送數(shù)據(jù)。當(dāng)中斷速度較快時(shí),可造成后面的發(fā)送字符覆蓋前面發(fā)送字符的錯(cuò)誤,導(dǎo)致接收字符異常。

將輸入TTL電平方波信號(hào)頻率改為1Hz,一個(gè)C語(yǔ)言程序見(jiàn)光盤(pán)Interrupt_C子目錄,主程序和鏈接控制命令文件如下。程序執(zhí)行結(jié)果是:LED?燈隨外部輸入信號(hào)閃爍,而?PC機(jī)可接收串行信號(hào),顯示字符“6”。

C語(yǔ)言主程序:鏈接控制命令文件:

在‘C24xx中,中斷源的數(shù)量增加了很多,各種外設(shè)產(chǎn)生的中斷源通過(guò)外設(shè)中斷擴(kuò)展控制器(PeripheralInterruptExpansionController,PIE)連接到核心中斷請(qǐng)求端INT1~I(xiàn)NT6上。圖7.8給出了TMS320’C24xx外設(shè)中斷擴(kuò)展原理方框圖。

實(shí)際上,這些中斷源幾乎為片內(nèi)外設(shè)占用了,留下的幾個(gè)不多的獨(dú)立外部中斷源為復(fù)位RESET、非屏蔽中斷NMI和兩個(gè)擴(kuò)展外部中斷XINT1、XINT2以及用于功率控制如電機(jī)控制的功率驅(qū)動(dòng)保護(hù)PDPINTA、PDPINTB等。圖7.8TMS320'C24xx外設(shè)中斷擴(kuò)展原理方框圖因此,TMS320'C24xx上中斷初始化設(shè)置和中斷響應(yīng)相關(guān)的寄存器增加了2個(gè)擴(kuò)展中斷控制寄存器XINT1CR和XINT2CR,1個(gè)外設(shè)中斷向量寄存器PIVR,3個(gè)外設(shè)中斷請(qǐng)求寄存器PIRQR0、PIRQR1和PIRQR2,3個(gè)外設(shè)中斷響應(yīng)寄存器PIACKR0、PIACKR1和PIACKR2。編程中要注意這些寄存器的正確設(shè)置和使用。7.2.3中斷向量在單片系統(tǒng)調(diào)試中的處理

作為實(shí)驗(yàn)系統(tǒng),一般都會(huì)設(shè)置片外存儲(chǔ)器擴(kuò)展,這時(shí)調(diào)試程序很方便,因?yàn)槌绦蚩梢约虞d到片外RAM上而無(wú)須燒寫(xiě),這對(duì)固定地址位置的中斷向量和非固定地址位置的中斷服務(wù)程序而言是極其重要的。

對(duì)于一般的應(yīng)用系統(tǒng),很多時(shí)候無(wú)須設(shè)置片外存儲(chǔ)器擴(kuò)展,以單片系統(tǒng)方式工作,這時(shí)程序一般是安放在片上的Flash中。但是Flash的燒寫(xiě)次數(shù)非常有限,在調(diào)試過(guò)程中經(jīng)常性地修改程序,無(wú)限制地對(duì)Flash進(jìn)行燒寫(xiě),勢(shì)必導(dǎo)致Flash的永久性損壞。解決這個(gè)問(wèn)題的辦法就是使用片內(nèi)RAM,但是片內(nèi)RAM的地址定位不含中斷向量區(qū),因此對(duì)復(fù)位和中斷的使用就會(huì)出問(wèn)題。

首先研究一下TMS320'C24xx中斷響應(yīng)過(guò)程的特點(diǎn)。當(dāng)響應(yīng)中斷時(shí),首先通過(guò)主向量段進(jìn)行第1次跳轉(zhuǎn),這是硬件完成的。然后,由程序計(jì)算外中斷向量位置,即由先前定義的中斷源決定PIVR的值——外中斷向量偏移量,加上外中斷向量段基址,就得到了外中斷向量地址,這樣完成了第二次跳轉(zhuǎn)。最后,由外中斷向量跳轉(zhuǎn)到實(shí)際中斷服務(wù)程序,實(shí)現(xiàn)實(shí)際的中斷過(guò)程。詳見(jiàn)圖7.9所示。更多資料參閱TI文檔SPRU357B。圖7.9TMS320'C24xx中斷向量轉(zhuǎn)移示例當(dāng)然,如果中斷源不是很多的話(huà),可以把重要的、實(shí)時(shí)性高的中斷單獨(dú)安排,這樣可以省掉后兩個(gè)跳轉(zhuǎn)的過(guò)程。

圖7.9中,只有主向量段的位置是固定的,即程序空間地址00h~3Fh,其它地址可以任意決定。因此可以考慮只固化這段Flash空間來(lái)解決調(diào)試問(wèn)題。

調(diào)試過(guò)程中,中斷向量的巧妙處理可以解決前面的這一矛盾,即可以考慮采用主向量段中插入一個(gè)固定跳轉(zhuǎn)的辦法來(lái)解決這個(gè)問(wèn)題。首先按正常方式設(shè)置中斷向量,但是向量處的跳轉(zhuǎn)語(yǔ)句的目的地址不是程序計(jì)算外中斷向量位置或中斷服務(wù)程序,而是一個(gè)固定地址,這個(gè)地址是安放程序的片上RAM的某個(gè)位置,如8000h,這個(gè)位置可以稱(chēng)為二級(jí)向量,然后再?gòu)倪@個(gè)二級(jí)向量跳轉(zhuǎn)到程序計(jì)算外中斷向量位置或中斷服務(wù)程序。調(diào)試時(shí)只燒寫(xiě)中斷向量的部分到Flash上,程序的其它部分則通過(guò)程序裝載(LoadProgram)的辦法加載到片內(nèi)RAM中,具體做法如圖7.10所示。下面給出主程序的關(guān)鍵字段和實(shí)際向量段以及鏈接控制命令文件的關(guān)鍵語(yǔ)句,完整程序見(jiàn)光盤(pán)中的Flash_for_Programming(用于程序固化)和SRAM_for_Debug(用于調(diào)試)子目錄。圖7.10中斷向量的巧妙處理示例圖調(diào)試中,用于固化的向量包含文件“vectors.h”,向量通過(guò)8000h中轉(zhuǎn)。這樣,鏈接后中斷主向量段相當(dāng)于位于8000h,子向量段相當(dāng)于位于8040h。在用SRAM進(jìn)行程序加載調(diào)試時(shí),可以不加改變。調(diào)試完成后,真正工作時(shí)的固化向量用分號(hào)“;”后的真實(shí)標(biāo)號(hào)即可。

用于固化中斷向量于Flash的鏈接控制命令文件包含如下語(yǔ)句:而用于加載程序于SRAM的鏈接控制命令文件包含如下語(yǔ)句:

COMMAND資源說(shuō)明段:中斷向量的巧妙處理便于調(diào)試而又不傷及Flash,是一個(gè)“曲線(xiàn)救國(guó)”的辦法。但實(shí)際應(yīng)用中不能每次都使用仿真器加載程序來(lái)執(zhí)行,因此要把程序?qū)懭氲紽lash中。

系統(tǒng)調(diào)試好以后,可以糾正增加跳轉(zhuǎn)的中斷方式,按正常方法重新設(shè)置中斷向量。即向量處的跳轉(zhuǎn)語(yǔ)句的目的地糾正為程序計(jì)算外中斷向量位置或中斷服務(wù)程序。

使用鏈接控制命令文件建立*.OUT文件,然后使用Flash固化工具將該*.OUT文件燒寫(xiě)到Flash非易失存儲(chǔ)器中。這時(shí)程序工作區(qū)雖不是SRAM區(qū),但仍可以進(jìn)行在線(xiàn)調(diào)試,只是代碼不能靠加載修改而已。燒寫(xiě)后無(wú)須再加載程序,但為了調(diào)試方便,可以加載符號(hào)。這種方法對(duì)TMS320F206同樣適用。但是,在TMS320F206中會(huì)更加簡(jiǎn)單。因?yàn)槟抢餂](méi)有更多的中斷源,并且沒(méi)有子向量段重定位的問(wèn)題。

對(duì)于如何固化(Flash燒寫(xiě)),在第5章中已有所談及。為了便于操作,這里再給出一個(gè)簡(jiǎn)單的過(guò)程描述。

1)?TMS320F206燒寫(xiě)

要燒寫(xiě)Flash,只能在Windows95或Windows98系統(tǒng)中進(jìn)行,因?yàn)槠涑绦蚴腔贒OS的版本。如果不修改TI默認(rèn)的編程代碼,要求使用20MHz的主時(shí)鐘頻率,即注意時(shí)鐘模式和時(shí)鐘頻率,保證CLKOUT1頻率為20MHz,周期為50ns。

(1)在Windows98上拷貝TI原版TMS320C2xx的DOS開(kāi)發(fā)包目錄,在dbg目錄下工作;

(2)執(zhí)行BT0.BAT和BT1.BAT對(duì)JTAG接口及目標(biāo)DSP的連接情況進(jìn)行測(cè)試;

(3)執(zhí)行BC0.BAT和BC1.BAT對(duì)0區(qū)和1區(qū)Flash清除(置0);

(4)執(zhí)行BE0.BAT和BE1.BAT對(duì)0區(qū)和1區(qū)Flash擦除(置1);

(5)執(zhí)行命令“BP18K0被燒寫(xiě)文件完整路徑名1”或“BP18K1被燒寫(xiě)文件完整路徑名2”對(duì)Flash進(jìn)行編程。

2)?TMS320F240燒寫(xiě)

TMS320F240的燒寫(xiě)要求同F(xiàn)206,如果不修改TI默認(rèn)的編程代碼,要求使用外部時(shí)鐘或晶振必須是10MHz,否則需調(diào)整算法延時(shí)值。聞亭公司對(duì)TI原版工具略做了修改,可以使用,方法如下:

(1)在Windows98系統(tǒng)上安裝WinTechepp24x,得到C:\Tdsepp24x\flash24x目錄;

(2)執(zhí)行BTEST.BAT對(duì)JTAG接口及目標(biāo)DSP的連接情況進(jìn)行測(cè)試

(3)執(zhí)行BC0.BAT對(duì)Flash清除(置0),BC0.BAT包括如下兩個(gè)命令:

C:\TDSEPP24X\Flash24X\prg2xxpp-p378-m0x0006-w6-s0x4000-e–o

?

C:\TDSEPP24X\Flash24X\c2xx_bcX.out

(4)執(zhí)行BE0.BAT對(duì)Flash擦除(置1),BE0.BAT包括如下兩個(gè)命令:

?C:\TDSEPP24X\Flash24X\prg2xxpp-p378-m0x0006-w6-s0x4000-e-o

C:\TDSEPP24X\Flash24X\c2xx_beX.out

(5)執(zhí)行命令“BP8K被燒寫(xiě)文件完整路徑名”或“BFLW0被燒寫(xiě)文件完整路徑名”,對(duì)Flash進(jìn)行編程。BP8K.bat和BFLW0.bat分別包括如下命令:這里的%1為批處理命令參數(shù),代表“被燒寫(xiě)文件完整路徑名”。而378為計(jì)算機(jī)標(biāo)準(zhǔn)并行口SPP或增強(qiáng)并行口EPP的實(shí)際設(shè)置使用端口基地址。

另一種簡(jiǎn)便方法是使用安裝于Windows98桌面的“TDSEPP24x”文件夾,執(zhí)行“并口檢測(cè)”、“調(diào)試”等快捷圖標(biāo)命令,和“F24x編成”文件夾下的“清除”、“擦除”、“編程”命令,編程時(shí)可選擇被燒寫(xiě)文件完整路徑。對(duì)于TMS320LF2407A,由于作為T(mén)I的主流產(chǎn)品,在具有很好的性能價(jià)格比的同時(shí),TI公司給出了其Flash編程插件,最新版本為c2000flashprogsw_v112,它支持TMS320LF2407/LF2407a/LF2401及其它相關(guān)的TMS320LF240x系列,可以在TI的官方網(wǎng)站上免費(fèi)下載,建議使用該版本。光盤(pán)中也放進(jìn)了該燒寫(xiě)程序。

3)?TMS320LF2407A燒寫(xiě)

工作電壓VCC為3.3V,編程電壓VCP為5V,方法如下:

(1)先解壓c2000flashprogsw_v112插件,再執(zhí)行setup.exe安裝,安裝過(guò)程中要選擇TMS320‘C2000的工作路徑。

(2)運(yùn)行CC中,在tools命令圖標(biāo)下出現(xiàn)上述燒寫(xiě)工具。運(yùn)行該燒寫(xiě)工具,按提示進(jìn)行相應(yīng)的操作即可。執(zhí)行燒寫(xiě)操作時(shí),要注意如下問(wèn)題:

(1)關(guān)于Flash時(shí)鐘的選擇。此燒寫(xiě)工具默認(rèn)最高頻率進(jìn)行Flash的操作。根據(jù)目標(biāo)系統(tǒng)的工作主頻,要重新進(jìn)行PLL設(shè)置,方法是:先在advanceoptions下面的ViewConfigfile中修改倍頻,存盤(pán)后,在相應(yīng)的目錄(tic2xx\algos\相應(yīng)目錄)下運(yùn)行buildall.bat,就可以自動(dòng)完成修改更新了。

若所選頻率不是最高頻率40MHz,則還需要設(shè)定自已的timings.xx來(lái)代替系統(tǒng)默認(rèn)最高頻率的timings.xx。例如TMS320LF2407A的默認(rèn)文件是timings.40。Timings.xx可以利用include\timings.xls的Excel工作表來(lái)生成,然后在advanceoptions下面的ViewConfigfile中修改相應(yīng)的配置。存盤(pán)后,在相應(yīng)的目錄下運(yùn)行buildall.bat就可以完成修改了。

(2)加密功能考慮。對(duì)于TMS320‘LF240XA系列還應(yīng)注意:由于這些DSP的Flash具有加密功能,加密地址為程序空間的0x40~0X43H,程序禁止寫(xiě)入此空間,如果寫(xiě)了,此空間的數(shù)據(jù)被認(rèn)為是加密位,斷電后進(jìn)入保護(hù)Flash狀態(tài),使Flash不可重新操作,從而使DSP報(bào)廢。產(chǎn)品開(kāi)發(fā)完成,燒寫(xiě)完畢后,一定要進(jìn)行Programpasswords的操作,如果不做加密操作,就默認(rèn)最后一次寫(xiě)入加密位的數(shù)據(jù)為密碼。

(3)與以前TMS320'C2xx版本不同。TMS320'2407A與以前TMS320'C2xx版本從內(nèi)核的角度看是一致的,但Flash結(jié)構(gòu)不同,增加了加密功能,編程方法不再兼容。因此不能用DOS下的燒寫(xiě)軟件燒寫(xiě),必須用c2000flashprogsw_v112軟件燒寫(xiě)。

(4)對(duì)TMS320LF2407A使用的一些建議:

①一般調(diào)試時(shí),在RAM中進(jìn)行;

②程序燒寫(xiě)時(shí),避開(kāi)程序空間0x40~0x43H加密區(qū),程序最好小于32k;

③每次程序燒寫(xiě)完畢后,將word0,word1,word2,word3分別輸入自己的密碼,再點(diǎn)擊Programpassword,如果加密成功,提示Programisarrayed,如果0x40~0x43h中寫(xiě)入的是ffff,則認(rèn)為處于調(diào)試狀態(tài),F(xiàn)lash不會(huì)加密;

④斷電后,下次重新燒寫(xiě)時(shí)需要往word0~word3輸入已設(shè)的密碼,再u(mài)nlock,成功后可以重新燒寫(xiě)了(調(diào)試狀態(tài)不需要);⑤VCPP管腳接在?+5V上,即編程電壓VCP是直接加上的,中間不應(yīng)串接電阻;

⑥具體事宜請(qǐng)閱讀相應(yīng)目錄下的readme1、readme2幫助文件;

⑦注意*.cmd文件編寫(xiě)時(shí)應(yīng)該避開(kāi)40~43H單元,否則會(huì)把Flash加密,造成器件永久性不能使用。

使用硬件仿真器調(diào)試或固化程序時(shí)還要注意以下幾點(diǎn):

(1)CC和XDS510PP或XDS510USB的相應(yīng)驅(qū)動(dòng)可在Windows98/Windows2000/windowsXP系統(tǒng)中運(yùn)行。但現(xiàn)在某些計(jì)算機(jī)對(duì)并行口的支持存在問(wèn)題,或USB接口不是全面兼容,因此當(dāng)出現(xiàn)仿真器不能正常復(fù)位或找不到目標(biāo)DSP器件時(shí),應(yīng)首先換一臺(tái)并行口或USB接口正常的計(jì)算機(jī)再試。

(2)調(diào)試中若全部使用片外程序存儲(chǔ)器,則可極方便地通過(guò)JTAG口下載并調(diào)試程序。若使用片內(nèi)SRAM,則需注意其定位不是從0開(kāi)始,因此其中斷向量問(wèn)題必須處理好。前述二次定位向量的辦法可行。

(3)使用片內(nèi)RAM之前,應(yīng)通過(guò)寄存器編輯來(lái)設(shè)置ST1的D12(CNF)=1和/或存儲(chǔ)器編輯(實(shí)際是I/O空間)來(lái)設(shè)置(IS@FFE4h)的D1(PON)=1,從而定義程序存儲(chǔ)器,以保證硬件仿真中存儲(chǔ)器的邏輯存在。

(4)使用片外程序RAM之前,應(yīng)通過(guò)存儲(chǔ)器編輯(實(shí)際是I/O空間)來(lái)設(shè)置PMST(IS@FFE4h)的D0(MP/MC)=1來(lái)定義外部程序存儲(chǔ)器,設(shè)置WSGR(IS@FFFCh)來(lái)定義外部程序存儲(chǔ)器等待狀態(tài)。

(5)在工具欄OPTION選項(xiàng)中的MemoryMAP要設(shè)置好。7.2.4定時(shí)器編程舉例

TMS320‘C2000系列DSP的定時(shí)器中,當(dāng)主計(jì)數(shù)器周期寄存器PRD與預(yù)定標(biāo)計(jì)數(shù)器周期寄存器TDDR的內(nèi)容不同時(shí)為0時(shí),其溢出率或中斷速率由下式確定:(7.2)式中,tc(CO)為CLKOUT1的周期。當(dāng)PRD=TDDR=0時(shí),定時(shí)器的溢出率或中斷速率固定為(7.3)由于計(jì)數(shù)器采用減法計(jì)數(shù)模式,因此TMS320‘C2000系列DSP定時(shí)器的使用變得簡(jiǎn)單。第2章的2.5.2節(jié)給出了TMS320F206匯編語(yǔ)言的編程舉例,詳細(xì)文檔見(jiàn)光盤(pán)中的Peripheral_Timer子目錄。程序可在F206EVM實(shí)驗(yàn)板上執(zhí)行,運(yùn)行后定時(shí)器每隔204.8μs產(chǎn)生一次中斷,可見(jiàn)LED燈快速閃爍。

同樣功能的C語(yǔ)言程序描述如下,詳細(xì)文檔見(jiàn)光盤(pán)中的Peripheral_Timer_C子目錄。對(duì)于TMS320‘LF24xx,由于片內(nèi)定時(shí)器較多,并且增加了看門(mén)狗,其編程考慮和F206有較大的差異。為了便于使用,這里再給出一個(gè)C語(yǔ)言編程實(shí)例。

通用定時(shí)器1產(chǎn)生1s定時(shí)中斷的程序舉例:外部輸入時(shí)鐘為10MHz,經(jīng)過(guò)DSP的內(nèi)部鎖相環(huán)1倍頻后還是10MHz,通用定時(shí)器1的預(yù)分頻因子為64,可計(jì)算出周期寄存器的值為3D08h。詳細(xì)文檔見(jiàn)光盤(pán)中的Peripheral_2407Timer_C子目錄。7.2.5UART編程舉例

異步串行口具有獨(dú)立的波特率發(fā)生器,只要設(shè)定波特率除數(shù)寄存器BRD的值,即可決定波特率的大小。特殊情況,當(dāng)BRD為0時(shí),異步串行口將停止工作,不再接收和發(fā)送任何數(shù)據(jù)。復(fù)位時(shí)BRD為0001H,波特率因子是16,因此主時(shí)鐘CLKOUT1頻率一定時(shí),波特率與BRD值的關(guān)系式如下:(7.4)一個(gè)TMS320F206的異步串行口程序舉例如下。程序從串口讀入一個(gè)數(shù)據(jù)后加1,然后再發(fā)送出去。數(shù)據(jù)采用8個(gè)數(shù)據(jù)位加1個(gè)停止位格式。波特率設(shè)置為2400波特,以中斷方式收發(fā)字符。詳細(xì)文檔見(jiàn)光盤(pán)中的Peripheral_Uart子目錄。

該程序可在F206EVM模板上運(yùn)行,用PC機(jī)進(jìn)行調(diào)試。首先加載并運(yùn)行DSP程序,然后用串口調(diào)試程序發(fā)送、接收字符??梢灾饌€(gè)操作,也可以成批操作(定時(shí)發(fā)模式,要與波特率配合,速度不能過(guò)快)。結(jié)果是收到的字符總是發(fā)送值加1。

TMS320'C240x的串行通信接口(SCI)即異步串行口,波特率因子為8。SYSCLK為系統(tǒng)時(shí)鐘,即經(jīng)過(guò)鎖相環(huán)后的頻率值。串行口波特率的計(jì)算公式如下:(7.5)其中,BRR為波特率選擇寄存器的值,16位。當(dāng)BRR=0時(shí),其作用和BRR=1完全相同。這點(diǎn)與TMS320F206完全不同。一個(gè)典型應(yīng)用舉例如下。本例使用雙機(jī)通信,以中斷方式收發(fā)數(shù)據(jù),發(fā)送一個(gè)字符串,接收若干數(shù)據(jù),但只保存最近接收到的10個(gè)字符。程序完整文檔見(jiàn)光盤(pán)中的Peripheral_2407Uart_C子目錄。7.2.6SPI編程舉例

TMS320F206的SPI編程將在7.3.2節(jié)F206EVM實(shí)驗(yàn)系統(tǒng)板編程舉例的綜合應(yīng)用中給出,這里只描述TMS320LF2407A的SPI編程情況。

TMS320LF2407A中集成了一個(gè)4引腳的串口外設(shè)接口(SPI)?——同步串行口。SPI是一個(gè)高速、同步串行接口,它以同步方式發(fā)送和接收串行位流(字符),位流(字符)長(zhǎng)度1~16位可編程,傳輸速度可編程。SPI通常用于DSP與片外設(shè)備(器件)以及其它處理器之間的近距離通信。SPI基本情況已在2.6.5節(jié)中介紹。實(shí)際使用中要設(shè)置SPI的工作模式(主/從)、字符長(zhǎng)度、波特率等參數(shù),通過(guò)配置控制寄存器SPICCR、控制寄存器SPICTL、波特率設(shè)置寄存器SPIBRR實(shí)現(xiàn)。通過(guò)狀態(tài)寄存器SPISTS檢查其工作情況。

這里介紹一個(gè)簡(jiǎn)單的實(shí)驗(yàn)電路,TMS320LF2407A與數(shù)字電位器MAX5400采用SPI接口,TMS320LF2407A以主模式工作,完整程序見(jiàn)光盤(pán)中的Peripheral_2407SPI_C子目錄。程序編制如下:7.2.7PWM編程舉例

TMS320‘C24xx包括兩個(gè)事件管理模塊EVA和EVB,每個(gè)事件管理器模塊均可產(chǎn)生PWM波,而PWM是控制中極為常見(jiàn)的功率驅(qū)動(dòng)方式,因此TMS320’C24xx在控制領(lǐng)域應(yīng)用相當(dāng)廣泛。在3.7節(jié)中已給出了PWM波形產(chǎn)生的C語(yǔ)言編程舉例,而綜合應(yīng)用則將在7.3.3節(jié)的基于TMS320LF2407的雷達(dá)天線(xiàn)控制系統(tǒng)編程舉例中給出,在此不再贅述。7.2.8ADC編程舉例

TMS320LF2407A的模數(shù)轉(zhuǎn)換模塊ADC在2.6.3節(jié)已經(jīng)有所介紹,這里再做一些補(bǔ)充。

10位模數(shù)轉(zhuǎn)換模塊ADC具有16個(gè)模擬輸入通道(ADCIN0~ADCIN15),內(nèi)置采樣/保持(S/H)功能。各通道可按自動(dòng)掃描方式工作。一次掃描過(guò)程可執(zhí)行最多16個(gè)通道的自動(dòng)轉(zhuǎn)換,而每次要轉(zhuǎn)換的通道都可以通過(guò)編程來(lái)選擇。兩個(gè)獨(dú)立的最多可選擇8個(gè)模擬轉(zhuǎn)換通道的掃描排序器可以獨(dú)立工作在雙排序器模式,或者級(jí)聯(lián)之后工作在一個(gè)最多可選擇16個(gè)通道的排序器模式。在給定的排序方式下,4個(gè)排序器決定了模擬通道轉(zhuǎn)換的順序??蓡为?dú)訪(fǎng)問(wèn)的16個(gè)結(jié)果寄存器(RESULT0~RESULT15)用來(lái)存儲(chǔ)轉(zhuǎn)換結(jié)果。多個(gè)觸發(fā)源可以啟動(dòng)ADC,包括軟件啟動(dòng)、事件管理器啟動(dòng)和外部啟動(dòng)等三種。靈活的中斷控制允許在每一個(gè)轉(zhuǎn)換或每個(gè)一個(gè)序列轉(zhuǎn)換結(jié)束時(shí)產(chǎn)生中斷請(qǐng)求。排序器可以工作于啟動(dòng)/停止模式,允許多個(gè)按時(shí)間排序的觸發(fā)源去同步模數(shù)轉(zhuǎn)換。EVA和EVB可分別獨(dú)立地觸發(fā)SEQ1和SEQ2。采樣/保持采集時(shí)間窗具有獨(dú)立的預(yù)定標(biāo)控制能力。模塊具有標(biāo)定模式。

1.連續(xù)自動(dòng)排序模式

ADC排序器由兩個(gè)獨(dú)立的8態(tài)排序器SEQ1和SEQ2組成,它們也可以級(jí)聯(lián)成16態(tài)排序器SEQ。這里說(shuō)的“態(tài)”是指排序器能完成的自動(dòng)轉(zhuǎn)換的數(shù)目。單排序器(級(jí)聯(lián)16態(tài))模式和雙排序器(兩個(gè)獨(dú)立的8態(tài))模式分別示于圖7.11和圖7.12中。

SEQ1和SEQ2分別在一次排序過(guò)程中對(duì)多達(dá)8個(gè)的任意通道進(jìn)行排序轉(zhuǎn)換,每次轉(zhuǎn)換結(jié)果被保存到8個(gè)結(jié)果寄存器中,SEQ1的結(jié)果寄存器為RESULT0~RESULT7,SEQ2的結(jié)果寄存器為RESULT8~RESULT15。圖7.11級(jí)聯(lián)工作方式下自動(dòng)排序ADC結(jié)構(gòu)圖圖7.12雙排序工作方式下自動(dòng)排序ADC結(jié)構(gòu)框圖需要注意的是,在雙排序器工作模式下,“未被激話(huà)”的排序器的A/D啟動(dòng)請(qǐng)求會(huì)在“被激活”的排序器完成采樣之后自動(dòng)開(kāi)始執(zhí)行,即當(dāng)SEQ1啟動(dòng)一個(gè)觸發(fā)信號(hào)后,而SEQ2正在執(zhí)行操作,那么AD轉(zhuǎn)換器會(huì)在SEQ2的操作完成后立即響應(yīng)SEQ1的請(qǐng)求。

例如,需要使用SEQ1來(lái)完成8個(gè)通道的轉(zhuǎn)換,這8個(gè)通道是1、2、3、5、6、7、10、15,則在最大轉(zhuǎn)換通道寄存器MAXCONV1中設(shè)置7,然后設(shè)置選擇排序控制寄存器CHSELSEQn的轉(zhuǎn)換順序(在MAXCONV中填入0x07,在CHSELSEQ1中填入0x5321,在CHSELSEQ1中填入0xFA76)。轉(zhuǎn)換結(jié)果存放于ADC轉(zhuǎn)換結(jié)果緩沖寄存器RESULTn中。

2.排序器啟動(dòng)/停止模式

除了連續(xù)自動(dòng)排序模式外,任何一個(gè)排序器(SEQ1、SEQ2或SEQ)都可工作在啟動(dòng)/停止方式。在該模式下可以實(shí)現(xiàn)單獨(dú)和多個(gè)啟動(dòng)信號(hào)觸發(fā)源同步,與連續(xù)的自動(dòng)排序模式不同的是該模式下排序器完成第一個(gè)轉(zhuǎn)換后中斷不需要被復(fù)位,但是ADC控制寄存器1(ADCTRL1)的連續(xù)執(zhí)行位CONTRUN(Bit6)必須被設(shè)置為0。例如,需要完成6個(gè)通道(通道1,2,3,5,6,7)的轉(zhuǎn)換,但是一個(gè)觸發(fā)源可以啟動(dòng)3個(gè)自動(dòng)轉(zhuǎn)換,則首先需要在MAXCON1中設(shè)置2,然后再設(shè)置選擇排序控制寄存器CHSELSEQn的轉(zhuǎn)換順序(在MAXCONV中填入0x02,在CHSELSEQ1中填入0x5321,在CHSELSEQ1中填入0x0076)。設(shè)置完后,當(dāng)?shù)谝粋€(gè)觸發(fā)源到來(lái)時(shí),觸發(fā)ADC轉(zhuǎn)換,通道CONV00(I1)、CONV01(I2)、CONV02(I3)被選中執(zhí)行;當(dāng)?shù)诙€(gè)觸發(fā)源到來(lái)時(shí),再次觸發(fā)ADC轉(zhuǎn)換,通道CONV03(V1)、CONV04(V2)、CONV05(V3)被選中執(zhí)行;當(dāng)?shù)诙€(gè)觸發(fā)源轉(zhuǎn)換結(jié)束之后,SEQ1在當(dāng)前還是保持等待狀態(tài),直到第三個(gè)觸發(fā)源的來(lái)臨,用戶(hù)也可以通過(guò)軟件復(fù)位SEQ1。

ADC轉(zhuǎn)換結(jié)果緩沖寄存器(RESULTn)的地址范圍在70A8h~70B7h,結(jié)果存放格式如圖7.13所示。轉(zhuǎn)換結(jié)果數(shù)據(jù)與輸入電壓和參考電壓有關(guān),見(jiàn)式(7.5)。參考電壓為外部輸入,分上參考電壓Vrefhi和下參考電壓Vreflo兩部分。(7.6)圖7.13ADC轉(zhuǎn)換結(jié)果緩沖寄存器(RESULTn)

3.ADC模塊編程舉例

下面介紹一個(gè)ADC模塊數(shù)據(jù)采集程序。該程序用EVA的定時(shí)器2作為采樣定時(shí)時(shí)間來(lái)觸發(fā)ADC轉(zhuǎn)換的啟動(dòng)。ADC采用級(jí)聯(lián)模式,一次做0、1通道的兩個(gè)轉(zhuǎn)換。轉(zhuǎn)換完成后,在ADC中斷服務(wù)子程序中將轉(zhuǎn)換結(jié)果讀出,然后復(fù)位排序器使排序器指針指到CONV00,直到滿(mǎn)足采樣512個(gè)點(diǎn)。匯編語(yǔ)言完整程序見(jiàn)光盤(pán)的Peripheral_2407ADC_ASM子目錄,C語(yǔ)言完整程序見(jiàn)光盤(pán)的Peripheral_2407ADC_C子目錄。

匯編語(yǔ)言主程序如下:

C語(yǔ)言主程序如下:

7.3應(yīng)用系統(tǒng)軟件設(shè)計(jì)舉例

前面采用軟件仿真或硬件仿真的方法已就‘C2000系列DSP的相對(duì)獨(dú)立功能或片內(nèi)部件的使用進(jìn)行了編程,這種程序往往不具備系統(tǒng)特性,因此本章從系統(tǒng)的角度,討論應(yīng)用程序的編制、調(diào)試和代碼加載方式等,以達(dá)到離開(kāi)仿真系統(tǒng)后DSP應(yīng)用系統(tǒng)能脫機(jī)獨(dú)立運(yùn)行的目的。

7.3.1TMS320LF2407最小應(yīng)用系統(tǒng)編程舉例

第6章給出了TMS320LF2407最小應(yīng)用系統(tǒng)的硬件設(shè)計(jì)方法,這里對(duì)在該系統(tǒng)上實(shí)現(xiàn)的IIR濾波器、FIR濾波器以及基于FFT的譜分析的系統(tǒng)軟件設(shè)計(jì)方法進(jìn)行描述。

1.TMS320C2000上IIR濾波器設(shè)計(jì)

IIR濾波程序在7.1.3節(jié)的程序基本結(jié)構(gòu)中已經(jīng)做了較為詳細(xì)的介紹,在設(shè)計(jì)方法和仿真上這里不再重復(fù)。程序詳細(xì)內(nèi)容參見(jiàn)光盤(pán)中的MinSYS_2407_IIR_Sim子目錄。

而對(duì)于實(shí)際采集信號(hào)的處理,一般有兩種方法,即分段采集處理和逐點(diǎn)采集處理兩種。分段采集處理就是先采集一段時(shí)間的數(shù)據(jù),然后像靜態(tài)數(shù)據(jù)一樣用類(lèi)似前面仿真執(zhí)行的方法進(jìn)行處理。這種處理方法對(duì)周期性信號(hào)、緩變(慢速)信號(hào)能達(dá)到實(shí)時(shí)處理的要求,當(dāng)然對(duì)實(shí)時(shí)性要求不高的場(chǎng)合也適用。一個(gè)例子是采集2kHz方波信號(hào),然后濾除高次諧波得到正弦波的過(guò)程,采樣頻率是30kHz,結(jié)果如圖7.14所示,上半部分波形為采集到的方波,下半部分波形則為低通濾波后的正弦波信號(hào)。程序詳細(xì)內(nèi)容參見(jiàn)光盤(pán)中的MinSYS_2407_ADC_IIR子目錄。其它信號(hào)則需采用逐點(diǎn)采集處理方案。圖7.14實(shí)際采集濾波處理結(jié)果逐點(diǎn)采集處理則是一邊采樣、一邊處理、一邊輸出處理數(shù)據(jù)的方式。這種方法對(duì)程序編制要求較高,即不但要功能上能夠?qū)崿F(xiàn),更重要的是要解決好三者間的時(shí)序配合即實(shí)時(shí)要求。由于TMS320'C2000系列DSP的速度不是很快,因此按這種方法,它能處理的信號(hào)帶寬應(yīng)在數(shù)十千赫茲以?xún)?nèi)。這里給出一個(gè)以10kHz采樣頻率采集1kHz方波信號(hào)進(jìn)行低通濾波處理的C語(yǔ)言編程的例子。主程序如下,詳細(xì)內(nèi)容參見(jiàn)光盤(pán)中的MinSYS_2407_ADCIIR子目錄,結(jié)果見(jiàn)圖7.15。雖然兩種方法處理流程不同,但結(jié)果類(lèi)似。圖7.15逐點(diǎn)采集濾波處理情況(a)采集輸入與濾波輸出波形圖;(b)采集輸入與濾波輸出頻譜圖(a)(b)

2.TMS320‘C2000上FIR濾波器設(shè)計(jì)

實(shí)際信號(hào)的采集與FIR濾波流程基本上和上面的IIR情況一致,所不同的只是濾波器的實(shí)現(xiàn)方式。FIR濾波器很容易實(shí)現(xiàn)線(xiàn)性相位特性,因此很適合用于對(duì)波形有要求的應(yīng)用場(chǎng)合。但是FIR濾波器的效率比IIR要低得多,因此,要得到同樣的濾波效果,其階數(shù)比IIR大得多。結(jié)果是這種情況下的信號(hào)處理帶寬大約比IIR要低一個(gè)數(shù)量級(jí)。

限于篇幅,這里不再列出程序詳細(xì)內(nèi)容,分段采集處理,即以5kHz采樣率采集500Hz方波信號(hào)進(jìn)行低通濾波處理的程序參見(jiàn)光盤(pán)中的MinSYS_2407_ADC_FIR子目錄,逐點(diǎn)采集處理程序見(jiàn)光盤(pán)中的MinSYS_2407_ADCFIR子目錄。

3.TMS320‘C2000上基于FFT的譜分析

由于基于FFT的譜分析需要一個(gè)時(shí)間段的信號(hào),因此只能采用分段采集處理的方法。又由于現(xiàn)在的顯示設(shè)備很靈活,因此作譜分析時(shí)不必像以前那樣再把頻譜信號(hào)變成模擬信號(hào)后通過(guò)示波器顯示。

FFT是DFT的快速算法,DFT的輸入信號(hào)默認(rèn)為復(fù)(數(shù))信號(hào),實(shí)際應(yīng)用中,大多數(shù)信號(hào)是以實(shí)信號(hào)方式出現(xiàn),因此利用DFT的一些性質(zhì),將實(shí)信號(hào)表示成一個(gè)復(fù)信號(hào),則信號(hào)長(zhǎng)度將減少,從而減少計(jì)算量。設(shè)有長(zhǎng)度為2N的序列g(shù)(n),將其分為長(zhǎng)度為N的兩個(gè)奇偶序列:(7.7)并將這兩個(gè)奇偶序列組成一個(gè)新的復(fù)序列x(n):

x(n)=xe(n)+jxo(n)(7.8)這里,n=0,1,…,N-1。顯然,DFT[xe(n)]=Xep(k),DFT[xo(n)]=-jXop(k),DFT[x(n)]=X(k)則有

X(k)=Xep(k)+Xop(k)(7.9)令X(k)=Xr(k)+jXi(k),且令(7.10)則有(7.11)這里,k=1,2,…,N/2-1。對(duì)于其它k=0和k=N/2點(diǎn),有(7.12)

可見(jiàn),通過(guò)對(duì)組合復(fù)序列x(n)進(jìn)行FFT變換,可求出其實(shí)部Xr(k)和虛部Xi(k),通過(guò)式(7.10)~式(7.13),可求出共軛對(duì)稱(chēng)分量Xep(k)和共軛反對(duì)稱(chēng)分量Xop(k)。注意,這里是N點(diǎn)DFT。

實(shí)際上,如果有兩個(gè)序列x1(n)和x2(n),設(shè)x1(n)=xep(n),x2(n)=xop(n),則Xep(k)和Xop(k)則分別是它們各自的DFT。這樣,用一個(gè)N點(diǎn)復(fù)DFT求出了兩個(gè)N點(diǎn)實(shí)DFT,N較大時(shí),運(yùn)算量幾乎減少一半。(7.13)設(shè)長(zhǎng)度為2N的序列g(shù)(n)的DFT為G(k),令(7.14)則可推導(dǎo)出:(7.15)(7.16)其中,(7.17)這里,k=1,2,…,N/2-1。對(duì)于其它k=0、k=N/2和k=N點(diǎn),有(7.18)(7.19)(7.20)可見(jiàn),通過(guò)式(7.15)~式(7.20),再結(jié)合式(7.14),可得長(zhǎng)度為2N的序列g(shù)(n)的DFT的前半部分,即k=0,1,2…,N的G(k)。

利用實(shí)序列DFT的共軛對(duì)稱(chēng)性,可容易地求出G(k)的后半部分:

X(2N-k)=X*(k)

(7.21)

這里,k=1,2,…,N-1。

其實(shí),如果DFT是用于實(shí)信號(hào)的功率(幅度)譜分析,則只需要前半部分即可得到全部信息量。

TI公司免費(fèi)給出了128/256/512點(diǎn)實(shí)序列和復(fù)序列的FFT程序模塊,有匯編語(yǔ)言子程序和C語(yǔ)言函數(shù)兩種方式,讀者可從TI網(wǎng)站上下載。對(duì)于更多點(diǎn)數(shù)的處理,可以參照這些模塊加以擴(kuò)展。實(shí)際上,由于運(yùn)算的規(guī)范性,需要解決的只是蝶式因子而已,其它只是循環(huán)次數(shù)參數(shù)的修改。

為了減小頻譜泄漏,這些模塊中增加了數(shù)據(jù)加窗功能。使用庫(kù)函數(shù)進(jìn)行譜分析,一個(gè)實(shí)際C語(yǔ)言程序見(jiàn)光盤(pán)中的MinSYS_2407_fft512r_Sim子目錄,程序產(chǎn)生一個(gè)線(xiàn)性調(diào)頻實(shí)信號(hào),目的是為了得到一個(gè)較寬的頻帶,以便觀(guān)察。該程序結(jié)果如圖7.16所示。圖中上半部分為線(xiàn)性調(diào)頻實(shí)信號(hào),下半部分左邊為DSP基于FFT的譜分析結(jié)果,右邊為DSP開(kāi)發(fā)系統(tǒng)CC的譜分析結(jié)果??梢?jiàn)二者形狀類(lèi)似,數(shù)值的差異是因?yàn)镈SP基于FFT的譜分析未進(jìn)行定標(biāo)處理。實(shí)信號(hào)頻譜正(數(shù)字頻率0~

)

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論