級(jí)DSP控制專業(yè)技術(shù)復(fù)習(xí)_第1頁
級(jí)DSP控制專業(yè)技術(shù)復(fù)習(xí)_第2頁
級(jí)DSP控制專業(yè)技術(shù)復(fù)習(xí)_第3頁
已閱讀5頁,還剩36頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

08級(jí)《DSP控制技術(shù)》復(fù)習(xí)題及參考答案(初稿)1考試內(nèi)容以教材及其解答為主,并參考授課PPT和PMSM3-3程序2考題題型判斷題、填空題、選擇題、計(jì)算與編程題、軟件設(shè)計(jì)題、簡述題。重點(diǎn)掌握片內(nèi)外設(shè)寄存器的功能和設(shè)置及其初始化。掌握系統(tǒng)控制初始化(包括 PLL設(shè)置、系統(tǒng)時(shí)鐘設(shè)置、屏蔽看門狗,高速和低速外設(shè)時(shí)鐘設(shè)置) ;掌握GPIO的使用和ADC的使用;掌握事件管理器的使用尤其是對(duì)稱與非對(duì)稱 PWM波形的產(chǎn)生步驟;掌握PIE中斷機(jī)制及常用外設(shè)中斷的設(shè)置。了解SCI和SPI及XINTF。了解DSPC語言的特點(diǎn)和關(guān)鍵字,了解寄存器和存儲(chǔ)器的空間分配及CMD文件的編寫。掌握C/C++生成軟件模塊的方法。掌握Q格式和標(biāo)幺化方法,掌握DSP硬件設(shè)計(jì)中電平轉(zhuǎn)換、PWM區(qū)動(dòng)隔離等方法,了解無刷直流電動(dòng)機(jī)和永磁同步電動(dòng)機(jī)的原理和控制方法,掌握直流電機(jī)的 DSP實(shí)現(xiàn)。掌握應(yīng)用系統(tǒng)軟硬件調(diào)試的增量式方法。掌握根據(jù)控制框圖分解軟件模塊的方法和用軟件模塊構(gòu)建系統(tǒng)的方法。一DSP概述1DSP芯片有什么特點(diǎn)?DS肢數(shù)據(jù)格式分為哪兩類?計(jì)算機(jī)控制技術(shù)要求處理器的速度越來越高,體積越來越小,DSP的發(fā)展正好能滿足這一發(fā)展的要求。因?yàn)?,傳統(tǒng)的其它處理器都有不同的缺陷。 MCU的速度較慢;CPU體積較大,功耗較高;嵌入式CPU的成本較高。DSP的發(fā)展,使得在許多速度要求較高,算法較復(fù)雜的場(chǎng)合,取代MCU或其它處理器,而成本有可能更低。與MCU相比:速度比MCI快,主頻較高;適合于數(shù)據(jù)處理,數(shù)據(jù)處理的指令效率較高;DSP均為16位以上的處理器,不適合于低檔的場(chǎng)合,適用于復(fù)雜控制算法的實(shí)現(xiàn); DSP可以同時(shí)處理的事件較多,系統(tǒng)級(jí)成本有可能較低。DSP的靈活性較好,大多數(shù)算法都可以軟件實(shí)現(xiàn)。DSP的集成度較高,可靠性較好。與嵌入CPU相比:DSP是單片機(jī),構(gòu)成系統(tǒng)簡單;DSP的速度快;DSP的成本較低;DSP的性能高,可以處理較多的任務(wù)。DS肢數(shù)據(jù)格式分為定點(diǎn)和浮點(diǎn)DSP定點(diǎn)與浮點(diǎn)DSP的基本差異在于它們對(duì)數(shù)據(jù)的數(shù)字表示法不同。定點(diǎn)DSP嚴(yán)格執(zhí)行整數(shù)運(yùn)算,而浮點(diǎn)DSP既支持整數(shù)運(yùn)算又支持實(shí)數(shù)運(yùn)算,后者以科學(xué)計(jì)數(shù)法進(jìn)行了標(biāo)準(zhǔn)化。浮點(diǎn)DSP將數(shù)據(jù)路徑分為兩部分:一是可用作整數(shù)值或?qū)崝?shù)基數(shù)的尾數(shù),二是指數(shù)。業(yè)界標(biāo)準(zhǔn)單一精確運(yùn)算的 32位浮點(diǎn)DSP中,尾數(shù)是24位,指數(shù)是8位。動(dòng)態(tài)范圍大大高于定點(diǎn)格式提供的精確度。但需要的內(nèi)部電路多,32位數(shù)據(jù)路徑經(jīng)當(dāng)時(shí)可用定點(diǎn)器件寬1倍。晶片面積越大,引腳數(shù)量也越多,封裝也越大,成本也更高。但它支持C語言。浮點(diǎn)格式中,實(shí)數(shù)運(yùn)算可直接通過代碼加入硬件運(yùn)算中,而定點(diǎn)器件則須通過軟件才能間接運(yùn)行實(shí)數(shù)運(yùn)算。增加了算法指令與延長了開發(fā)時(shí)間。浮點(diǎn)最初用于開發(fā)工作強(qiáng)度較大的情況。所以一般定點(diǎn)DSP功耗低,成本低,而浮點(diǎn)DSP成本高,功耗大。2TI公司的TMS320有幾大系列?分別有什么特點(diǎn)?TMS32系列DSPfc要分為兩種類型:定點(diǎn)DSP芯片,浮點(diǎn)DSP芯片;相比之下,定點(diǎn)DS系列齊全,時(shí)鐘頻率略高些;浮點(diǎn)DSP適于需要大量高精度運(yùn)算的場(chǎng)合。 C2000稱之為最佳控制平臺(tái),集成有事件管理器等多種電機(jī)控制系統(tǒng)需要的外設(shè),適合電機(jī)的數(shù)字控制; C500C稱之為最低功耗平臺(tái),具有處理速度快、功耗低、相對(duì)成本低等特點(diǎn),適合便攜、消費(fèi)類電子設(shè)備;C6000稱之為最佳處理能力平臺(tái),處理速度更快、精度高,更適合圖像處理及通信設(shè)備等高端市場(chǎng)。AC2000高性能的數(shù)字控制針對(duì)數(shù)字運(yùn)動(dòng)控制系統(tǒng)設(shè)計(jì)的定點(diǎn) DSR具有強(qiáng)大的運(yùn)算和控制能力;LF24x為低成本、低功耗系列,速度可達(dá) 40MIPS;C28x系列的內(nèi)核和指令與LF24X完全兼容。主頻高達(dá)150MHz主要用于大存儲(chǔ)設(shè)備管理,高性能的控制場(chǎng)合。 TMS320C2000DSP特點(diǎn):1)唯一內(nèi)含F(xiàn)lash的DSP系列;2)唯一內(nèi)含SCI的DSP系列,易實(shí)現(xiàn)和PC機(jī)的RS232串口通信。BC5000低功耗的手持設(shè)備C5000(定點(diǎn)、低功耗)系列是目前TIDSP的主流DSP它涵蓋了從低檔到中高檔的應(yīng)用領(lǐng)域,目前也是用戶最多的系列。 C55x系列是TI的第三代DSP與54X兼容,功耗為C54xx的1/6,性能為C54xx的5倍;應(yīng)用領(lǐng)域:3G無線通信、語音處理、 GPS無線網(wǎng)絡(luò)、數(shù)碼產(chǎn)品。CC6000高性能的DSP應(yīng)用;是TI的超高性能DSP系列,功耗較大;C62xx系列是定點(diǎn)的DSP系列芯片種類較豐富,是主要的應(yīng)用系列;C64xx系列是新產(chǎn)品,性能是C62xx的10倍;C67xx系列是浮點(diǎn)的DSP用于需要高速浮點(diǎn)處理的領(lǐng)域;應(yīng)用領(lǐng)域:寬帶網(wǎng)絡(luò)、無線基站、 3D圖象、語音識(shí)別、多媒體系統(tǒng)。DC3X系列是高性能的32位浮點(diǎn)DSP具有較高的性價(jià)比, 適于那些數(shù)據(jù)動(dòng)態(tài)范圍大、精度高的應(yīng)用;推薦使用VC33;C3x系列是TI浮點(diǎn)DSP的基礎(chǔ)。應(yīng)用領(lǐng)域:工業(yè)自動(dòng)化和機(jī)器人、視頻會(huì)議、語音處理、汽車電子、計(jì)算機(jī)外設(shè)。1-3DSP芯片主要有哪些特點(diǎn)?采用哈佛結(jié)構(gòu),程序和數(shù)據(jù)存儲(chǔ)空間分開,可以同時(shí)訪問指令和數(shù)據(jù)。具有專用硬件乘法器,可在一個(gè)指令周期內(nèi)完成一次乘法和一次加法。支持流水線操作,使取指、譯碼和執(zhí)行等操作可以重疊執(zhí)行。可以并行執(zhí)行多個(gè)操作,具有特殊的DSP指令。片內(nèi)具有快速RAM,通??赏ㄟ^獨(dú)立的數(shù)據(jù)總線在兩塊中同時(shí)訪問,具有片內(nèi)多總線結(jié)構(gòu)。具有在單周期內(nèi)操作的多個(gè)硬件地址產(chǎn)生器,單周期指令??焖俚闹袛嗵幚砗陀布蘒/O支持。4常用的DSP芯片有哪些?TI公司:TMS320系列DSP已經(jīng)成為當(dāng)今世界最有影響的DSP芯片,其DSP市場(chǎng)占有量占全世界份額的近50%,為世界上最大的DSP芯片供應(yīng)商;Motorola公司:MC96002;ADI(AnalogDevice)公司:AD2100;MicroChip:dSC;AT&T:DSP16/32二DSP28121簡述2812DSP的內(nèi)部結(jié)構(gòu)主要部分的功能。CPU、片內(nèi)存儲(chǔ)器、片內(nèi)外設(shè) (片內(nèi)接口電路)F28xDSP的硬件資源

