打印
[其他]

DMA 传输测试

[复制链接]
899|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
stm32jy|  楼主 | 2021-1-19 19:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
// DMA传输源地址
static uint32_t aSRC_Const_Buffer[BUFFER_SIZE] =
{
  0x01020304, 0x05060708, 0x090A0B0C, 0x0D0E0F10,
  0x11121314, 0x15161718, 0x191A1B1C, 0x1D1E1F20,
  0x21222324, 0x25262728, 0x292A2B2C, 0x2D2E2F30,
  0x31323334, 0x35363738, 0x393A3B3C, 0x3D3E3F40,
  0x41424344, 0x45464748, 0x494A4B4C, 0x4D4E4F50,
  0x51525354, 0x55565758, 0x595A5B5C, 0x5D5E5F60,
  0x61626364, 0x65666768, 0x696A6B6C, 0x6D6E6F70,
  0x71727374, 0x75767778, 0x797A7B7C, 0x7D7E7F80
};

使用特权

评论回复
沙发
stm32jy|  楼主 | 2021-1-19 19:16 | 只看该作者
// DMA传输目标地址
static uint32_t aDST_Buffer[BUFFER_SIZE];

使用特权

评论回复
板凳
stm32jy|  楼主 | 2021-1-19 19:18 | 只看该作者
// DMA通道配置,通过软件触发的方式,把aSRC_Const_Buffer数组的值传输到aDST_Buffer数组中
void App_Dma1Cfg(void)
{
    stc_dma_cfg_t stcDmaCfg;

    Sysctrl_SetPeripheralGate(SysctrlPeripheralDma,TRUE);      //打开DMA时钟
  
    DDL_ZERO_STRUCT(stcDmaCfg);                                //结构体变量值清零
    DDL_ZERO_STRUCT(aDST_Buffer);                              //数组值清零
  
    stcDmaCfg.enMode =  DmaMskBlock;                           //选择块传输
    stcDmaCfg.u16BlockSize = 0x01;                             //块传输个数
    stcDmaCfg.u16TransferCnt = BUFFER_SIZE;                    //块传输次数,一次传输数据大小为 块传输个数*BUFFER_SIZE
    stcDmaCfg.enTransferWidth = DmaMsk32Bit;                   //传输数据的宽度,此处选择字(32Bit)宽度
    stcDmaCfg.enSrcAddrMode = DmaMskSrcAddrInc;                //源地址自增
    stcDmaCfg.enDstAddrMode = DmaMskDstAddrInc;                //目的地址自增
    stcDmaCfg.enDestAddrReloadCtl = DmaMskDstAddrReloadDisable;//禁止重新加载传输目的地址
    stcDmaCfg.enSrcAddrReloadCtl = DmaMskSrcAddrReloadDisable; //禁止重新加载传输源地址
    stcDmaCfg.enSrcBcTcReloadCtl = DmaMskBcTcReloadDisable;    //禁止重新加载BC/TC值
    stcDmaCfg.u32SrcAddress = (uint32_t)&aSRC_Const_Buffer[0]; //指定传输源地址
    stcDmaCfg.u32DstAddress = (uint32_t)&aDST_Buffer[0];       //指定传输目的地址
    stcDmaCfg.enRequestNum = DmaSWTrig;                        //设置为软件触发
    stcDmaCfg.enTransferMode = DmaMskOneTransfer;              //dma传输一次,DMAC传输完成时清除CONFA:ENS位
    stcDmaCfg.enPriority = DmaMskPriorityFix;                  //各通道固定优先级,CH0优先级 > CH1优先级
    Dma_InitChannel(DmaCh1,&stcDmaCfg);
  
    Dma_EnableChannelIrq(DmaCh1);             //传输成功完成时产生中断
    EnableNvic(DMAC_IRQn,IrqLevel3,TRUE);     //NVIC对应DMAC中断位使能   
  
    Dma_Enable();                             //使能DMA
    Dma_EnableChannel(DmaCh1);                //使能DmaCh1
}

使用特权

评论回复
地板
stm32jy|  楼主 | 2021-1-19 19:28 | 只看该作者
//内存数据比较
static int32_t myMemcmp(uint8_t *mem1,uint8_t *mem2,uint32_t bytesize)
{
  int i = 0;
  uint8_t *p = mem1;
  uint8_t *q = mem2;
  if(p == NULL|| q == NULL)
    return -1;
  
  for(i = 0;i < bytesize;i++,p++,q++)
  {
    if(*p != *q)
    {
      return -1;
    }
  }
  return 0;
}

使用特权

评论回复
5
stm32jy|  楼主 | 2021-1-19 19:29 | 只看该作者

// DMA中断
void Dmac_IRQHandler(void)
{   
    if(DmaTransferComplete == Dma_GetStat(DmaCh1))
  {
        //等待传输完成
        if(myMemcmp((uint8_t *)&aDST_Buffer[0],(uint8_t *)&aSRC_Const_Buffer[0],BUFFER_SIZE) == -1)
        {
            Error_Handle();
        }
  }
    Dma_ClrStat(DmaCh1);
}

使用特权

评论回复
6
daichaodai| | 2021-1-20 18:37 | 只看该作者
感谢楼主分享经验

使用特权

评论回复
7
yangxiaor520| | 2021-1-22 18:27 | 只看该作者
学习了,感谢楼主分享。

使用特权

评论回复
8
内政奇才| | 2021-1-25 09:43 | 只看该作者
很不错的经验贴,支持一下楼主

使用特权

评论回复
9
dixans| | 2022-5-29 20:54 | 只看该作者
Thank you.

使用特权

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

本版积分规则

44

主题

1118

帖子

4

粉丝