使用DMA提高memcpy效率(For STR912)
在STR912中可以利用DMA功能来完成数据的拷贝memcpy,根据测试大约完成一次数据传送需要45ns, 当使用8位数据宽度来传送数据时,每秒约22M Bytes,当使用16位数据宽度来传送数据时,每秒约44M Bytes, 当使用32位数据宽度来传送数据时,每秒约88M Bytes,可以大大提高数据的传送效率.
注意:本函数需要使用一个DMA通道, 每次传送的数据块的不大于 4k Bytes,本程序时按字节传送的, 同样道理可以写出按16/32位传送的函数; 使用前应该对DMA初始化. #define DMA_Mem DMA_Channel0
#define DMA_Mem_ENABLE DMA_Mem->CCNF |= 0x00000001 #define DMA_Mem_DISABLE DMA_Mem->CCNF &= ~0x00000001 #define DMA_Mem_ACTIVE (DMA_Mem->CCNF & 0x00020000) #define DMA_Mem_WaitEnd while (DMA_Mem_ACTIVE)
void DMA_Init_MemCopy() { DMA_InitTypeDef DMA_InitStruct; DMA_Cmd(ENABLE); DMA_StructInit(&DMA_InitStruct); DMA_InitStruct.DMA_Channel_LLstItm=0; DMA_InitStruct.DMA_Channel_SrcWidth = DMA_SrcWidth_Byte; // 8bits Transfer DMA_InitStruct.DMA_Channel_DesWidth = DMA_DesWidth_Byte; DMA_InitStruct.DMA_Channel_DesBstSize= DMA_DesBst_1Data; DMA_InitStruct.DMA_Channel_SrcBstSize= DMA_SrcBst_1Data; DMA_InitStruct.DMA_Channel_FlowCntrl = DMA_FlowCntrl0_DMA; DMA_ChannelSRCIncConfig (DMA_Mem, ENABLE); DMA_ChannelDESIncConfig (DMA_Mem, ENABLE); DMA_Init(DMA_Mem,&DMA_InitStruct); }
void dma_memcpy(u8 *src, u8 *dst, u16 Count) { //45ns per Byte = 22 Mhz
DMA_Mem_DISABLE; DMA_Mem->SRC=(u32)src; DMA_Mem->DES=(u32)dst; DMA_Mem->CC|=(Count & 0x0FFF); DMA_Mem_ENABLE; DMA_Mem_WaitEnd; } |