前段时间调试DM648,有一些笔记,跟大家分享一下。虽然用到DM648的朋友会很少,但正因为64+的资料不容易找,所以才把相关笔记整理发出来,希望能对做64+的朋友提供一些方便。
下面的函数描述了EDMA配置到启动的过程(完全寄存器级的操作,更有利于理解EDMA3.0的操作过程)。
EDMA_init()
{
/* Step 1: EDMA寄存器初始化 */
QUEPRI=0x10;
//queue优先级设置,0、2、3为0级,1为1级
QWMTHRA =(16<<8u)|(16 & 0xFF);
//queue超长报错设置,0、1均为16,2、3为0
EMCR =
0xFFFFFFFF;
//清除所有EDMA事件丢失标志
CCERRCLR = 0xFFFFFFFF;
//清除所有EDMA3CC错误
//以VP2亮度事件触发为例
/* Step 2: Programming DMA Channel (and Param set) */
DCHMAP32=0x80<<5;
//对应EVENT32与第128项PARAM
DMAQNUM4=0x0;
//将EVENT32项对应到QUEUE0通道
//设置第128项PARAM值,重载表设为129项
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项PARAM表装载到第128项表
LINK_BCNTRLD128 = (frameCount << 16u) | 0x1020u;
// LINK = 129, BCNTRLD = 1
SRC_DST_CIDX128 = (elementCount << 16u) | (0u);
CCNT128 = 1;
//第129项PARAM表为备份表,用于重载到第128项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项PARAM表装载到第128项表,仍然指向第129项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;//调试时可用于手动触发EDMA事件,观察EDMA模块工作情况
}
|