MDMA 全称是 memoryDMA ,是内存到内存搬运数据的DMA。在DSP 做算法时,经常会遇到数据重组或者搬移,如果用core 搬运这些数据,是对DSP 资源的一种浪费,此时就可以用到MDMA 进行数据搬移。
看看寄存器的配置说明:
寄存器 功能
MDMA_S0_START_ADDR MDMA 源地址寄存器
MDMA_S0_X_COUNT MDMA 源地址X 计数寄存器
MDMA_S0_X_MODIFY MDMA 源地址X 修改寄存器
MDMA_S0_PERIPHERAL_MAP MDMA 源地址通道配置寄存器
MDMA_S0_CONFIG MDMA 源地址配置寄存器
MDMA_D0_START_ADDR MDMA 目的地址寄存器
MDMA_D0_X_COUNT MDMA 目的地址X 计数寄存器
MDMA_D0_X_MODIFY MDMA 目的地址X 修改寄存器
MDMA_D0_PERIPHERAL_MAP MDMA 目的地址通道配置寄存器
MDMA_D0_CONFIG MDMA 目的地址配置寄存器
看一段核心代码:
*pMDMA_S0_START_ADDR = pSrc; //设置源地址
*pMDMA_S0_X_COUNT = 8; //传输次数 8 次
*pMDMA_S0_X_MODIFY = 2; //地址修改增量2,16bit 模式一次读2 个byte
*pMDMA_D0_START_ADDR = pDest;
*pMDMA_D0_X_COUNT = 8;
*pMDMA_D0_X_MODIFY = 2;
*pMDMA_S0_PERIPHERAL_MAP = 0x0040; //配置使用的DMA 通道
*pMDMA_D0_PERIPHERAL_MAP = 0x0040;
*pMDMA_S0_CONFIG = 0x0024; //配置源DMA 工作模式
*pMDMA_D0_CONFIG = 0x00a6; //配置目的DMA 工作模式
*pSIC_IAR5 = 0xfffff6ff; //设置中断等级
register_handler(ik_ivg13, MDMA_ISR); //注册中断
*pSIC_IMASK1 = 0x00000400; //打开中断屏蔽
这个代码实现了将源地址 buffer 中的8 个数据搬到目的地址中,完成搬运后会进入中断程序,然后在中断中再次使能MDMA,重复搬运数据。
在中断函数中打个断点,运行代码后,Src_Buf 中的数据会被搬运到Dest_Buf 中去,完成搬运后会进入中断函数,通过Visual DSP 下的memory 窗口,可以查看Dest_Buf 中的数据。
这一篇就没有录视频教程勒,整个工程的源码如果有需要可以联系我。 |