打印

使用DMA提高memcpy效率(For STR912)

[复制链接]
5366|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
seawwh|  楼主 | 2007-1-12 15:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
使用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;
}     
  
沙发
greatbin| | 2007-1-12 16:25 | 只看该作者

这个要顶

建议加精

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

145

主题

368

帖子

1

粉丝