F280116■B160ns;1D.6a/32/12xSPI,SCI.CAN,1=0F28063210I160ns/10.616/44/24xSP|p2xSCI.CAN,l2CF2808.64ieI160ns710.816/44/24xSPId2xSCL2xCAN.I2CF281064ie80ns/10.116/NA6/2SPI,2xSCIdCAN,McBSPF281112818SOns/10.116/NA6/2SPIt2XSCI,CAN,McBSPF2812128IS80ns/10.116/NA6/2SPI,2xSCLCAN,McBSP,EMIF2-2指出下列符號(hào)的物理意義ACC(AH、AL)累加器XT(T、TL)乘法寄存器P(PHP(PH、PL)DPSPXAR0~XAR7數(shù)據(jù)頁指針堆棧指針輔助寄存器0~7AR0~AR7 輔助寄存器0~7的低16位PC 程序計(jì)數(shù)器RPC 程序返回計(jì)數(shù)器ST0ST1IFR狀態(tài)寄存器0狀態(tài)寄存器1中斷標(biāo)志奇存器IERDBGIER中斷使能寄存器調(diào)試中斷使能寄存器。2-3狀態(tài)寄存器STO^STl有什么作用?DSP控制器含有兩個(gè)狀態(tài)寄存器ST0和ST1,它們含有各種狀態(tài)和控制位。狀態(tài)寄存器的內(nèi)容可以被保存到數(shù)據(jù)存儲(chǔ)器, 也可以從數(shù)據(jù)存儲(chǔ)器中進(jìn)行加載。 在子程序調(diào)用或者進(jìn)入中斷子程序時(shí),實(shí)現(xiàn)CPU狀態(tài)態(tài)的保存;在退出子程序或從中斷子程序返回前,將 CPU的狀態(tài)回返。ST0累加器具有相關(guān)狀態(tài)位信息保存在狀態(tài)寄存器ST0中。ST0主要用于算術(shù)邏輯運(yùn)算,并且只能在流水線的E階段進(jìn)行修改,其中,OVM、OVC/OVCUV主要用于控制算術(shù)邏輯運(yùn)算中的溢出保護(hù)功能,N,ZC用于對(duì)運(yùn)算結(jié)果做出指示,PM用于位移操作。表中的保留位讀出時(shí)為1。ST1ST1主要用于尋址邏輯控制,其中,XFMOMIMAPOBJMODEF兼容模式的選擇,AMODEPAGE0ELLOW和SPA用于指示和控制CPU的尋址方式。IDIESTATLOO用于指示CPU的工作狀態(tài),INTM實(shí)現(xiàn)中斷使能的設(shè)置。位6EALLOW仿真讀取使能位。復(fù)位時(shí),該位允許對(duì)仿真和其它寄存器進(jìn)行讀取。EALLOW可由AEALLOW置位,由EDIS指令清0。當(dāng)CPU服務(wù)于某一中斷時(shí),EALLOW

清0。然而,在中斷服務(wù)子程序ISR的開始就去讀到仿真寄存器是不允許的。如果 ISR必須讀取仿真寄存器,它必須包含一個(gè)EALLOW指令,在ISR的結(jié)束,可用IRET指令進(jìn)行恢復(fù)。位0INTM中斷全局屏蔽位。該位可全局使能和禁止所有的 CPU可屏蔽中斷。0可屏蔽中斷被全局使能。為被 CPU確認(rèn),必須由中斷使能寄存器 IER產(chǎn)生局部使能的可屏蔽中斷。1可屏蔽中斷被全局禁止。即使可屏蔽中斷由 IER局部使能,也不能被CPU確認(rèn)。但對(duì)非屏蔽中斷、硬件復(fù)位和硬件中斷 NMI沒有影響。另外當(dāng)CPU在實(shí)時(shí)仿真模式下暫停時(shí),即使INTM已置為屏蔽,仍可由IER和DBTIER激活一個(gè)可屏蔽中斷。2-4哪些片內(nèi)外設(shè)的寄存器是受 EALLOW保護(hù)的?受EALLOW保護(hù)即CPU不能寫。在CPU狀態(tài)寄存器ST1的EALLOW指明了寄存器的保護(hù)狀態(tài)。復(fù)位后,EALLOW清0,使能EALLOW保護(hù)。只允許CPU讀,JTAG讀和寫。執(zhí)行EALLOW指令,即EALLOW位置1,CPU可寫寄存器。修改完畢后,執(zhí)行 EDIS指令,EALLOW位清0,保護(hù)這些寄存器不被CPU寫了。下列寄存器受EALLOW保護(hù):DSP仿真寄存器;Flash寄存器;CSM寄存器;PIE矢量表;系統(tǒng)控制寄存器; GPIOMUX寄存器;特定的eCAN寄存器。外部存儲(chǔ)器及I/O擴(kuò)展XINTFZone0/1,Zone2,Zone6/7,1M+32K。通過數(shù)據(jù)線XD0-XD15、地址線XA0-XA18及控制信號(hào)線擴(kuò)展。典型的DSP應(yīng)用系統(tǒng)多采用最小系統(tǒng),即系統(tǒng)由一個(gè)F2810DSP芯片加上相應(yīng)的電源、時(shí)鐘、復(fù)位、JTAG電路及應(yīng)用電路構(gòu)成,這種系統(tǒng)也稱為單片系統(tǒng)方案 (SingleChipSolution)。在程序調(diào)試過程中,可以先將程序放入到 H0SARAM、L0SRAM和L1SARAM中運(yùn)行仿真調(diào)試,對(duì)于程序長度小于16K時(shí)比較方便。調(diào)試完成后,再將程序放入 Flash存儲(chǔ)器中運(yùn)行。5DSP2812由哪此片內(nèi)外設(shè)組成?片內(nèi)外設(shè)有事件管理器A、BADCWDMCBSPCANSCIA、B、SPI和GPIQ其中只有ADC輸入,WD俞出,其它外設(shè)都是可雙向流動(dòng)的。CPU內(nèi)部有存儲(chǔ)器總線掛有算術(shù)邏輯單元、 乘法器和輔助寄存器。內(nèi)部數(shù)據(jù)總線是 32位,地址總線是22位。其中EV是控制器特有的部件而有別于C5000和C6000。主要就是用來完成速度和位置數(shù)字部件的信號(hào)輸入和處理,提供速度反饋和位置反饋。 MCBSP是多通道緩沖串口; CANSCI、SPI是通信接口模塊。F2812主頻最高可達(dá)150MHZ內(nèi)部集成128KB的Flash存儲(chǔ)器,4KB的BootROMF系列與C系列的區(qū)別是F系列帶Flash,而C系列不帶。2810可以說是28XX系列的最小系統(tǒng)。與2812相比,2810不帶外部擴(kuò)展接口XINTF也無外部總線。三DSP軟件開發(fā)基礎(chǔ)1DSPC語言有何特點(diǎn)?數(shù)據(jù)類型C語言的每個(gè)數(shù)據(jù)類型都有與之對(duì)應(yīng)的類型名保留字,由于 281x中數(shù)據(jù)的最小長度為16位,因此所有的字符(char)型數(shù)據(jù),包括有符號(hào)字符型(signedchar)和無符號(hào)字符型(unsignedchar),長度均為16位,即用一個(gè)字的長度表示。數(shù)據(jù)類型的其它特點(diǎn)有:所有的整型(char,short,int,以及對(duì)應(yīng)的無符號(hào)類型)都是等效的,用16位二進(jìn)制值表示;長整型和無符號(hào)長整型用32位二進(jìn)制值表示。有符號(hào)數(shù)用2s補(bǔ)碼符號(hào)表示。char是有符號(hào)數(shù),等效于int。枚舉類型enumf弋表16位值,在表達(dá)式中enum與int等效。 所有的浮點(diǎn)類(float、double、longdouble)等效,表示成IEEE單精度格式。2DSPC語言有哪些關(guān)鍵字?TMS320C28xC/C++編譯器支持標(biāo)準(zhǔn)的 const、register、volatile等關(guān)鍵字,另外還擴(kuò)展了cregister、interrupt、near、far等關(guān)鍵字。const該關(guān)鍵字可以使你更優(yōu)化存儲(chǔ)器的分配。你可以加 const到任何變量或陣列的定義以確保其內(nèi)的值不改變。例如在下例中,定義了一個(gè) const型的PIE_VECT_TABLE類型的結(jié)構(gòu)變量PieVectTableInit:interruptvoidPIE_RESERVED(void)//Reservedspace.Fortest.{asm("ESTOP0");for(;;);}conststructPIE_VECT_TABLEPieVectTableInit={PIE_RESERVED,//ReservedspacePIE_RESERVED,//Reservedspace}其中PIE_VECT_TABLE是一個(gè)存放中斷矢量表的結(jié)構(gòu), PieVectTableInit是該結(jié)構(gòu)的一個(gè)變量,其中定義了所有中斷函數(shù)的起始地址。由于這些地址在 Flash中都固化好,不會(huì)改變,因此在聲明PieVectTableInit前可以加const以表示其中的變量內(nèi)容是常數(shù),不會(huì)改變。volatile編譯時(shí)優(yōu)化器會(huì)分析數(shù)據(jù)的流動(dòng),盡可能避免對(duì)存儲(chǔ)器的讀寫。因此如果你要編寫 C弋碼對(duì)存儲(chǔ)器進(jìn)行讀寫操作,就必須用volatile關(guān)鍵字確定這些操作,以此來說明所定義的變量是可變的”,是可以被DSP中的其它硬件修改的,而不是僅僅只能由 C程序本身修改。用volatile關(guān)鍵字修飾的變量會(huì)被分配到非初始化塊。編譯器不會(huì)對(duì) volatile變量做任何優(yōu)化。cregister編譯器擴(kuò)充了C,增加了cregister關(guān)鍵字,從而允許高級(jí)語言讀寫控制寄存器。當(dāng)你對(duì)一個(gè)對(duì)象加cregister修飾時(shí),編譯器比較對(duì)象和IER(中斷使能寄存器)、IFR(中斷標(biāo)志寄存器)的名字。如果名字相符,編譯器產(chǎn)生對(duì)控制寄存器操作的弋碼;如果名字不符,編譯器提示一個(gè)錯(cuò)誤。cregister關(guān)鍵字僅用于文件范圍內(nèi), 不能用于函數(shù)內(nèi)的聲明。 而且cregister只能用于整型或指針,不能用于浮點(diǎn)、結(jié)構(gòu)或聯(lián)合等類型。cregister并沒有指明對(duì)象是否是volatile,如果控制寄存器是volatile的(即可以被外部控制所修改),該對(duì)象就應(yīng)該同時(shí)用volatile聲明。在281xC中,cregister僅限于IER、IFR,因此程序中必須有如下聲明:externcregistervolatileunsignedintIER;externcregistervolatileunsignedintIFR;在聲明了寄存器后,就可以直接用它了。 注意IFR只能用|(或)操作和&(與)操作,例:IFR|=0x100;IFR&=0x100;interrupt28xC/C++編譯器增加了interrupt關(guān)鍵字用來說明一個(gè)函數(shù)是一個(gè)中斷函數(shù)。中斷函數(shù)有一些特殊的地方,如寄存器保存和返回順序。當(dāng)一個(gè)函數(shù)用 interrupt定義后,編譯器就自動(dòng)加入基于中斷函數(shù)的寄存器內(nèi)容保存和特殊的中斷返回順序的部分。pragma對(duì)象pragma對(duì)象告訴編譯器的預(yù)處理器如何對(duì)待函數(shù)。 TMS320C28XC/C++支持如下的pragma:CODE_SECTION(func,“sectionname”)DATA_SECTION(symbol,“sectionname”)INTERRUPT(func)FUNC_EXT_CALLED(func)FAST_FUNC_CALL(func)其中,func和symbol必須在函數(shù)外聲明或定義。同時(shí)也必須在函數(shù)外指定 pragma,而且必須在聲明、定義、引用func和symbol之前指定pragma。不這樣做編譯器會(huì)產(chǎn)生警告錯(cuò)誤。CODE_SECTIONCODE_SECTION為func在一個(gè)名為sectionname的塊中指定空間。如果你有一個(gè)代碼對(duì)象并想將其鏈接到不同于.txt的空間時(shí),該語法就非常有用。 C的標(biāo)準(zhǔn)用法是:#pragmaCODE_SECTION(func,“sectionname”);例:charbufferA[80];//bufferA是全局變量#pragmaCODE_SECTION(funcA,“codeA”);charfuncA(inti);//對(duì)函數(shù)funcA的聲明voidmain(){charc;c=funA(1);//對(duì)函數(shù)funcA的引用}charfuncA(inti)//函數(shù)funcA的定義{returnbufferA[i];}在上例中,函數(shù)代碼塊funcA被定位于codeA段中。codeA段在.cmd文件中規(guī)定了物理地址。DATA_SECTIONDATA_SECTION為symbol在一個(gè)名為sectionname的塊中指定空間。如果你有一個(gè)數(shù)據(jù)對(duì)象并想將其鏈接到不同于.bss的空間時(shí),該語法就非常有用。 C的標(biāo)準(zhǔn)用法是:#pragmaDATA_SECTION(symbol,“sectionname”);例:#pragmaDATA_SECTION(bufferB,“my_sect”);charbufferB[512];//對(duì)bufferB的定義放在pragma的后面數(shù)據(jù)塊bufferB被定位于my_sect段中,my_sect段在.cmd文件中規(guī)定了物理地址。farC/C++編譯器的默認(rèn)尋址空間是64K。所有指針的默認(rèn)大小為16位。C28x支持的尋址空間達(dá)4MI字,即22位。加上far關(guān)鍵字限定符的指針大小為 22位,可以尋址4M字空間。3-3DSPC語言中如何用實(shí)現(xiàn)寄存器及存儲(chǔ)器的硬件抽象?DSP2812^以用匯編語言和C語言編寫程序代碼。由于系統(tǒng)時(shí)鐘高,運(yùn)行速度快,大多采用C語言編程。同單片機(jī)一樣, DSP勺C語言也是面向硬件的C語言。對(duì)硬件的操作就是對(duì)寄存器的操作。用C語言實(shí)現(xiàn)寄存器的硬件抽象是關(guān)鍵。 不同于MCUDSP2812及C5000、C6000系統(tǒng)符合嵌入式系統(tǒng)C語言規(guī)范EC++。通過pragma偽指令告訴編譯器如何對(duì)待特定的函數(shù)、對(duì)象或代碼段。TMS320C28XC/C++編譯器支持如下形式的pragma偽指令:CODE_SECTION(fun“c,sectionname”);DATA_SECTION(symbo“l(fā),sectionname”);注意:func和symbol必須在函數(shù)外聲明或定義。同時(shí), pragma偽指令也必須在函數(shù)外,且位于聲明、定義或引用func和symbol之前,否則,編譯器會(huì)給出警告信息。寄存器的定義采用結(jié)構(gòu)體、共用體、位域結(jié)構(gòu)體定義寄存器變量,并虛擬一個(gè)外設(shè)寄存器結(jié)構(gòu)體,它包含了相應(yīng)外設(shè)如E\勺勺所有寄存器及位定義。其寄存器定義在DSP281x_Ev.h文件中,此文件中還定義了函數(shù)原型和外部定義如:externvolatilestructEVA_REGSEvaRegs;externvolatilestructEVB_REGSEvbRegs;extern將此結(jié)構(gòu)變量說明為外部變量;volatile意思為“可變的”,所修飾的變量會(huì)被分配到非初始化段,編譯器不會(huì)對(duì)此變量進(jìn)行任何優(yōu)化。是可以由 DSF中的其它硬件修改的,而不僅僅只能由C程序本身。由于寄存器都是映射到數(shù)據(jù)存儲(chǔ)器,要編寫 C代碼對(duì)存儲(chǔ)器進(jìn)行讀/寫操作,必須用volatile關(guān)鍵字確定這些操作。而函數(shù)原型在文件DSP281x_GlobalPrototypes.h中定義,如externvoidInitAdc(void);externvoidInitEv(void);externvoidKickDog(void);externvoidDisableDog(void);等。在全局變量和為命名段名的段中符號(hào)分配空間文件DSP281x_GlobalVariableDSP281x中,通過pragma偽指令將寄存器變量分配到數(shù)據(jù)段。如#pragmaDATA_SECTION(AdcRegs,"AdcRegsFile");DSP281x^卜設(shè)寄存器鏈接命令文件 DSP281x_Headers_nonBIOS.cmd中,通過MEMOR偽指令指示寄存器的實(shí)際硬件空間如ADC:origin=0x007100,length=0x000020DSP281x^卜設(shè)寄存器鏈接命令文件 DSP281x_Headers_nonBIOS.cmd中通過SECTION偽指令將寄存器數(shù)據(jù)段分配到 實(shí)際硬件空間。如AdcRegsFile:>ADC,PAGE=1存儲(chǔ)器的映射也類似于寄存器,但簡單得多,只需在命令文件中分配到實(shí)際硬件空間。一般在存儲(chǔ)器F2812程序在RAM運(yùn)行時(shí)的連接命令文件F2812_EzDSP_RAM_lnk.cmd中。這樣就將用結(jié)構(gòu)變量AdcRegs、PieVectTable等描述的AD(寄存器、中斷矢量表和真正的硬件地址對(duì)應(yīng)起來。因此用戶在使用時(shí)就完全可以不用考慮具體的硬件地址映射問題。其他硬件的編程方法類似。3-4C/C++工程項(xiàng)目由哪些文件組成?各自的功能是什么?

一個(gè)DSP應(yīng)用,在TI公司的集成開發(fā)環(huán)境CCS(codecomposerstudio)中組織成一個(gè)項(xiàng)目(project)。項(xiàng)目通常由以下文件組成:(1)C語言程序(.c)(2)頭文件(.h)(3)庫文件(rts2xx.lib)(4)命令文件(.cmd)(5)復(fù)位和中斷向量文件vectors.asm其中只一個(gè).c文件含有main(),稱為主程序,其它.c文件可是一些相關(guān)的子程序, 如中斷、初始化子程序等,這些都是可執(zhí)行的 .c文件。編譯程序在編譯時(shí)會(huì)分別編譯所有的文件再用鏈接器將所有的.OBJ文件鏈接起來。另外,.h文件按照各種外設(shè)和CPU資源定義了各種寄存器。上述絕大部分子程序其實(shí)都不用用戶自己編寫,在TI公司的免費(fèi)例程中已經(jīng)寫好,用戶只需要稍加修改,并加入自己的主程序,就可編寫出自己的工程文件。這也就是用 C語言編程上手快的原因之一。DSP281x_SysCtrl.h系統(tǒng)控制寄存器定義DSP281x_PieVect.hPIE矢量表定義DSP281x_PieCtrl.hPIE控制寄存器定義DSP281x_DefaultIsr.h缺省中斷服務(wù)定義DSP281x_XIntrupt.h外部中斷寄存器定義DSP281x_Adc.hADC寄存器定義DSP281x_CpuTimers.hCPU寄存器定義DSP281x_Ecan.hEcan寄存器定義DSP281x_Ev.h事件管理器寄存器定義DSP281x_Gpio.h通用IO寄存器定義DSP281x_Mcbsp.hMcbsp寄存器定義DSP281x_Sci.hEcan寄存器定義DSP281x_Spi.hEcan寄存器定義DSP281x_Ecan.hEcan寄存器定義DSP281x_Xintf.hXintf 寄存器定義DSP281x_Xintf.hXintf 寄存器定義DSP281x_SWPrioritizedIsrLevels.h軟件優(yōu)先級(jí)定義#defineDINTasm("#defineDINTasm("setcINTM"#defineERTMasm("clrcDBGM"#defineDRTMasm("setcDBGM"#defineEALLOWasm("EALLOW")#defineEINTasm("clrcINTM"#defineEDISasm("EDIS")#defineESTOP0asm("ESTOP0")還有常用中斷的數(shù)字定義,寄存器位定義,#ifndefDSP28_DATA_TYPES#defineDSP28_DATA_TYPEStypedefintint16;typedeflongint32;DSP281x_Dvice.h28XX元件定義,包括常用CPU寄存器如IFR,IER,常用匯編的預(yù)編譯))))DSPC語言數(shù)據(jù)類型定義如typedefunsignedintUint16;typedefunsignedlongUint32;typedeffloatfloat32;typedeflongdoublefloat64;#endif并包含了所有外設(shè)的頭文件DSP281x_GlobalPrototypes.h全局函數(shù)原型forDSP28ExamplesexternvoidInitAdc(void);externvoidInitPeripherals(void);externvoidInitECan(void);externvoidInitEv(void);externvoidInitGpio(void);externvoidInitMcbsp(void);externvoidInitPieCtrl(void);externvoidInitPieVectTable(void);externvoidEnableInterrupts(void);externvoidInitSci(void);externvoidInitSpi(void);externvoidInitSysCtrl(void);externvoidInitXintf(void);externvoidInitXIntrupt(void);externvoidInitPll(Uint16val);externvoidInitPeripheralClocks(void);externvoidKickDog(void);externvoidDisableDog(void);在相應(yīng)的.c文件中規(guī)定了寄存器的初始化函數(shù)及其缺省值。DSP281x_PieCtrl.cPIE控制寄存器初始化函數(shù)DSP281x_PieVect.cPIE矢量表初始化函數(shù)DSP281x_DefaultIsr.c缺省中斷服務(wù)路線DSP281x_GlobalVariableDefs.c全局變量和數(shù)據(jù)段程序DSP281x_GlobalVariableDefs.cDSP281x 全局變量和數(shù)據(jù)段3-5與教材中C語言的函數(shù)模塊相比,類模塊具有以下優(yōu)點(diǎn):1函數(shù)名比變量名穩(wěn)定。所有的接口使用公有的成員函數(shù)而不是公有的數(shù)據(jù)成員。 代價(jià)是即便是簡單的輸入輸出(本可以通過變量賦值來實(shí)現(xiàn)的)也須通過成員函數(shù)來完成。函數(shù)調(diào)用是有額外開銷的。是以降低效率來換取可維護(hù)性的一種策略。 C++可通過在類的內(nèi)部定義函數(shù)或用關(guān)鍵字inline實(shí)現(xiàn)內(nèi)聯(lián),來減少函數(shù)開銷。TI采用賦值語句來完成對(duì)象的輸出輸入功能。2相對(duì)于C,C++可節(jié)省全局符號(hào)資源相對(duì)于函數(shù),對(duì)象是更抽象的概念對(duì)象是更大的容器以數(shù)據(jù)為中心是更為合理的模塊提供了改進(jìn)如構(gòu)造函數(shù)、關(guān)鍵詞private等pvivate有利于信息的隱藏,防止誤pvivate有利于信息的隱藏,防止誤3-6面向DSP的C/C++是如何實(shí)現(xiàn)類的?C語言沒有關(guān)鍵字class但可用結(jié)構(gòu)體來實(shí)現(xiàn)類。通過typedef實(shí)現(xiàn)指針的簡潔定義以類名加后綴”_Handle"表示指針TypedefSTUD*STUD_Handle;typedefstruct{_iqAs;_iqBs;_iqAlpha;_iqBeta;void(*calc)();}CLARKE;typedefCLARKE*CLARKE_handle;對(duì)象的初始化C語言沒有自動(dòng)初始化的構(gòu)造函數(shù)機(jī)制,每次定義對(duì)象時(shí),可以用結(jié)構(gòu)體的初始化來模擬構(gòu)造函數(shù),實(shí)現(xiàn)對(duì)象的初始化,作為簡化,初始化值用宏定義來代替#defineCLARKE_DEFAULTS{0,\0,\0,\0,\(void(*)(Uint32))clarke_calc}TI的例程中,對(duì)象中所變量都作了初始化;防止漏寫,所有類的定義都是變量在前,函數(shù)指針在后,要浪費(fèi)內(nèi)存。必須初始化所有的變量后才能對(duì)必須有所指的函數(shù)指針做初始化。3-7TI算法模塊C/C++規(guī)范Module.htypedefstructmodule_data{intin,pastIn,result;//Persistentdata,coefficientsetc.void(*calc)()//Pointertocalculationfunction}MODULE;#defineMODULE_DEFAULTS{0,0,0,(void(*)(Uint32))module_calcModule.cvoidmodule_calc(MODULE*p){//computecodep->result=p->pastIn+p->In;p->pastIn=p->In;}Client.cMODULEmod=MODULE_DEFAULTS;voidsomefunc(void){intfoo;

mod.in=10;//coefficientconfigurationmod.calc(&mod);foo=mod.result;//Useresult}3-8以CLARKE變換\PARK變換為例,說明TI軟件模塊的規(guī)范。As CLARKEAlpha L ?解答:1首先,確定模塊的輸入輸出,并增加對(duì)應(yīng)的頭文件進(jìn)行定義類、定義缺省值即初始化化值,并定義函數(shù)原型。typedefstruct{_iqAs;//Input:phase-astatorvariable_iqBs;//Input:phase-bstatorvariable_iqAlpha;//Output:stationaryd-axisstatorvariable_iqBeta;//Output:stationaryq-axisstatorvariablevoid(*calc)();//Pointertocalculationfunction}CLARKE;typedefCLARKE*CLARKE_handle;//DefaultinitalizerfortheCLARKEobject.#defineCLARKE_DEFAULTS{0,\0,\0,\0,\(void(*)(Uint32))clarke_calc}//PrototypesforthefunctionsinCLARKE.Cvoidclarke_calc(CLARKE_handle);2在C文件中,根據(jù)算法原理編寫函數(shù)。include"IQmathLib.h" //IncludeheaderforIQmathlibrary//Don'tforgettosetaproperGLOBAL_Qin"IQmathLib.h"file#include"dmctype.h"#include"clarke.h"voidclarke_calc(CLARKE*v){v->Alpha=v_>As;v->Beta=_IQmpy((v->As+_IQmpy(_IQ(2),v->Bs)),_IQ(0.57735026918963));//1/sqrt(3)=0.57735026918963}3-9系統(tǒng)初始化即時(shí)鐘模塊和鎖相環(huán)初始化降低對(duì)硬鎖相環(huán)的目的是外部時(shí)鐘允許較低的工作頻率,片內(nèi)通過鎖相環(huán)倍頻提供較高的系統(tǒng)時(shí)鐘,這可有效降低系統(tǒng)對(duì)外部時(shí)鐘的依賴和電磁干擾, 提高系統(tǒng)啟動(dòng)和運(yùn)行的可靠性,件設(shè)計(jì)的要求。降低對(duì)硬外設(shè)時(shí)鐘控制寄存器PCLKCR系統(tǒng)控制與外設(shè)狀態(tài)寄存器SCSR高速外設(shè)時(shí)鐘定標(biāo)寄存器HISPCP低速外設(shè)時(shí)鐘定標(biāo)寄存器LOSPCP鎖相環(huán)倍頻寄存器PLLCRvoidInitSysCtrl(void) //系統(tǒng)初始化子程序{EALLOW; //#defineEALLOWasm(“EALLOW”)宏定義SysCtrlRegs.PLLCR=0x000A;//初始化鎖相環(huán),OSCCLK=30MHz//DIV=0x0A,CLKIN=30MHz*10/2=150MHzasm(“NOP”);asm(“NOP”);for(i=0;i<3000;i++){;} //延時(shí),等待鎖相環(huán)穩(wěn)定SysCtrlRegs.HISPCP.all=0x0000;//HSPCLK=SYSCLKOUT=150MHzSysCtrlRegs.LOSPCP.all=0x0002;//LSPCLK=SYSCLKOUT/4=37.5MHzSysCtrlRegs.PCLKCR.bit.EVAENCLK=1; //使能EVASysCtrlRegs.PCLKCR.bit.EVBENCLK=1; //使能EVBSysCtrlRegs.PCLKCR.bit.SCIENCLKA=1; //使能SCI_A//SysCtrlRegs.PCLKCR.bit.SCIENCLKB=1;//不用的外設(shè)不使能,//以降低功耗SysCtrlRegs.PCLKCR.bitADCENCLK=1; //使能ADCEDIS;//#defineEDISasm( “EDIS”)宏定義}3-10看門狗定時(shí)器281xDSP內(nèi)置了一個(gè)看門狗定時(shí)器(WDT),用來監(jiān)視DSP的運(yùn)行狀況。當(dāng)系統(tǒng)進(jìn)入不可預(yù)知的狀態(tài)而造成“死機(jī)”時(shí),WD將產(chǎn)生一個(gè)復(fù)位操作,從而使DSP進(jìn)入一個(gè)已知的起始位置重新運(yùn)轉(zhuǎn)。如果CPU崩潰一旦8位的看門狗計(jì)數(shù)器達(dá)到最大計(jì)數(shù)值,看門狗模塊就產(chǎn)生一個(gè)512個(gè)OSCCLK周期寬的脈沖,使DSP復(fù)位或中斷被觸發(fā)。為防止計(jì)數(shù)器溢出,CPU必須周期性的向看門狗KEY寄存器寫入0X55+0XAA序列,在復(fù)位之后(30M外部時(shí)鐘)3ms之內(nèi)看門狗必須被啟用或者禁止。因?yàn)?81x上電時(shí)看門狗是使能的,所以要盡快屏蔽,以免程序跑飛。上電后 SCSR寄存器中的WDOVERRIDE位為1,即允許WDCR寄存器中的WDDIS位被修改,所以不用先對(duì)WDOVERRIDE位操作就能修改WDDIS位。8位WD計(jì)數(shù)寄存器:WDCNTRWD復(fù)位鑰匙寄存器:WDKEYWD定時(shí)器控制寄存器:WDCRWDKEY:如果先寫入0x55,在寫入0xAA就會(huì)使WDCNTR清零。寫入任何其他數(shù)值則馬上使DSP復(fù)位。讀操作返回的是WDCR寄存器的值。voidKickDog(void){EALLOW;//允許CPU對(duì)寄存器進(jìn)行操作SysCtrlRegs.WDKEY=0x0055;//防止WD溢出SysCtrlRegs.WDKEY=0x00AA;//EDIS;//禁止CPU對(duì)寄存器進(jìn)行操作}voidDisableDog(void){EALLOW;SysCtrlRegs.WDCR=0x0068;//屏蔽看門狗,以免程序跑飛EDIS;}3-11281xDSP有哪些32位CPU定時(shí)器?如何使用?F281x與240x相比,增加了三個(gè)32位CPU定時(shí)器0/1/2。CPU定時(shí)器1和2保留給實(shí)時(shí)操作系統(tǒng)(RTOS),只有CPU定時(shí)器0留給用戶使用。配置CPU定時(shí)器就是設(shè)置周期寄存器,由給定的 DSP時(shí)鐘頻率Freq(MHz)和定時(shí)器周期Period(q)兩個(gè)參數(shù)確定。初始化后定時(shí)器處于停止?fàn)顟B(tài)。必須在主程序中啟動(dòng)。voidConfigCpuTimer(structCPUTIMER_VARS*Timer,floatFreq,floatPeriod){unsignedlongtemp;Timer->CPUFreqInMHz=Freq; //InitializetimerperiodTimer->PeriodInUSec=Period;temp=(long)(Freq*Period); //150MHzX100us=15000Timer->RegsAddr->PRD.all=temp;Timer->RegsAddr->TPR.all=0; //Setpre-scalecountertodivideby1Timer->RegsAddr->TPRH.all=0;//Initializetimercontrolregister:Timer->RegsAddr->TCR.bit.TSS=1/0; //1=Stoptimer,0=StartTimerTimer->RegsAddr->TCR.bit.TRB=1; //1=reloadtimerTimer->RegsAddr->TCR.bit.SOFT=1;Timer->RegsAddr->TCR.bit.FREE=1; //TimerFreeRunTimer->RegsAddr->TCR.bit.TIE=1; //1=EnableTimerInterrupt}3-11PIE中斷控制F281X共支持17個(gè)CPU級(jí)中斷,包括一個(gè)NMI和16個(gè)可屏蔽中斷(INT1?INT14,RTOSINT和DLOGINT)。外設(shè)中斷擴(kuò)展模塊(PIE)中多個(gè)中斷源復(fù)用1個(gè)中斷信號(hào)。PIE支持多達(dá)96個(gè)中斷源,其中8個(gè)中斷源為一組,復(fù)用一個(gè)中斷信號(hào),總共有 12個(gè)中斷信號(hào)(INT1?INT12)PIE的中斷優(yōu)先級(jí)由高到低分別是 INT1—INT12,組內(nèi)8個(gè)優(yōu)先級(jí)由高到低的次序依次是 INTx.1-INTx.8。每個(gè)中斷源都有相應(yīng)的中斷向量存放在RAM中,構(gòu)成整個(gè)系統(tǒng)的中斷向量表來存在中斷服務(wù)程序的地址,中斷向量表由 256X16位的SRAM構(gòu)成,每個(gè)中斷矢量占用兩個(gè) 2個(gè)16位的地址空間。F281X支持三個(gè)外部中斷,INT1、INT2和INT13,其中INT13和NMI復(fù)用,每個(gè)外部中斷可以使能/屏蔽、設(shè)定為上升/下降沿觸發(fā)。中斷系統(tǒng)包括三個(gè)層次:外設(shè)級(jí)、PIE級(jí)和CPU級(jí)例配置CPU定時(shí)器0產(chǎn)生定時(shí)中斷,每次中斷LED的狀態(tài)切換一次(0/1)外設(shè)中斷的編程:1)定義使用的外設(shè)中斷矢量表

2)外設(shè)級(jí)中斷控制寄存器初始化--InitPieCtrl()3)CPU級(jí)中斷控制寄存器和外設(shè)和外設(shè)中斷矢量的初始化 --main()4)中斷服務(wù)程序2)外設(shè)級(jí)中斷控制寄存器初始化--InitPieCtrl()3)CPU級(jí)中斷控制寄存器和外設(shè)和外設(shè)中斷矢量的初始化 --main()4)中斷服務(wù)程序--ISRTimer0()1)定義使用的外設(shè)中斷矢量表采用位域結(jié)構(gòu)方式,在中斷矢量表中定義所有的中斷矢量,如外設(shè)中斷組conststructPIE_VECT_TABLEPieVectTableInit={1(INT1)。PDPINTA_ISR,PDPINTB_ISR,rsvd_ISR,XINT1_ISR,XINT2_ISR,ADCINT_ISR,TINT0_ISR,WAKEINT_ISR,//EV-A//EV-B//ADC//Timer0//WD};2)外設(shè)級(jí)中斷控制寄存器初始化--InitPieCtrl()voidInitPieCtrl(void){DINT;//關(guān)CPU級(jí)中斷PieCtrlRegs.PIECRTL.bit.ENPIE=0;//PieCtrlRegs.PIEIER1.all=0;PieCtrlRegs.PIEIER2.all=0;關(guān)PIE級(jí)中斷//清除所有的PIEIER寄存器PieCtrlRegs.PIEIER12.all=0;PieCtrlRegs.PIEIFR1.all=0;PieCtrlRegs.PIEIFR2.all=0;//清除所有的PIEIFR寄存器PieCtrlRegs.PIEIFR12.all=0;PieCtrlRegs.PIECRTL.bit.ENPIE=1;//PieCtrlRegs.PIEACK.all=0xFFFF;theCPU允許PIE中斷//寫1清0,EnablesPIEtodriveapulseinto3)CPU級(jí)中斷控制寄存器初始化和外設(shè)和外設(shè)中斷矢量的初始化 --main()voidmain(void){InitSysCtrl(); //初始化系統(tǒng)控制DINT;//關(guān)中斷IER=0x0000;//CPUIER清0IFR=0x0000;//CPUIFR清0InitPieCtrl(); //初始化PIEInitPieVectTable(); //初始化PIE中斷矢量表,僅用于方法1InitPeripherals(); //初始化外設(shè),可以根據(jù)需要配置,見系統(tǒng)初始化程序EALLOW;PieVectTable.TINT0=&ISRTimer0; //方法1//*TINT0=(unsignedlong)ISRTimer0;//方法2EDIS;ConfigCpuTimer(&CpuTimer0,150,1000000);//配置CPU定時(shí)器0為1秒CpuTimer0Regs.TCR.bit.TSS=0;//起動(dòng)CPU定時(shí)器0PieCtrl.PIEIER1.all=0x40;//使能CPU定時(shí)器0中斷IER|=0x0001;EINT;//EnableGlobalinterruptINTMfor(;;) {……}}4)中斷服務(wù)程序--ISRTimer0()#defineLED1_ON GpioDataRegs.GPFDAT.bit.GPIOF11=0#defineLED1_OFF GpioDataRegs.GPFDAT.bit.GPIOF11=1//PIEGroup1-MUXedintoCPUINT1interruptvoidISRTimer0(void){PieCtrl.PIEACK.all|=0x0001;if(Led_Flag==1){LED1_ON;Led_Flag=0;}else{LED1_OFF;Led_Flag=1;}}voidInitPieVectTable(void)//InitializesthePIEvectortabletoaknownstate.{int16i;Uint32*Source=(void*)&PieVectTableInit;Uint32*Dest=(void*)0x000D00;EALLOW;for(i=0;i<128;i++)*Dest++=*Source++;EDIS;PieCtrlRegs.PIECRTL.bit.ENPIE=1; //EnablethePIEVectorTable}3-12通用I/OF281X器件上有56個(gè)多功能復(fù)用引腳,通過GPxMUX寄存器可配置為外設(shè)信號(hào)或數(shù)字I/O引腳;

如果配置為數(shù)字I/O引腳,可以通過方向寄存器(GPxDIR)控制引腳為輸入或輸出; 通過量化寄存器(GPxQUAL)設(shè)定量化采樣周期(QUALPRD),消除輸入信號(hào)中的毛刺干擾。用GPxSET和GPxCLEAR寄存器對(duì)數(shù)字量進(jìn)行置位或清零,還可通過 GPxDAT寄存器獨(dú)立讀寫I/O信號(hào)。GPxMUX寄存器GPxMUX.bit:0—配置為I/O方式;1—配置為外設(shè)方式GPxDIR寄存器GPxDIR.bit:0—配置為數(shù)字輸入;1—配置為數(shù)字輸出GPxDAT寄存器GPxDAT.bit:輸入方式讀引腳狀態(tài),輸出方式設(shè)定狀態(tài)GPxSET寄存器GPxSET.bit: 1—輸出方式下引腳置高電平GPxCLEAR寄存器GPxCLEAR.bit: 1—輸出方式下引腳置低電平GPxTOGGLE寄存器GPxTOGGLE.bit:1—輸出方式下將引腳電平置反例如:GpioDataRegs.GPFDAT.bit.GPIOF10=0通用I/O的初始化voidInitGpio(void)//ThisfunctioninitializestheGpiotoaknownstate.voidInitGpio(void)EALLOW; //設(shè)置GPIOA引腳,AL(7:0)為輸入-AH(15:8)為輸出GpioMuxRegs.GPAMUX.all=OxOOOO;GpioMuxRegs.GPADIR.all=OxFFOO;GpioMuxRegs.GPAQUAL.all=OxOOOO;GpioDataRegs.GPADAT.all=0xAA00;//setsGPIOMuxsasI/OsGpioMuxRegs.GPAMUX.all=OxOOOO;GpioMuxRegs.GPADIR.all=OxFFOO;GpioMuxRegs.GPAQUAL.all=OxOOOO;GpioDataRegs.GPADAT.all=0xAA00;//setsGPIOMuxsasI/Os//upperbyteasoutput/lowbyteasinput//Inputqualifierdisabled//ToggleI/OsusingDATAregisters4恥4恥GpioDataRegs.GPASET.all=OxAAOO;//ToggleI/OsusingSET/CLEARregistersGpioDataRegs.GPACLEAR.all=0x5500;GpioDataRegs.GPATOGGLE.all=OxFFOO;//ToggleI/OsusingTOGGLEregisters//SetGPIOBportpins,configuredasEVBsignalsGpioMuxRegs.GPBMUX.all=OxFFFF;//ConfigureperipheralssignalsonthepinsGpioMuxRegs.GPBQUAL.all=OxOOOO;//Inputqualifier=0(disabled)EDIS;}例點(diǎn)亮發(fā)光二極管voidmain(void){InitSysCtrl(); //系統(tǒng)初始化子程序,DSP28_sysctrl.c中EALLOW;GpioMuxRegs.GPBDIR.bit.GPIOBO=1;〃設(shè)置D1對(duì)應(yīng)的DSP引腳為輸出EDIS;GpioDataRegs.GPBDAT.bit.GPIOB0=0;//D1對(duì)應(yīng)輸出低電平,發(fā)光二極管點(diǎn)亮GpioDataRegs.GPBDAT.bit.GPIOBO=1;//D1對(duì)應(yīng)輸出高電平,發(fā)光二極管不亮GpioDataRegs.GPBCLEAR.bit.GPIOBO=1;//寫一清零GPIOB0

GpioDataRegs.GPBSET.bit.GPIOB0=1;//寫一置位GPIOB0GpioDataRegs.GPBTOGGLE.bit.GPIOB0=1;//寫一取反GPIOB0輸出GpioDataRegs.GPBTOGGLE.bit.GPIOB0=1;〃寫一取反GPIOBO輸出while(1);}例3.51個(gè)LED旨示燈接到DSP通過擴(kuò)展的外部簡單接口電路的最低位 ,其地址為OxcOOOO。采用通用定時(shí)器T1中斷方式定時(shí)200ms,用C語言編程使之閃爍, 即引腳上產(chǎn)生周期為400ms的方波,XCLKIN=30MHz,SYSCLKOUT=150MHz#include"DSP281x_Device.h" //DSP281x寄存器頭文件interruptvoideva_timer1_isr(void);voidEVA_Timer1() //{EvaRegs.GPTCONA.all=0; //EvaRegs.T1PR=0x9895;interruptvoideva_timer1_isr(void);voidEVA_Timer1() //{EvaRegs.GPTCONA.all=0; //EvaRegs.T1PR=0x9895;EvaRegs.EVAIMRA.bit.T1PINT=1;EvaRegs.EVAIFRA.bit.T1PINT=1;EvaRegs.T1CNT=0x0000;EvaRegs.T1CON.all=0x1740;初始化EVATimer1//定時(shí)周期為5.12us*(T1PR+1)=0.2s//使能定時(shí)器1的周期中斷//寫1清除定時(shí)器1的周期中斷標(biāo)志計(jì)數(shù)寄存器從0開始//連續(xù)增計(jì)數(shù),128分頻,打開定時(shí)器main(){InitSysCtrl();〃初始化DSP運(yùn)行時(shí)鐘,時(shí)鐘頻率150MHzEALLOW;SysCtrlRegs.HISPCP.all=0x0003;//高速時(shí)鐘頻率=25MHzEDIS;DINT; //關(guān)閉總中斷IER=0x0000; //清中斷使能IFR=0x0000; //清中斷標(biāo)志InitPieCtrl(); //初始化PIE控制寄存器InitPieVectTable(); //初始化PIE中斷向量表EVA_Timer1(); //初始化EVATimer1EALLOW;PieVectTable.T1PINT=&eva_timer1_isr;//中斷服務(wù)程序入口地址放入中斷向量表EDIS;〃依次使能各級(jí)中斷:外設(shè)中相應(yīng)中斷位->PIE控制器->CPUPieCtrlRegs.PIEIER2.all=M_INT4;〃GP定時(shí)器1使能位于PIE第2組第4個(gè),將其使能IER|=M_INT2; //使能的PIE第2組可屏蔽中斷2(INT2)EINT; //開總中斷LBDS=O;//指示燈全滅while(1){;}//等待中斷}interruptvoideva_timer1」sr(void){LBDSA=1; //產(chǎn)生方波,最低位指示燈亮滅切換EvaRegs.EVAIMRA.bit.TIPINT=1; //使能定時(shí)器1的周期中斷EvaRegs.EVAIFRA.bit.TIPINT=1; //寫1清除定時(shí)器1的周期中斷標(biāo)志PieCtrlRegs.PIEACK.all=PIEACK_GROUP2;//清零PIEACK中的第2組中斷對(duì)應(yīng)位3-13ADC初始化及其應(yīng)用ADCCLK最高為25MHz。AD專換流程配置AD(啟動(dòng)的觸發(fā)源;配置ADCTRL1設(shè)定ADC寸鐘預(yù)定標(biāo)系數(shù)、轉(zhuǎn)換時(shí)鐘預(yù)定標(biāo)FCLK采樣轉(zhuǎn)換模式、ADC中斷優(yōu)先級(jí)、級(jí)聯(lián)排序器或雙排序器選擇;配置ADCTRL2ADC勺啟動(dòng)信號(hào)源、軟件復(fù)位排序器指針、軟件觸發(fā)或清除 ADC言號(hào)源、中斷方式;配置MAXCONV設(shè)定一次自動(dòng)轉(zhuǎn)換的通道個(gè)數(shù);配置CHSELSEQx設(shè)定多路ADC輸入通道;等待觸發(fā)源;轉(zhuǎn)換完成后讀RESULTx獲取轉(zhuǎn)換結(jié)果;ADC寸鐘定標(biāo)ADCTRLl[U-8](AC<J^PS[54)])ADCTHL3[4i1](ADCLKPS[10]JAD(內(nèi)核時(shí)鐘和采樣保持時(shí)鐘XCWNAD(內(nèi)核時(shí)鐘和采樣保持時(shí)鐘XCWNSHclock/pulse通往ADC勺時(shí)鐘鏈例,A/D轉(zhuǎn)換程序。采用雙排序器和順序采樣模式,排序器SEQ對(duì)兩個(gè)模擬輸入通道ADCINA0和ADCINA的電壓信號(hào)進(jìn)行自動(dòng)轉(zhuǎn)換。排序器采用事件管理器EVA(T1)的下溢中斷標(biāo)志作為觸發(fā)啟動(dòng)信號(hào)。使用AD(模塊的中斷方式,每次排序結(jié)束(EOS)都產(chǎn)生中斷。在中斷服務(wù)程序中,讀取模擬量的轉(zhuǎn)換結(jié)果并存儲(chǔ)到兩個(gè)長度為1024的數(shù)組Voltage1和Voltage2中。#include"DSP281x_Device.h" //DSP281xHeaderfileIncludeFileinterruptvoidadc_isr(void);//Globalvariablesusedinthisexample全局變量定義Uint16(onversion(ount;//轉(zhuǎn)換次數(shù)計(jì)數(shù)Uint16Voltage1[1024];Uint16Voltage2[1024];main(){InitSys(trl(); //初始化(PUDINT; //關(guān)中斷InitPieCtrl(); 〃初始化pie寄存器IER=0x0000;//禁止所有的中斷IFR=0x0000;InitPieVectTable();〃初始化pie中斷向量表EALLOW;//ThisisneededtowritetoEALLOWprotectedregisterPieVectTable.ADCINT=&adc_isr;EDIS;//ThisisneededtodisablewritetoEALLOWprotectedregistersAdcRegs.ADCTRLI.bit.RESET=1; //復(fù)位ADC模塊asm(”RPT#10||NOP");II等待12個(gè)時(shí)鐘周期使ADC復(fù)位產(chǎn)生作用AdcRegs.ADCTRL3.all=0x00C8;//ADC參考電壓與帶隙基準(zhǔn)電路上電AdcRegs.ADCTRL3.bit.ADCBGRFDN=0x3;AdcRegs.ADCTRL3.bit.ADCPWDN=1; IIADC其它電路上電IIEnableADCINTinPIEPieCtrlRegs.PIEIER1.bit.INTx6=1;IER|=M_INT1;IIEnableCPUInterrupt1EINT; IIEnableGlobalinterruptINTMERTM; IIEnableGlobalrealtimeinterruptDBGMLoopCount=0;ConversionCount=0;II配置ADCAdcRegs.ADCMAXCONV.all=0x0001; II設(shè)置SEQ1轉(zhuǎn)換通道數(shù)為2AdcRegs.ADCCHSELSEQ1.bit.CONVOO=0x0;II設(shè)置ADCINA0為第1個(gè)轉(zhuǎn)換通道AdcRegs.ADCCHSELSEQ1.bit.CONV01=0x1;II設(shè)置ADCIN10為第2個(gè)轉(zhuǎn)換通道AdcRegs.ADCTRL2.bit.EVA_SOC_SEQ1=1; II選擇EVA啟動(dòng)SEQ1轉(zhuǎn)換AdcRegs.ADCTRL2.bit.lNT_ENA_SEQ1=1;II使能EVA啟動(dòng)SEQ1轉(zhuǎn)換II配置EVAIIAssumesEVAClockisalreadyenabledinInitSysCtrl();EvaRegs.T1CMPR=0x0080; II設(shè)定T1比較值EvaRegs.T1PR=0x10; II設(shè)置T1周期寄存器EvaRegs.GPTCONA.bit.T1TOADC=1;II設(shè)置EVA(T1)下溢事件啟動(dòng)ADCEvaRegs.T1CON.all=0x1042; 〃設(shè)置T1為連續(xù)增模式,并啟動(dòng)定時(shí)器1while(1)LoopCount++;〃等待ADC中斷interruptvoidadc_isr(void){Voltage1[ConversionCount]=AdcRegs.ADCRESULT0>>4;Voltage2[ConversionCount]=AdcRegs.ADCRESULT1>>4;//If40conversionshavebeenlogged,startoverif(ConversionCount==1023){ConversionCount=0;}elseConversionCount++;//ReinitializefornextADCsequenceAdcRegs.ADCTRL2.bit.RST_SEQ1=1; //ResetSEQ1AdcRegs.ADCST.bit.INT_SEQ1_CLR=1; //ClearINTSEQ1bitPieCtrlRegs.PIEACK.all=PIEACK_GROUP1;//AcknowledgeinterrupttoPIEreturn;}編程采用雙排序器和順序采樣模式 ,排序器SEQ1寸兩個(gè)模擬輸入通道ADCINA刑ADCINA6勺電壓信號(hào)進(jìn)行自動(dòng)轉(zhuǎn)換。排序器采用事件管理器 EVA(T1)的周期匹配中斷標(biāo)志作為觸發(fā)啟動(dòng)信號(hào),T1定時(shí)50卩s。使用AD(模塊的中斷方式,每次排序結(jié)束 (EOS)都產(chǎn)生中斷。在中斷服務(wù)程序中,讀取模擬量的轉(zhuǎn)換結(jié)果并存儲(chǔ)到兩個(gè)長度為 200的數(shù)組Voltagel和Voltage2中。設(shè)CPU寸鐘頻率為150MHz3-14SPI與XINTF有什么區(qū)別?串行外設(shè)接口(SPI)是一種同步串行輸入/輸出接口,傳輸速率最高可達(dá) 37.5Mbps,信號(hào)線少(2-4條),適于板級(jí)擴(kuò)展的外設(shè)輸入/輸出接口,適于板級(jí)微處理器間通信。外部擴(kuò)展接口(XINTF)是一種并行輸入/輸出接口,傳輸速率較很高,可達(dá) 75MX16=1200Mbps,信號(hào)線多(DB16、AB19、CB11),限用于板級(jí)擴(kuò)展外設(shè)的輸入/輸出接口。3-15SPI與SCI有什么區(qū)別?串行外設(shè)接口(SPI)是一種同步串行輸入/輸出接口,傳輸速率較高(LSPCLK/4),適于板級(jí)通信。串行通信接口(SCI)是一種異步串行接口,通常需經(jīng)過收發(fā)器進(jìn)行電平轉(zhuǎn)換,通信速率較低,適于長距離通信。通常用于DSP與擴(kuò)展外設(shè)以及其它處理器間進(jìn)行通信,如顯示驅(qū)動(dòng)器、ADC、DAC、EPROM、RTC以及主從模式的多處理器應(yīng)用等。 F2812包含一個(gè)SPI接口,支持16級(jí)的接受和傳輸FIFO。四事件管理器及其應(yīng)用281xDSP提供兩個(gè)完全相同的事件管理器模塊 EVA/EVB事件管理器非常適用于運(yùn)動(dòng)控制和電機(jī)控制領(lǐng)域。每個(gè)事件管理器包括:通用定時(shí)器GPT,比較單元與PWM電路,捕獲單元,正交脈沖編碼電路QEP。通用定時(shí)器通用定時(shí)器x包括以下16位可讀寫的寄存器:(EVA:x=1,2;EVB:x=3,4) :定時(shí)器計(jì)數(shù)器TxCNT,定時(shí)器周期寄存器TxPR,定時(shí)器比較寄存器TxCMPR定時(shí)器控制寄存器TxCON通用定時(shí)器的輸入包括:內(nèi)部高速時(shí)鐘 HSPCL。外部時(shí)鐘TCLKINA/B,最高頻率不超過CPU時(shí)鐘的1/4。方向輸入TDIRA/B,控制定時(shí)器增/減計(jì)數(shù)的方向。復(fù)位信號(hào) RESET用于QEP電路時(shí),QEF產(chǎn)生定時(shí)器的時(shí)鐘和方向。通用定時(shí)器的輸出包括:通用定時(shí)器比較輸出 TxCMP,x=1,2,3,4。為ADC模塊提供ADC轉(zhuǎn)換啟動(dòng)信號(hào)。為自身比較邏輯和比較單元提供下溢、上溢、比較匹配和周期匹配信號(hào)。 計(jì)數(shù)方向指示位。通用定時(shí)器的比較輸出可以高電平有效、低電平有效、強(qiáng)制高或強(qiáng)制低,與 GPTCONA/B控制寄存器的設(shè)置有關(guān)。當(dāng)比較輸出高 (低)電平有效同時(shí)在第一次比較匹配時(shí),比較輸出由低變?yōu)楦?由高變?yōu)榈?。如果通用定時(shí)器配置為遞增/遞減計(jì)數(shù)模式,則在第二次比較匹配或周期匹配時(shí),比較輸出從高至低 (由低至高)。當(dāng)定時(shí)器的比較輸出設(shè)置為強(qiáng)制高(低)時(shí),它立即變?yōu)楦?低)電平。定時(shí)器計(jì)數(shù)方向寄存器GPTCONA/中的相應(yīng)位反映了通用定時(shí)器的計(jì)數(shù)方向:1代表遞增計(jì)數(shù);0代表遞減計(jì)數(shù)。通用定時(shí)器的時(shí)鐘可以采用內(nèi)部CPU時(shí)鐘或外部時(shí)鐘作為時(shí)鐘源,外部時(shí)鐘通過 TCLKINA/B引腳提供。外部時(shí)鐘的頻率必須小于或等于內(nèi)部 CPU頻率的1/4。在定向增/減計(jì)數(shù)模式下,通用定時(shí)器2(EVA)和通用定時(shí)器4(EVB)可以使用QEP電路,此時(shí)QEP電路為定時(shí)器提供時(shí)鐘和方向輸入。通用定時(shí)器中斷在通用定時(shí)器的EVAIFRAEVAIFRBEVBIFRA和EVBIFRB寄存器中有16個(gè)中斷標(biāo)志,當(dāng)發(fā)生下列事件時(shí),每個(gè)通用定時(shí)器可產(chǎn)生 4個(gè)中斷。上溢(Overflow),TxOFINT(x=1~4)。下溢(Underflow),TxUFINT(x=1~4) 。比較匹配(Comparematch),TxCINT(x=1~4)。周期匹配(Periodmatch),TxPINT(x=1~4) 。通用定時(shí)器的計(jì)數(shù)操作模式通用定時(shí)器的有四種工作模式停止 /保持模式

連續(xù)增計(jì)數(shù)模式定向增/減模式連續(xù)增/減模式?通用定時(shí)器的比較操作非對(duì)稱波形的產(chǎn)生通用定時(shí)器連續(xù)增計(jì)數(shù)模式下的比較 /PWMI連續(xù)增計(jì)數(shù)模式定向增/減模式連續(xù)增/減模式?通用定時(shí)器的比較操作非對(duì)稱波形的產(chǎn)生通用定時(shí)器連續(xù)增計(jì)數(shù)模式下的比較 /PWMI輸出sPWM/TtcCMPapciivehigh對(duì)稱波形的產(chǎn)生通用定時(shí)器連續(xù)增減計(jì)數(shù)模式下的比較 /PWMI輸出//例,利用GP定時(shí)器1在GPI0B5引腳上產(chǎn)生周期為1s的方波,//令一個(gè)LED閃爍〃XCLKIN=30MHz,SYSCLKOUT=150MHz#inelude"DSP281x_Device.h"interruptvoideva_timer1」sr(void);intcounter; //全局變量軟件計(jì)數(shù)器,擴(kuò)大定時(shí)時(shí)間voidEVA_Timer1(){EvaRegs.GPTCONA.all=0; //EvaRegs.TIPR=0x249; //EvaRegs.EVAIMRA.bit.TIPINT=1;//EvaRegs.EVAIFRA.bit.TIPINT=1;//EvaRegs.TICNT=0x0000;EvaRegs.T1CON.all=0x1740; //初始化EVATimer1定時(shí)周期為1.707us*(T1PR+1)=1ms使能定時(shí)器1的周期中斷寫1清除定時(shí)器1的周期中斷標(biāo)志連續(xù)增計(jì)數(shù),128分頻,開啟定時(shí)器}voidmain(void)//初始化系統(tǒng)控制寄存器//初始化系統(tǒng)控制寄存器,時(shí)鐘頻率150MHzInitSysCtrl();

//高速時(shí)鐘的工作頻率HSPCL長25MHzEALLOW;GpioMuxRegs.GPBMUX.all=0;//把GPIOB般置為一般I/O口關(guān)閉總中斷,清除中斷標(biāo)志//關(guān)閉外圍中斷//關(guān)閉總中斷,清除中斷標(biāo)志//關(guān)閉外圍中斷//清中斷標(biāo)志//初始化PIE控制寄存器DINT; //IER=0x0000;IFR=0x0000;InitPieCtrl();InitPieVectTable();EVA_Timer1();EALLOW;PieVectTable.T1PINT=&eva_timer1_isr;//中斷服務(wù)程序入口地址放入中斷向量表EDIS;//依次使能各級(jí)中斷:外設(shè)中相應(yīng)中斷位->PI

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論