版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、DSP+ARM轉(zhuǎn)載DSP中斷設(shè)置簡明教程定時器,工作,寄存器,通用,程序一、簡述本文介紹TMS320C6000系列中斷設(shè)置的簡明方法。通過示例定時器中斷,MCBSP串口接收中斷及外部中斷這三種中斷實現(xiàn)過程,介紹如何實現(xiàn)中斷各個寄存器的配置,中斷向量表書寫以及中斷服務(wù)函數(shù)。最后提供一個簡要的示例程序可供大家下載使用。此示例在DSK6416的TI官方實驗板上通過測試。由于定時器和串口工作模式較繁,因此對中斷無關(guān)部分不做介紹。二、實現(xiàn)DSP中斷需要做哪些通用工作設(shè)置允許哪些非屏蔽中斷設(shè)置各個允許的非屏蔽中斷的中斷來源設(shè)置開啟總中斷設(shè)計中斷向量表將中斷向量表通過cmd文件掛載到指令內(nèi)存提供中斷處理函數(shù)
2、如果中斷向量表首地址掛載的不是0地址,那么需要設(shè)置中斷向量表地址寄存器對于不同的中斷源,需要做各個自己的工作,比如如果是外部中斷,那么需要設(shè)置管腳極性,即由高-低產(chǎn)生中斷抑或反之。為了照顧知識較少的讀者,下面將從一個新工程出發(fā),引導(dǎo)大家建立一個中斷示例程序。如果您對建立工程很熟悉,可以跳過此步。三、建立新工程1.點擊Project-New,設(shè)置ProjectName為intexample,ProjectType為Executable,Target選擇您需要的器件,在此由于本人使用的是DSK6416評估板。因此選擇TMS320C64XX。2.添加標(biāo)準(zhǔn)庫rts6400.lib,以便自動產(chǎn)生c_in
3、t00等函數(shù)。右擊當(dāng)前工程,選擇“AddFilestoProject”,選擇庫所在路徑,一般為CCS安裝自帶,可參考本CCS3.1版本的路徑地址:CCStudio_v3.1C6000cgtoolslibrts6400.lib如果您使用的是其他器件類型,請在lib文件夾內(nèi)選擇其他器件庫。添加源文件,選擇File-New-SourceFile,保存為main.c到工程路徑下。在此文件內(nèi)書寫主函數(shù)。voidmain(voidwhile(1;最后通過如2步驟添加此文件到工程。3.添加寄存器別名定義頭文件。在本示例中,對需要用到的寄存器定義別名后,構(gòu)成global.h文件,內(nèi)容在后文逐步介紹。在此可以建
4、立一個空文件,并在main.c中包括它。includeglobal.h到此,一個DSP的新工程框架制作完畢。4.添加cmd鏈接文件為了實現(xiàn)鏈接時內(nèi)存配置,我們需要提供一個cmd文件,為了方便,可以從官方的示例程序中拷貝一份,再加以修改。在安裝目錄下D:CCStudio_v3.1tutorial器件類型hellol示例下,會找到一個hello1.cmd,將其拷貝到本工程目錄下,并將其改名為link.cmd,最后將其添加到工程中。由于此文件沒有聲明stack和heap,會產(chǎn)生警告,如果動態(tài)數(shù)據(jù)較多也容易溢出。因此我們最好在此文件提供stack和heap的大小,其值可根據(jù)實際情況調(diào)整,修改后,此文件
5、內(nèi)容類似為:-stack0 x1000-heap0 x1000MEMORYISRAM:origin=0 x0,len=0 x1000000SECTIONS.vectorsISRAM.textISRAM.bssISRAM.cinitISRAM.constISRAM.farISRAM.stackISRAM.cioISRAM.sysmemISRAM至此,工程建立完畢,可以編譯一遍,觀察是否正常。intexample.pjt-Debugmain.cD:CCStudio_v3.1C6000cgtoolsbincl6x-g-frD:/intexample/Debug-d_DEBUG-mv6400-Debu
6、g.lkfmain.cLinking.D:CCStudio_v3.1C6000cgtoolsbincl6x-Debug.lkfBuildComplete,0Errors,0Warnings,0Remarks.四、定時器中斷設(shè)計首先,我們先實現(xiàn)一個定時器中斷,因為它不受外部影響,容易測試。在global.h文件中,加入控制寄存器和中斷寄存器別名定義,另外為了使用定時器1,也應(yīng)對其別名進(jìn)行定義:externcregistervolatileunsignedintAMR;externcregistervolatileunsignedintCSR;externcregistervolatileunsi
7、gnedintIFR;externcregistervolatileunsignedintISR;externcregistervolatileunsignedintICR;externcregistervolatileunsignedintIER;externcregistervolatileunsignedintISTP;externcregistervolatileunsignedintIRP;externcregistervolatileunsignedintNRP;externcregistervolatileunsignedintIN;externcregistervolatile
8、unsignedintOUT;#defineMUXH0 x019C0000#defineMUXL0 x019C0004#defineEXTPOL0 x019C0008#defineCTL10 x01980000/Timer1controlregister#definePRD10 x01980004/Timer1periodregister#defineCNT10 x01980008/Timer1counterregister之后,在main函數(shù)中對定時器進(jìn)行初始化,在此我們使用Timerl,參數(shù)初始化函數(shù)如下:voidTimerl_Init(void*(volatileunsignedint*
9、CTLl=0 x0000020l;/計數(shù)器功能設(shè)置*(volatileunsignedint*PRDl=0 xl000;/計數(shù)器周期值*(volatileunsignedint*CTLl|=0 x000000C0;/計數(shù)器清零,啟動并在主函數(shù)中調(diào)用它隨后我們設(shè)置中斷寄存器參數(shù)DSP支持1個RESET中斷,1個NMI(不可屏蔽中斷),12個可屏蔽中斷(INT4-15),它們具有優(yōu)先級順序,INT4最高,INT15最低。每個中斷號都可以設(shè)置任何中斷來源。在此我們選擇中斷INT10,即開啟中斷10,并設(shè)置其中斷來源為定時器1,即在MUXH或MUXL中指定位上填寫中斷來源選擇碼:中斷來源選擇碼定義如下
10、:(此內(nèi)容可以通過幫助中搜索INTSEL得到)INTSEL(InterruptSelectionNumberDeion00000bDSPINTHostporthosttoDSPinterrupt00001bTINT0Timer0interrupt00010bTINT1Timer1interrupt00011bSD_INTEMIFSDRAMtimerinterrupt00100bEXT_INT4Externalinterrupt400101bEXT_INT5Externalinterrupt500110bEXT_INT6Externalinterrupt600111bEXT_INT7Extern
11、alinterrupt701000bEDMA_INTEDMAchannel(0-15interrupt01001-01011bReserved01100bXINT0McBSP0transmitinterrupt01101bRINT0McBSP0receiveinterrupt01110bXINT1McBSP1transmitinterrupt01111bRINT1McBSP1receiveinterrupt10000-11111bReserved從中得到定時器1的中斷選擇碼為00010。MUXH和MUXL的寄存器定義如下:(也可以通過幫助得到)MUXH位中斷來源30-26INTSEL1525-
12、21INTSEL1420-16INTSEL1314-10INTSEL129-5INTSEL114-0INTSEL1031,15位保留,填0MUXL位中斷來源30-26INTSEL925-21INTSEL820-16INTSEL714-10INTSEL69-5INTSEL54-0INTSEL431,15位保留,填0因此,我們設(shè)置MUXH的第4-0位為定時器1的中斷選擇碼00010,其余位可以任意設(shè)置(在此可以填1。轉(zhuǎn)換為16進(jìn)制后,設(shè)置如下:*(volatileunsignedint*MUXH=0 x7fff7fe2;MUXL可以不設(shè)置。開啟中斷到IE10,使能全局中斷:IER|=0 x0000
13、0402;/IE10=1CSR|=0 x00000001;/全局中斷使能以上就完成了中斷參數(shù)的配置,中斷啟動并且可以進(jìn)入了。下面是中斷的處理過程。主要分為設(shè)計中斷向量表和中斷處理函數(shù)。我們可以從DSPCCS的示例中復(fù)制一份向量表的雛形。例如CCStudio_v3.1tutorialdsk6416hello1vectors.asm將其拷貝到本工程目錄下并加入工程中。中斷向量表包含了16個中斷處理單元,每個單元限制必須是8條指令。如果不夠8條,可以用nop填充,(但nop4算1條語句),如果服務(wù)程序過多,那么可以制作專門的中斷服務(wù)程序,此時此表只起到跳轉(zhuǎn)作用,這樣CPU就可以正確尋址找到正確的中斷
14、服務(wù)入口。首先分析一下此文件。文件開始定義了一個宏,用于處理未用到的中斷。unused.macroid.globalunused:id:unused:id:bunused:id:;nestedbranchestoblockinterruptsnop4bunused:id:nopnopnopnopnop它的做法是讓程序進(jìn)入死循環(huán),我認(rèn)為這種做法未必最優(yōu),因此我建議使用直接返回的方式。返回到被中斷地址,對于可屏蔽中斷為birp,因此將此宏部分替換成,注意一定要湊夠8條。unused.macroid.globalunused:id:unused:id:birpnopnopnopnopnopnopno
15、p.endm這樣,即使我們誤開啟了此中斷,也會順利返回。當(dāng)然,如果我們確信的確沒有開啟,那么其內(nèi)容是無意義的。代碼的正文部分用了一系列unusedn來插入此宏,起到占地的作用。由于NMI的返回與可屏蔽中斷不同,它在向量表中位于RESET之下,即unused1,我們將其刪除,替換為NMI:bnrpnopnopnopnopnopnopnop為了實現(xiàn)定時器1中斷的處理,我們將unused10刪除,替換為我們自己的中斷跳轉(zhuǎn)程序,如下:INT10:stwb0,*-b15mvkl_xint0_isr,b0mvkh_xint0_isr,b0bb0ldw*b15+,b0nop3nopnop另外,需要和語句:.
16、ref_c_int00;Centrypoint類似,添加處理程序的引用.ref_xint0_isr;timer1interrupthandler由于中斷向量表的位置需要特定指明,且應(yīng)對齊到400H,在此文件中,已經(jīng)定義了段名:.sect.vectors因此我們需要將此.vector代碼段掛載到專門的一段指定內(nèi)存區(qū)域。修改link.cmd鏈接文件,加入INT區(qū)域,起點為0地址。其大小為400H,將原先的ISRAM起始點修改。并將SECTIONS中的.vector指向自己定義的內(nèi)存區(qū)域。MEMORYINT:origin=0 x00000000,len=0 x0000400ISRAM:origin=
17、0 x00000400,len=0 x1000000SECTIONS.vectorsINT中斷向量表設(shè)置、安裝完畢最后,設(shè)計中斷服務(wù)函數(shù),在main.c中添加:interruptvoidxint0_isr(void注意,一定要標(biāo)識interrupt關(guān)鍵字,用于產(chǎn)生中斷返回語句birp,同時,此函數(shù)的入口參數(shù)和出口參數(shù)應(yīng)為void。如果需要更新變量,可以通過全局變量的方式。另外,C語言函數(shù)名稱與匯編相差一個“_”請在設(shè)計中斷向量表時注意添加。經(jīng)過上述步驟, 整個定時器中斷的制作過程就完成了。 此時可以在interruptvoidxint0_isr(void上添加一個斷點,運行后應(yīng)該停在此處。如果
18、進(jìn)入失敗,可以先在vector.asm的INT10:stwb0,*-bl5句上設(shè)置斷點,如果沒有進(jìn)入此處,證明中斷沒有進(jìn)來,可以檢查是否在參數(shù)設(shè)置上出現(xiàn)了問題。五、外部中斷設(shè)計DSP6000系列提供了INT4-7四個中斷輸入管腳,因此可以通過此四個管腳的輸入電平變化實現(xiàn)外部中斷。對于電平變化的極性,分為高到低,低到高兩種,因此,DSP采用寄存器EXTPOL來設(shè)置。EXTPOL只有低4位有效,分別代表INT4-7,對于每個位有:0:低-高產(chǎn)生中斷1:高-低產(chǎn)生中斷因此設(shè)置它即可完成極性變化。下面,以設(shè)置外部端口INT7中斷,并將其掛載到12號中斷為例,簡述實現(xiàn)過程:將12號中斷設(shè)置為外部中斷7,
19、即MUXH(4:0)=00111,此時MUXH設(shè)置為:*(volatileunsignedint*MUXH=0 x7fff7ce2;/0111110011100010將IER的第12位開啟。IER|=0 x00001402;/IE10=1IE12=1對vectors.asm的unused12替換為:INT12:stwb0,*-b15mvkl_extint7_isr,b0mvkh_extint7_isr,b0bb0ldw*b15+,b0nop3nopnop并添加引用.ref_extint7_isr在main.c中加入服務(wù)函數(shù):interruptvoidextint7_isr(void在硬件上,對
20、INT7/GPIO7管腳產(chǎn)生一個低-高的信號,貝冋以觸發(fā)出中斷。若改變此極性,可以設(shè)置EXTPOL第四位為1:*(volatileunsignedint*EXTPOL|=0 x00000008;此時,一個高-低的信號可以產(chǎn)生中斷。需要注意的是,如果你對GPIO進(jìn)行過初始化,一定要保證GPEN的中斷引腳相應(yīng)位為1。如全部使能:*(volatileunsignedint*GPEN=0 x000000F0;六、MCBSP串口接收中斷設(shè)計在實際應(yīng)用過程中,經(jīng)常需要通過中斷接收串口數(shù)據(jù)。在此假設(shè)添加MCBSPO接收中斷到11號。首先,將MCBSP0別名添加到global.h文件。設(shè)置MCBSP0參數(shù)并啟
21、用,其初始化函數(shù)為:voidMCBSP0_Init(void*(volatileunsignedint*McBSP0_SPCR=0 x00000000;*(volatileunsignedint*McBSP0_SRGR=0 x200000FF;*(volatileunsignedint*McBSP0_PCR=0 x00000800;*(volatileunsignedint*McBSP0_XCR=0 x000100A0;*(volatileunsignedint*McBSP0_RCR=0 x000100A0;*(volatileunsignedint*McBSP0_MCR=0 x0000000
22、0;*(volatileunsignedint*McBSP0_SPCR|=0 x00C10001;并在main函數(shù)中調(diào)用。開啟中斷11:IER|=0 x00001C02;/IE10=1IE11=1IE12=1并將MUXH(9:5)=01101,綜合以上三個中斷,此時MUXH為:*(volatileunsignedint*MUXH=0 x7fff1da2;/0001110110100010當(dāng)然,如果只考慮現(xiàn)在的中斷,MUXH可以設(shè)置為:*(volatileunsignedint*MUXH=0 x7fff7dbf;/0111110110111111制作中斷服務(wù)程序,將數(shù)據(jù)取出:interruptv
23、oidrint0_isr(voidintDotRev;DotRev=*(volatileunsignedint*McBSP0_DRR;修改vectors.asm,替換unused11為:INT11:stwb0,*-b15mvkl_rint0_isr,b0mvkh_rint0_isr,b0bb0ldw*b15+,b0nop3nopnop添加引用:.ref_rint0_isr;mcbsp0receiveinterrupthandler這時,所有的任務(wù)完成了,可以通過設(shè)置斷點觀察一下接收的數(shù)值。另外需要注意一定要在服務(wù)程序中將數(shù)據(jù)取出,否則會停止接到新的數(shù)據(jù)。七、其他話題1.設(shè)置中斷向量表起始位置上
24、文討論的都是將中斷向量表放置在0地址,如果需要放置到任意地址(以400H對齊),那么就需要提供向量表起始地址。比如我們的終端向量位置:INT設(shè)置為:MEMORYINT:origin=0 x00000400,len=0 x0000400ISRAM:origin=0 x00000800,len=0 x1000000那么我們在初始化中斷時,應(yīng)設(shè)置:ISTP=0 x00000400;2.查看現(xiàn)在的中斷位圖可以查看中斷標(biāo)志寄存器IFR相應(yīng)位(15:0)看是否有中斷到達(dá)。3.清除/設(shè)置原先的中斷如果需要清除原先的中斷,可以通過對ICR寄存器相應(yīng)位置位。如果希望人工觸發(fā)中斷,可以設(shè)置ISR寄存器相應(yīng)位置位,它們將更新IFR位圖。比如,我們在定時器中斷服務(wù)程序中,通過設(shè)置ISR的第12位,人工觸發(fā)外部INT7的12號中斷。interruptvoidxint0_isr(voidISR=0 x00001000;那么CPU將執(zhí)行extint7_isr(void處理此中斷。又比如,在上例的外部中斷中,有時會出現(xiàn)剛一開機(jī),沒有發(fā)送信號就有中斷進(jìn)來的情況,那么怎樣克服呢?可以通過I
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025學(xué)生食堂承包合同書
- 2025餐飲發(fā)服務(wù)業(yè)保密協(xié)議合同
- 2025石料運輸合同
- 2025年度青年人才公寓租賃合同關(guān)于房屋出租3篇
- 2025年度建筑鋼結(jié)構(gòu)質(zhì)量檢測與安全評估合同3篇
- 二零二五年度新能源汽車企業(yè)職工招聘與產(chǎn)業(yè)鏈整合合同3篇
- 2025年度餐飲連鎖合伙經(jīng)營合同樣本2篇
- 二零二五年度農(nóng)村有機(jī)垃圾堆肥處理與清理服務(wù)合同2篇
- 二零二五年度餐飲兼職煮飯人員培訓(xùn)協(xié)議3篇
- 2025年度模特與造型師拍攝服務(wù)合同3篇
- 工行個人小額貸款合同樣本
- 江西省萍鄉(xiāng)市2023-2024學(xué)年高一上學(xué)期期末考試數(shù)學(xué)試題(解析版)
- Unit 5 Here and now Section B project 說課稿 2024-2025學(xué)年人教版(2024)七年級英語下冊標(biāo)簽標(biāo)題
- 2024-2025學(xué)年上學(xué)期深圳初中地理七年級期末模擬卷1
- 2024年地理知識競賽試題200題及答案
- 肝衰竭診治指南(2024年版)解讀
- 化學(xué)反應(yīng)工程智慧樹知到期末考試答案章節(jié)答案2024年浙江工業(yè)大學(xué)
- 人生悟理-透過物理看人生智慧樹知到期末考試答案2024年
- 兒童劇劇本三只小豬
- 贏在執(zhí)行力:團(tuán)隊執(zhí)行力-下
- 鉆孔灌注樁后注漿施工方案(最全版)
評論
0/150
提交評論