hal_dma.c

来自「最新版IAR FOR ARM(EWARM)5.11中的代码例子」· C语言 代码 · 共 121 行

C
121
字号
//-----------------------------------------------------------------------------
// HAL_DMA
//-----------------------------------------------------------------------------
#include "hal_dma.h"
#include <stdlib.h>
//-----------------------------------------------------------------------------
void DMA_Start(DMA_TypeDef *channel){
    channel->DMACtrl |= DMA_Enable;
}


//-----------------------------------------------------------------------------
int DMA_Init(DMA_TypeDef *channel, u32 count){

    channel->DMAMax = count;
    channel->DMACtrl = (DMA_SoSize & DMA_SoSize_32)
                       | (DMA_DeSize & DMA_DeSize_32) | (DMA_SoBurst & DMA_SoBurst_4)|
                         DMA_Mem2Mem | (DMA_DeInc & DMA_DeInc_Inc) | (DMA_SoInc & DMA_SoInc_Inc);

    DMA_CH->DMAMask = 0x0;
    DMA_CH->DMAClr = DMA_DMAClr_Mask;
    return 1;
}


//-----------------------------------------------------------------------------
int DMA_SetSrcAddress(DMA_TypeDef *channel, u32 address){

  Address_SrcDest temp;
  temp.address = address;

  channel->DMASourceLow = temp.address_h;
  channel->DMASourceHigh = temp.address_l;
  return 1;
}

//-----------------------------------------------------------------------------
int DMA_SetDstAddress(DMA_TypeDef *channel, u32 address){

  Address_SrcDest temp;
  temp.address = address;
  channel->DMADestLo = temp.address_h;
  channel->DMADestHigh = temp.address_l;

  return 1;
}


//-----------------------------------------------------------------------------
void DMA_EnableInterrupt(DMA_TypeDef *channel){

  if (channel == DMA_CH0){
          DMA_CH->DMAMask |= DMA_DMAMask_Mask0;
          DMA_CH->DMAMask |= DMA_DMAMask_MaskE0;
          }
  else if (channel == DMA_CH1){
          DMA_CH->DMAMask |= DMA_DMAMask_Mask1;
          DMA_CH->DMAMask |= DMA_DMAMask_MaskE1;
          }

  else if (channel == DMA_CH2){
          DMA_CH->DMAMask |= DMA_DMAMask_Mask2;
          DMA_CH->DMAMask |= DMA_DMAMask_MaskE2;
          }
  else if (channel == DMA_CH3){
          DMA_CH->DMAMask |= DMA_DMAMask_Mask3;
          DMA_CH->DMAMask |= DMA_DMAMask_MaskE3;
          }
  return;
}

//-----------------------------------------------------------------------------
void DMA_DisableInterrupt(DMA_TypeDef *channel){

  if (channel == DMA_CH0){
          DMA_CH->DMAMask &= ~DMA_DMAMask_Mask0;
          DMA_CH->DMAMask &= ~DMA_DMAMask_MaskE0;
          }
  else if (channel == DMA_CH1){
          DMA_CH->DMAMask &= ~DMA_DMAMask_Mask1;
          DMA_CH->DMAMask &= ~DMA_DMAMask_MaskE1;
          }

  else if (channel == DMA_CH2){
          DMA_CH->DMAMask &= ~DMA_DMAMask_Mask2;
          DMA_CH->DMAMask &= ~DMA_DMAMask_MaskE2;
          }
  else if (channel == DMA_CH3){
          DMA_CH->DMAMask &= ~DMA_DMAMask_Mask3;
          DMA_CH->DMAMask &= ~DMA_DMAMask_MaskE3;
          }
  return;
}

//-----------------------------------------------------------------------------
void DMA_ClrInterrupt(DMA_TypeDef *channel){

  if (channel == DMA_CH0){
          DMA_CH->DMAClr = DMA_DMAClr_Clear0;
          DMA_CH->DMAClr = DMA_DMAClr_ClearE0;
          }
  else if (channel == DMA_CH1){
          DMA_CH->DMAClr = DMA_DMAClr_Clear1;
          DMA_CH->DMAClr = DMA_DMAClr_ClearE1;
          }

  else if (channel == DMA_CH2){
          DMA_CH->DMAClr = DMA_DMAClr_Clear2;
          DMA_CH->DMAClr = DMA_DMAClr_ClearE2;
          }
  else if (channel == DMA_CH3){
          DMA_CH->DMAClr = DMA_DMAClr_Clear3;
          DMA_CH->DMAClr = DMA_DMAClr_ClearE3;
          }
  return;
}

//-----------------------------------------------------------------------------


⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?