stm32jy 发表于 2021-1-19 19:15

DMA 传输测试

// DMA传输源地址
static uint32_t aSRC_Const_Buffer =
{
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;

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; //指定传输源地址
    stcDmaCfg.u32DstAddress = (uint32_t)&aDST_Buffer;       //指定传输目的地址
    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;
}

stm32jy 发表于 2021-1-19 19:29


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

daichaodai 发表于 2021-1-20 18:37

感谢楼主分享经验

yangxiaor520 发表于 2021-1-22 18:27

学习了,感谢楼主分享。

内政奇才 发表于 2021-1-25 09:43

很不错的经验贴,支持一下楼主

dixans 发表于 2022-5-29 20:54

Thank you.
页: [1]
查看完整版本: DMA 传输测试