前段時(shí)間調(diào)試DM648,有一些筆記,跟大家分享一下。雖然用到DM648的朋友會(huì)很少,但正因?yàn)?4+的資料不容易找,所以才把相關(guān)筆記整理發(fā)出來,希望能對做64+的朋友提供一些方便。 下面的函數(shù)描述了EDMA配置到啟動(dòng)的過程(完全寄存器級(jí)的操作,更有利于理解EDMA3.0的操作過程)。 EDMA_init() { /* Step 1: EDMA寄存器初始化 */ QUEPRI=0x10; //queue優(yōu)先級(jí)設(shè)置,0、2、3為0級(jí),1為1級(jí) QWMTHRA =(16<<8u)|(16 & 0xFF); //queue超長報(bào)錯(cuò)設(shè)置,0、1均為16,2、3為0 EMCR = 0xFFFFFFFF; //清除所有EDMA事件丟失標(biāo)志 CCERRCLR = 0xFFFFFFFF; //清除所有EDMA3CC錯(cuò)誤 //以VP2亮度事件觸發(fā)為例 /* Step 2: Programming DMA Channel (and Param set) */ DCHMAP32=0x80<<5; //對應(yīng)EVENT32與第128項(xiàng)PARAM DMAQNUM4=0x0; //將EVENT32項(xiàng)對應(yīng)到QUEUE0通道 //設(shè)置第128項(xiàng)PARAM值,重載表設(shè)為129項(xiàng) OPT128 = 0x00105301; // TCINTEN is set,A sync,TCC=5,64bit FIFO SRC128 = YSRCA2; A_B_CNT128 = ((frameCount << 16u) | (elementCount & 0xFFFFu)); // ACNT = 1536, BCNT = 2 DST128 = (unsigned int )line_buffer2; SRC_DST_BIDX128 = (elementCount << 16u) | (0u); // SRC_BIDX = 0, DST_BIDX = 1536 //一次完整的EDMA搬移完成后,用第129項(xiàng)PARAM表裝載到第128項(xiàng)表 LINK_BCNTRLD128 = (frameCount << 16u) | 0x1020u; // LINK = 129, BCNTRLD = 1 SRC_DST_CIDX128 = (elementCount << 16u) | (0u); CCNT128 = 1; //第129項(xiàng)PARAM表為備份表,用于重載到第128項(xiàng)PARAM表 OPT129 = 0x00105301; // TCINTEN is set,A sync,TCC=5,64bit FIFO SRC129 = YSRCA2; A_B_CNT129 = ((frameCount << 16u) | (elementCount & 0xFFFFu)); // ACNT = 1536, BCNT = 2 DST129 = (unsigned int )line_buffer2; SRC_DST_BIDX129 = (elementCount << 16u) | (0u); // SRC_BIDX = 0, DST_BIDX = 1536 //將129項(xiàng)PARAM表裝載到第128項(xiàng)表,仍然指向第129項(xiàng)PARAM表 LINK_BCNTRLD129 = (frameCount << 16u) | 0x1020u; // LINK = 129, BCNTRLD = 1 SRC_DST_CIDX129 = (elementCount << 16u) | (0u); CCNT129 = 1; /* Step 3: Triggering the Transfer and Waiting for Transfer Completion */ EESRH = 0x1; //enable event VP2EVTYA channel , number 32 // ESRH = 0x1;//調(diào)試時(shí)可用于手動(dòng)觸發(fā)EDMA事件,觀察EDMA模塊工作情況 }
|