EDMA 相關(guān)資料
《EDMA 相關(guān)資料》由會員分享,可在線閱讀,更多相關(guān)《EDMA 相關(guān)資料(14頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、 真誠為您提供優(yōu)質(zhì)參考資料,若有不當(dāng)之處,請指正。 DM642基于CSL的EDMA配置方法 目錄 前言 一.創(chuàng)建一個EDMA事件句柄 二.從PRAM(參數(shù)RAM區(qū)域)中分配事件的重載/連接參數(shù) 三.給EDMA事件分配傳輸結(jié)束代碼,一般分配的結(jié)束代碼等于EDMA事件通道號 四.配置EDMA事件的參數(shù)RAM的6個寄存器值 4.1.配置過程中需要禁止EDMA傳輸中斷 4. 2.參數(shù)RAM配置 4.3.寄存器配置接口: 五.配置EDMA相關(guān)中斷以及ISR 5.1. 安裝EDMA向量中斷號(物理中斷號) 5.2. 是否允許一次傳輸結(jié)束后產(chǎn)生中斷(使能傳輸結(jié)束中斷) 5.3.
2、掛接傳輸結(jié)束中斷的中斷服務(wù)程序(ISR) 5.4. 使能EDMA事件號的EDMA傳輸 六.示例程序 6.1.示例程序1 6.2.示例程序2 前言 本文以DM642的VP口為例,描述了基于CSL的EDMA的使用方法,包括EDMA的創(chuàng)建,初始化等.本文中是通過VP的FIFO的閥值設(shè)置,觸發(fā)(啟動)EDMA的傳輸.當(dāng)FIFO的接收到的數(shù)據(jù)或者需要發(fā)送的數(shù)據(jù)達(dá)到自己設(shè)定的閥值,將啟動一次EDMA的傳輸,修改相應(yīng)的EMDA參數(shù)RAM的寄存器值.關(guān)于閥值的設(shè)置詳細(xì)見文檔“采集功能的配置步驟”。 一.創(chuàng)建一個EDMA事件句柄 調(diào)用接口函數(shù)EDMA_Handle EDMA_open(int c
3、haNum, Uint32 flags); 1 / 14 在使用EDMA之前,都必須先調(diào)用這個函數(shù). 示例: 如果需要打開VP0的通道A的Y,U,V的傳輸,對應(yīng)的事件號EDMA_CHA_VP0EVTYA=16, EDMA_CHA_VP0EVTUA=17,EDMA_CHA_VP0EVTVA=18 EDMA_Handle EDMA_VPAY_handle, EDMA_VPAu_handle, EDMA_VPAV_handle; EDMA_VPAY_handle = EDMA_open(EDMA_CHA_VP0EVTYA, EDMA_OPEN_RESET); EDMA_VPAU_han
4、dle = EDMA_open(EDMA_CHA_VP0EVTUA, EDMA_OPEN_RESET); EDMA_VPAV_handle = EDMA_open(EDMA_CHA_VP0EVTVA, EDMA_OPEN_RESET); 參數(shù)flags-----EDMA_OPEN_RESET,表示復(fù)位EDMA通道,禁止中斷,清除中斷標(biāo)志. 具體示例見示例程序1 二.從PRAM(參數(shù)RAM區(qū)域)中分配事件的重載/連接參數(shù) 函數(shù)接口:EDMA_Handle EDMA_allocTable(int tableNum); 此函數(shù)是為了實現(xiàn)復(fù)雜的數(shù)據(jù)傳輸方式,在傳輸BT656模式中,設(shè)置兩幀
5、數(shù)據(jù),每一幀數(shù)據(jù)分為兩場:頂場和底場,第一幀的頂場傳輸完成連接到底場,底場數(shù)據(jù)傳輸完成連接到第二幀的頂場,頂場數(shù)據(jù)傳輸完成連接到底場數(shù)據(jù),底場數(shù)據(jù)傳輸完成再連接到第一幀的頂場數(shù)據(jù)傳輸,用四個RLD形成一個循環(huán),每次底場數(shù)據(jù)傳輸完成產(chǎn)生中斷,通過中斷函數(shù),把這一幀的頂場和底場數(shù)據(jù)入隊列,讓DSP進(jìn)行后續(xù)處理, 由于BT656由一個亮度分量和兩個色度分量組成,因此,需要3*4個重載/連接參數(shù) 具體示例見示例程序1 三.給EDMA事件分配傳輸結(jié)束代碼,一般分配的結(jié)束代碼等于EDMA事件通道號 函數(shù)接口:int EDMA_intAlloc(int tcc); 具體示例見示例程序1 四.配置
6、EDMA事件的參數(shù)RAM的6個寄存器值 4.1.配置過程中需要禁止EDMA傳輸中斷 EDMA_intDisable(chan->tcc[0]); EDMA_intDisable(chan->tcc[1]); 4. 2.參數(shù)RAM配置 函數(shù)接口:void EDMA_config(EDMA_Handle hEdma, EDMA_Config *config); typedef struct { Uint32 opt; //通道選擇 Uint32 src; //源地址 Uint32 cnt; //陣列(二維)/幀(一維)計數(shù) Uint32 dst;
7、 //目的地址 Uint32 idx; //陣列/幀索引 Uint32 rld; //重載地址參數(shù) } EDMA_Config; EDMA_config(chan->hEdma[i], &cfgEdma);//配置EDMA通道事件RAM EDMA_config(chan->hRld[4 * i], &cfgEdma); //配置對應(yīng)通道事件的傳輸事件RAM組 4.3.寄存器配置接口: EDMA_OPT_RMK(pri,esize,ds2,sum,dd2,dum,tcint,tcc,tccm,atcint,atcc,pdts,pdtd,link,fs); ED
8、MA_SRC_RMK(src) EDMA_CNT_RMK(frmcnt,elecnt); EDMA_DST_RMK(dst); EDMA_IDX_RMK(frmidx,eleidx); EDMA_RLD_RMK(elerld,link); 術(shù)語陳述: 對于傳704*576大小的Y數(shù)據(jù) EDMA_CNT_RMK(frmcnt,elecnt); 如果配置了EDMA傳輸?shù)臄?shù)據(jù)寬度為32位.一幀為704個數(shù)據(jù),那么frmcnt=576,elecnt=704/4(字節(jié)) 這里的幀表示對數(shù)據(jù)的打包形式或者是說一種數(shù)據(jù)組織結(jié)構(gòu)的總稱,上面的例子表示704個數(shù)據(jù)為一幀. EDMA_ID
9、X_RMK(frmidx,eleidx);采用幀索引的話,eleidx=0,frmidx=704(一幀的數(shù)據(jù)個數(shù)). 具體示例見程序示例2 五.配置EDMA相關(guān)中斷以及ISR 5.1. 安裝EDMA向量中斷號(物理中斷號) EDMA的中斷號為8, 為固定的 函數(shù)接口:Void IRQ_map(Uint32 eventId,, int intNumber); IRQ_map(IRQ_EVT_EDMAINT, irqId); 具體示例見程序示例2 5.2. 是否允許一次傳輸結(jié)束后產(chǎn)生中斷(使能傳輸結(jié)束中斷) 函數(shù)接口: void EDMA_intEnable(Uint32 t
10、ccIntNum); void EDMA_intDisable(Uint32 tccIntNum); void EDMA_intClear(Uint32 tccIntNum); EDMA_intClear(chan->tcc[0]); EDMA_intEnable(chan->tcc[0]); EDMA_intClear(chan->tcc[1]); EDMA_intEnable(chan->tcc[1]); 具體示例見程序示例2 5.3. 掛接傳輸結(jié)束中斷的中斷服務(wù)程序(ISR) 函數(shù)接口: EDMA_IntHandler EDMA_intHook(int tccN
11、um, EDMA_IntHandler funcAddr); EDMA_intHook(chan->tcc[0], captureEdmaISR); EDMA_intHook(chan->tcc[1], captureEdmaISR); 具體示例見程序示例2 5.4. 使能EDMA事件號的EDMA傳輸 函數(shù)接口: void EDMA_enableChannel(EDMA_Handle hEdma); for(i = 0; i < numEdmaChans; i ++) { EDMA_disableChannel(chan->hEdma[i]); EDMA_clearC
12、hannel(chan->hEdma[i]); EDMA_enableChannel(chan->hEdma[i]); } IRQ_enable(IRQ_EVT_EDMAINT); 具體示例見程序示例2 六.示例程序 6.1.示例程序1 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ for(j = 0; j <( _VPORT_NUM_EDMA_CHANS)&& retVal == IOM_COMPLETED; j ++) { if( (chan->hEdma[j] = E
13、DMA_open(chan->edmaChanNum[j], EDMA_OPEN_RESET))==EDMA_HINV //分配一個事件的重載或連接參數(shù)RAM表(6個字) || (chan->hRld[4 * j] = EDMA_allocTable(-1))==EDMA_HINV || (chan->hRld[4 * j + 1] = EDMA_allocTable(-1))==EDMA_HINV || (chan->hRld[4 * j + 2] = EDMA_allocTable(-1))==EDMA_HINV || (chan->hRld[4 * j + 3] = E
14、DMA_allocTable(-1))==EDMA_HINV /*分配傳輸結(jié)束代碼==EDMA事件號*/ || (chan->tcc[j] = EDMA_intAlloc(chan->edmaChanNum[j])) == -1) { retVal = IOM_EALLOC; msg_print("entrymdCreateChan ---retVal=%d----------jinx",retVal); }/* if((port->...*/ msg_print("entry mdCreateChan ---retVal=%d--------------------jin
15、x",retVal); } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 6.2.示例程序2 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ EDMA_Config cfgEdma; for(i = 0; i < numEdmaChans; i ++) { Int optFld1 = EDMA_OPT_RMK(//YEVT通道
16、事件參數(shù)RAM edmaPri, // 1,EDMA傳輸具有最高優(yōu)先級 EDMA_OPT_ESIZE_32BIT, EDMA_OPT_2DS_NO, //0,表示一維源 EDMA_OPT_SUM_NONE, //0,表示固定源地址 EDMA_OPT_2DD_YES, // 1,表示二維目的 EDMA_OPT_DUM_INC, // 1,目的地址根據(jù)2DS和FS位增加 EDMA_OPT_TCINT_NO, // 0,禁止傳輸結(jié)束中斷 EDMA_OPT_TCC_OF(0), // 0,傳輸結(jié)束代碼為0 EDMA_OPT_TCCM_OF(0),
17、//0,傳輸事件結(jié)束代碼最大設(shè)置 EDMA_OPT_ATCINT_NO, // 0,禁止將要結(jié)束事件中斷 EDMA_OPT_ATCC_DEFAULT, EDMA_OPT_PDTS_DISABLE,//源地址為片內(nèi)外設(shè)傳輸方式0,禁止片內(nèi)外設(shè)讀 EDMA_OPT_PDTD_DISABLE,//目的地址為片內(nèi)外設(shè)傳輸方式0,禁止片內(nèi)外設(shè)寫 EDMA_OPT_LINK_YES, // 1,事件參數(shù)連接使能 EDMA_OPT_FS_NO //0,數(shù)據(jù)或者陣列同步 ); Int optFld2a = EDMA_OPT_RMK( edmaPri, E
18、DMA_OPT_ESIZE_32BIT, EDMA_OPT_2DS_NO, EDMA_OPT_SUM_NONE, EDMA_OPT_2DD_YES, EDMA_OPT_DUM_INC, // 1,目的地址根據(jù)2DS和FS位增加 (i == 0 ? EDMA_OPT_TCINT_YES:EDMA_OPT_TCINT_NO), EDMA_OPT_TCC_OF(i == 0 ? chan->tcc[0] & 0x0f : 0), EDMA_OPT_TCCM_OF(i == 0 ? chan->tcc[0] >> 4 : 0), EDMA_OPT_ATCINT_NO, EDMA_O
19、PT_ATCC_DEFAULT, EDMA_OPT_PDTS_DISABLE, EDMA_OPT_PDTD_DISABLE, EDMA_OPT_LINK_YES, EDMA_OPT_FS_NO ); Int optFld2b = EDMA_OPT_RMK( edmaPri, EDMA_OPT_ESIZE_32BIT, EDMA_OPT_2DS_NO, EDMA_OPT_SUM_NONE, EDMA_OPT_2DD_YES, EDMA_OPT_DUM_INC, // 1,目的地址根據(jù)2DS和FS位增加 (i == 0 ? EDMA_OPT_TCINT_YES:ED
20、MA_OPT_TCINT_NO), EDMA_OPT_TCC_OF(i == 0 ? chan->tcc[1] & 0x0f : 0), EDMA_OPT_TCCM_OF(i == 0 ? chan->tcc[1] >> 4 : 0), EDMA_OPT_ATCINT_NO, EDMA_OPT_ATCC_DEFAULT, EDMA_OPT_PDTS_DISABLE, EDMA_OPT_PDTD_DISABLE, EDMA_OPT_LINK_YES, EDMA_OPT_FS_NO ); thrld = (i == 0) ? chan->yThrld : chan->cThrl
21、d; cfgEdma.src = EDMA_SRC_RMK(chan->edmaAddr[i]); if(chan->interlaced) //隔行掃描模式 noted by jinx 2008.06.23 { if(!(params->cmode & _VPORT_MASK_RAW))//BT.656 { /* to merge the two fields together */ /* EDMA is configured to transfer only field 1 initially */ /* line pitch is twice the line size
22、*/ /* this requires that the threlhold is the same as line size */ /* first field */ //#define EDMA_CNT_RMK(frmcnt,elecnt) //陣列數(shù)為288-1;數(shù)據(jù)計數(shù)=704/4, //因為設(shè)置為32位數(shù)據(jù)寬度,而thrld表示2字的個數(shù), //因此轉(zhuǎn)換為數(shù)據(jù)計數(shù)的時候需要把thrld*2,即(thrld << 1) //noted by jinx 2008.06.12 cfgEt = EDMA_CNT_RMK((chan->numEventsFld1) - 1
23、, (thrld << 1)); if(chan->mergeFlds) { //#define EDMA_IDX_RMK(frmidx,eleidx) //thrld << 4表示隔行存放數(shù)據(jù),留出存放場2或者場1的一行數(shù)據(jù)存儲空間, //thrld << 3表示連續(xù)存儲,即存放完此場的一行數(shù)據(jù)后,接著還是存放此場的下一行數(shù)據(jù) cfgEdma.idx = EDMA_IDX_RMK(thrld << 4, 0); } else { cfgEdma.idx = EDMA_IDX_RMK(thrld << 3, 0); } /* hard code the first two f
24、rames as current and reload buffers */ /* first field */ cfgEdma.rld = EDMA_RLD_RMK(0, chan->hRld[4 * i + 1]); cfgEdma.opt = optFld1; cfgEdma.dst = EDMA_DST_RMK(*((Int *)(&chan->viops[0].frame.iFrm.y1) + i)); EDMA_config(chan->hEdma[i], &cfgEdma);//配置EDMA通道事件RAM EDMA_config(chan->hRld[4 * i
25、], &cfgEdma); //配置對應(yīng)通道事件的傳輸事件RAM組 cfgEdma.dst = EDMA_DST_RMK(*((Int *)(&chan->viops[1].frame.iFrm.y1) + i)); cfgEdma.rld = EDMA_RLD_RMK(0, chan->hRld[4 * i + 3]); EDMA_config(chan->hRld[4 * i + 2], &cfgEdma); /* second field */ cfgEdma.opt = optFld2a; cfgEt = EDMA_CNT_RMK((chan->numEvents-ch
26、an->numEventsFld1) - 1, (thrld << 1)); cfgEdma.dst = EDMA_DST_RMK(*((Int *)(&chan->viops[0].frame.iFrm.y2) + i)); cfgEdma.rld = EDMA_RLD_RMK(0, chan->hRld[4 * i + 2]); EDMA_config(chan->hRld[4 * i + 1], &cfgEdma); cfgEdma.opt = optFld2b; cfgEdma.dst = EDMA_DST_RMK(*((Int *)(&chan->viops[1].f
27、rame.iFrm.y2) + i)); cfgEdma.rld = EDMA_RLD_RMK(0, chan->hRld[4 * i]); EDMA_config(chan->hRld[4 * i + 3], &cfgEdma); } } } C64X?DSP?EDMA小結(jié)及實例詳解 (1)EDMA概要 ①EDMA數(shù)據(jù)傳輸有兩種發(fā)起方式: CPU發(fā)起的EMDA數(shù)據(jù)傳輸(非同步方式):需要傳輸時,CPU設(shè)置ESR寄存器的相應(yīng)位為1,從而觸發(fā)一個EDMA事件的產(chǎn)生,事件對應(yīng)的通道參數(shù)被送往地址硬件并且完成相應(yīng)的處理,這種非同步方式的實時數(shù)據(jù)傳輸無需設(shè)定EER寄存器; ?
28、 事件觸發(fā)方式EDMA數(shù)據(jù)傳輸(同步方式):ER寄存器保存外設(shè)發(fā)送過來的事件,一旦CPU設(shè)置EER寄存器的相應(yīng)位為1后,ER中的事件才會提交給事件編碼器(Event Encoder),并且進(jìn)一步引起相關(guān)的傳輸參數(shù)的發(fā)送給地址產(chǎn)生硬件;如果EER中對應(yīng)于某事件的位沒有置1,則ER寄存器中的事件將保留,一旦置1則觸發(fā)EDMA的傳輸,這種特性可以應(yīng)用到EDMA Chain傳輸,需要EER和CCER結(jié)合使用; ? (2)EDMA數(shù)據(jù)傳輸類型: EDMA有兩種類型的數(shù)據(jù)傳輸:1D和2D的(OPT.2DS和OPT.DDS標(biāo)示源地址和目的地址的數(shù)據(jù)傳輸類型,即有4種組合方式);數(shù)據(jù)的維數(shù)表明了數(shù)據(jù)的組
29、成方式: ? ①1D數(shù)據(jù) ? 數(shù)據(jù)組成是“塊->幀->元素”;一個塊中的每幀數(shù)據(jù)是獨立處理(即可以理解亦為2D數(shù)據(jù),但是第二維永遠(yuǎn)是1),每次處理是一個元素,因此一幀中的數(shù)據(jù)元素可以是在同一個內(nèi)存地址、連續(xù)的地址或者是與同一幀中的前面的數(shù)據(jù)元素地址具有一定偏移(Offset,由ELEIDX通道參數(shù)指定)的某地址;不同幀之間的內(nèi)存地址偏移由FRMIDX通道參數(shù)指定(兩幀的第一個元素之間的偏移或者后一幀的第一個元素的地址與前一幀的最后一個元素地址的偏移,具體依賴于通道參數(shù)FS的設(shè)定);每幀的數(shù)據(jù)元素個數(shù)可以不同,由通道參數(shù)ELECNT指定,傳完一幀數(shù)據(jù)后由ELERLD重新載入塊中的下一幀的
30、數(shù)據(jù)元素個數(shù)ELECNT;塊中的幀的個數(shù)由通道參數(shù)FRMCNT指定; ? 1D數(shù)據(jù)傳輸有兩種同步方式:OPT.FS=0,元素同步方式;OPT.FS=1,幀同步方式; ? 元素同步時,一次同步事件引起一幀中的一個元素的傳輸,每傳輸一次ELECNT遞減1;當(dāng)同步事件觸發(fā)時,ELECNT=1表明是一幀的最后一個數(shù)據(jù)元素,此時EDMA控制器除了完成最后這個元素的傳輸外,還需要重新載入ELECNT(通過ELERLD)并且FRMCNT遞減1;ELEIDX表示元素之間的偏移,F(xiàn)RMIDX表示一幀的最后一個元素和下一幀的第一個元素之間的偏移;如果OPT.LINK=1時,傳輸完成中斷產(chǎn)生(FRMCNT=
31、0)就重新從PRAM中載入當(dāng)前通道的其他參數(shù); ? 幀同步時,一次同步事件引起一幀數(shù)據(jù)的傳輸,F(xiàn)RMIDX表示兩幀的第一個元素之間的偏移; ? ② 2D數(shù)據(jù) ? 數(shù)據(jù)組成為“塊->數(shù)組->元素”,同一數(shù)組中的元素是連續(xù)存放的,因此ELEIDX無意義;數(shù)組中的元素素引表示2D的第一維,塊中的數(shù)組索引表示2D的第二維;FRMIDX的值依賴于OPT.FS的設(shè)定; ? OPT.FS=0:表示一次同步事件傳輸一個數(shù)組,此時FRMIDX是數(shù)組首地址之間的偏移;每傳完一個數(shù)組,F(xiàn)RMCNT遞減1;當(dāng)OPT.LINK=1并且FRMCNT遞減至0時,從PRAM的中重新載入當(dāng)前通道的其他參數(shù);
32、 ? OPT.FS=1:表示一次同步事件傳輸一個塊;FRMIDX表示前一個數(shù)組的最后一個元素的地址與后一個數(shù)組的第一個元素的地址之間的偏移;如果OPT.LINK等于1,則當(dāng)整塊數(shù)據(jù)傳完時,重新從PRAM中為當(dāng)前通道載入新的參數(shù); ? (3)EDMA傳輸過程的源/目的地址的修改 ? 在每次同步事件觸發(fā)EDMA數(shù)據(jù)傳輸,并且傳輸完成后,需要對源/目的地址進(jìn)行更新;地址的更新方式由SUM/DUM進(jìn)行設(shè)定,并且和2DS、2DD以及FS是密切相關(guān)的; ? (4)數(shù)據(jù)元素大小和對齊方式 ? 源/目的地址是在元素大小的邊界對齊的,因此要注意指向源/目的地址的指針的類型需要OPT.ESIZ
33、E匹配; ? (5)FRMCNT和ELEMCNT的更新 QUESTION:每次進(jìn)行計數(shù)更新時,ELERLD的值哪里來的? ? (6)EDMA Linking Transfer ? 當(dāng)傳輸完成時(根據(jù)當(dāng)前通道參數(shù)設(shè)定已經(jīng)傳完所有數(shù)據(jù)了,具體條件如下表所示),并且OPT.LINK=1,EDMA控制器會根據(jù)通道參數(shù)LINK(非OPT.LINK,16bits)從PaRAM中的其他位置(以24個字節(jié)對齊,因為通道參數(shù)為6WORD)重新載入當(dāng)前傳輸通道的參數(shù);可以鏈接到一個空的通道參數(shù)集(NULL Parameter)來停止EDMA傳輸,也可以自鏈接(用于循環(huán)緩沖處理或者重復(fù)的數(shù)據(jù)傳輸);L
34、inking過程中不對相關(guān)寄存器作判定; ? (7)EDMA中斷 ? C64X DSP的EDMA控制器的所有64個通道只產(chǎn)生一種中斷:EDMA_INT。如果需要讓第n個EDMA通道(或者QDMA請求)可以在傳輸完成時可以產(chǎn)生中斷通知CPU的話,應(yīng)該如下設(shè)定: u OPT.TCINT=1:表示啟用傳輸完成中斷 ? u OPT.TCC=n:在傳輸完成時,CIPR[TCC]=1,用于標(biāo)記對應(yīng)通道的傳輸完成,即便對應(yīng)的CIER位沒有啟動,傳輸完成事件還是會在CIPR記錄,即掛起的含義所在; ? u OPT.CIER[n]=1:表示立即允許掛起的第n個通道傳輸完
35、成事件觸發(fā)EDMA_INT中斷發(fā)送給CPU; 其中,TCC用于表示的通道的位數(shù)不夠時,可以擴(kuò)展使用TCCM(即TCCM:TCC),CIPR和CIER均由兩個寄存器組成:CIPRL+CIPRH以及CIERL+CIERH。 ? 中斷服務(wù)例程ISR讀取CIPR,確定哪一個通道完成了數(shù)據(jù)傳輸,進(jìn)行相應(yīng)的處理。ISR在進(jìn)行處理之前需要清除CIPR中確定了通道的位(寫入1到相關(guān)位清除,寫入0不起作用),目的是記錄以后的傳輸完成事件的發(fā)生。在中斷服務(wù)例程對某通道的傳輸完成中斷進(jìn)行服務(wù)后,因為期間有可能有其他通道傳輸完成了,也已經(jīng)設(shè)置了CIPR中的相應(yīng)位,或者也有可能本來有好幾個中斷掛起了并且現(xiàn)在觸發(fā)了
36、,因此中斷服務(wù)例程必須檢查所有的CIPR并全部完成中斷服務(wù)才行。當(dāng)CIPR[n]&CIER[n]=1時,則設(shè)置對應(yīng)的IFR為1,防止在退出ISR時丟失中斷并且使得可以多次調(diào)用ISR。中斷服務(wù)例程的一個任務(wù)是清除CIPR和CIER中的與通道對應(yīng)的位。 ? C64X DSP除了傳輸完成中斷外,還有交替性傳輸完成中斷,即在傳輸過程中完成一個傳輸子過程(如傳完一個數(shù)據(jù)元素、傳完一個幀/數(shù)組數(shù)據(jù);2D幀同步傳輸沒有交替性傳輸完成中斷)給CPU發(fā)送一個中斷,相應(yīng)的設(shè)定由OPT.ATINT、OPT.ATCC設(shè)定,處理過程和傳輸完成中斷雷同,區(qū)別只是在傳輸還沒全部完成的過程中進(jìn)行中斷處理而已。 這是使用
37、BIOS和CSL LIB 作EDMA簡單例子. 在CCS BIOS 中需要作 中斷--EDMA--edmaHwi 的設(shè)置. Spru234 和 spra636a 都是有用的參考 解釋見注釋. void main() { initEdma(); //Edma 初始化 initHwi(); //中斷初始化 EDMA_setChannel(hEdma); //開始EDMA傳送 while (1) {} } void initEdma(void) { EDMA_Config gEdmaConfig; //EDMA設(shè)置表 hEdma = EDMA_open(EDMA_CHA_AN
38、Y, EDMA_OPEN_RESET); // gXmtTCC = EDMA_intAlloc(-1); //分配一個可用的TCC .... //根據(jù)實際需要填寫EDMA設(shè)置表 EDMA_config(hEdma, &gEdmaConfig); 設(shè)置EDMA通道 hEdmaReload = EDMA_allocTable(-1); //得到EDMA重載標(biāo)實 EDMA_config(hEdmaReload, &gEdmaConfig); // 設(shè)置EDMA重載通道 EDMA_link(hEdma, hEdmaReload); //設(shè)置EDMA重載 EDMA_link(hEdmaReload, hEdmaReload); //設(shè)置EDMA重載 EDMA_intClear(gXmtTCC); // 清除可能的EDMA中斷 EDMA_intEnable(gXmtTCC); // 打開EDMA中斷 EDMA_intHook(gXmtTCC, edmaHwi); //通知系統(tǒng)edmaHwi是中斷服務(wù)者 } void edmaHwi(int tcc) //中斷服務(wù) { 。。。。//準(zhǔn)備數(shù)據(jù) EDMA_setChannel(hEdma); //再次開始EDMA傳送 } 溫馨提示:最好仔細(xì)閱讀后才下載使用,萬分感謝!
- 溫馨提示:
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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 6.煤礦安全生產(chǎn)科普知識競賽題含答案
- 2.煤礦爆破工技能鑒定試題含答案
- 3.爆破工培訓(xùn)考試試題含答案
- 2.煤礦安全監(jiān)察人員模擬考試題庫試卷含答案
- 3.金屬非金屬礦山安全管理人員(地下礦山)安全生產(chǎn)模擬考試題庫試卷含答案
- 4.煤礦特種作業(yè)人員井下電鉗工模擬考試題庫試卷含答案
- 1 煤礦安全生產(chǎn)及管理知識測試題庫及答案
- 2 各種煤礦安全考試試題含答案
- 1 煤礦安全檢查考試題
- 1 井下放炮員練習(xí)題含答案
- 2煤礦安全監(jiān)測工種技術(shù)比武題庫含解析
- 1 礦山應(yīng)急救援安全知識競賽試題
- 1 礦井泵工考試練習(xí)題含答案
- 2煤礦爆破工考試復(fù)習(xí)題含答案
- 1 各種煤礦安全考試試題含答案