华大单片机DMA学习

#define BUFFER_SIZE 32U

// 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
};
// DMA传输目标地址
static uint32_t aDST_Buffer[BUFFER_SIZE];
 

// 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
}

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值