S3C6410 裸机DMA


/*************************************************************************************************************
 * 文件名: dma.c
 * 功能:  S3C6410 DMA底层驱动函数
 * 作者:  cp1300@139.com
 * 创建时间: 2013年01月23日21:06
 * 最后修改时间:2013年01月23日
 * 详细:  DMA控制器底层驱动
*************************************************************************************************************/
#include "system.h"
#include "DMA.h"

 

/*************************************************************************************************************************
*函数      : void DMA_Init(void)
*功能      : DMA初始化
*参数      : 无
*返回      : 无
*依赖  :  底层
*作者      : cp1300@139.com
*时间     : 20130131
*最后修改时间 : 20130131
*说明     : 无
*************************************************************************************************************************/
void DMA_Init(void)
{
 Set_GateClk(HCLK_DMA0, ENABLE);
 Set_GateClk(HCLK_DMA1, ENABLE);
 
}

 

/*************************************************************************************************************************
*函数      : void DMA_SetConfig(DMA_TypeDef *DMA, DMA_CHX ch, DMA_Config *config)
*功能      : DMA配置
*参数      : DMA:DMA模块选择,见DMA_TypeDef;ch:通道选择,见DMA_CHX;config:配置,见DMA_Config
*返回      : 无
*依赖  :  底层
*作者      : cp1300@139.com
*时间     : 20130131
*最后修改时间 : 20130131
*说明     : 用于设置DMA
*************************************************************************************************************************/
void DMA_SetConfig(DMA_TypeDef *DMA, DMA_CHX ch, DMA_Config *config)
{
 DMA_Enable(DMA);   //使能DMA模块
 (DMA->CH[ch]).SrcAddr =  config->SrcAddr;             //设置源地址
 (DMA->CH[ch]).DestAddr =  config->DestAddr;             //设置目标地址
 (DMA->CH[ch]).Control0 =     0x80000000  //1<<31            //是否在当前的传输完成后产生中断
        | ((config->DestIncrement == ENABLE) ? (1 << 27) : 0)    //目标地址自增
        | ((config->SrcIncrement == ENABLE) ? (1 << 26) : 0)    //源地址自增
        | ((config->DestPeripheral == DMA_MEM) ? AHB_M1 : AHB_M2) << 25  //目标AHB主机选择
        | ((config->SrcPeripheral == DMA_MEM) ? AHB_M1 : AHB_M2) << 24  //源AHB主机选择
        | (config->FlowWidth & 0x7) << 21         //目标传输宽度
        | (config->FlowWidth & 0x7) << 18         //源传输宽度
        | (config->BurstSize & 0x7) << 15         //目标传输脉冲大小,单次传输的数量
        | (config->BurstSize & 0x7) << 12;         //源传输脉冲大小,单次传输的数量
 (DMA->CH[ch]).Control1 =  config->DataSize & 0x1ffffff;          //传输数据数量
 (DMA->CH[ch]).Config  =   (0<<18)// enable DMA requests
        | (0<<16) // disables locked transfers
        | (1<<15) // Teminal count interrupt enable
        | (0<<14) // Interrupt error mask              //允许DMA请求
        | (((config->SrcPeripheral == DMA_MEM) ? 0 : 1) << 12)
        | (((config->DestPeripheral == DMA_MEM) ? 0 : 1) << 11)         //传输模式,如内存到内存等
        | (config->DestPeripheral & 0x0f) << 6  //目标外设
        | (config->SrcPeripheral & 0x0f) << 1;  //源外设
 (DMA->CH[ch]).LLI   =  config->LLIArrd;             //下一个传输LLI配置位置
 //(DMA->CH[ch]).ConfigExp =  7;
}

 

/*************************************************************************************************************************
*函数      : void DMA_Enable(DMA_TypeDef *DMA)
*功能      : DMA使能
*参数      : DMA:DMA模块选择,见DMA_TypeDef;
*返回      : 无
*依赖  :  底层
*作者      : cp1300@139.com
*时间     : 20130131
*最后修改时间 : 20130131
*说明     : 无
*************************************************************************************************************************/
void DMA_Enable(DMA_TypeDef *DMA)
{
 DMA->Config = 0x01; //AHB小端模式,启动DMA控制器 
}

 

/*************************************************************************************************************************
*函数      : void DMA_Disable(DMA_TypeDef *DMA)
*功能      : DMA关闭
*参数      : DMA:DMA模块选择,见DMA_TypeDef;
*返回      : 无
*依赖  :  底层
*作者      : cp1300@139.com
*时间     : 20130131
*最后修改时间 : 20130131
*说明     : 无
*************************************************************************************************************************/
void DMA_Disable(DMA_TypeDef *DMA)
{
 DMA->Config = 0x00; //AHB小端模式,关闭DMA控制器 
}

 

/*************************************************************************************************************************
*函数      : void DMA_StartChannels(DMA_TypeDef *DMA, DMA_CHX ch)
*功能      : DMA通道传输开始
*参数      : DMA:DMA模块选择,见DMA_TypeDef;ch:通道选择,见DMA_CHX;
*返回      : 无
*依赖  :  底层
*作者      : cp1300@139.com
*时间     : 20130131
*最后修改时间 : 20130131
*说明     : 无
*************************************************************************************************************************/
void DMA_StartChannels(DMA_TypeDef *DMA, DMA_CHX ch)
{
 DMA_ClearIntTCStatus(DMA0, ch);
 DMA_ClearIntErrorStatus(DMA0, ch);
 
 (DMA->CH[ch]).Config |= 1 << 0;  //通道使能
}

 

/*************************************************************************************************************************
*函数      : void DMA_WaitComplete(DMA_TypeDef *DMA, DMA_CHX ch)
*功能      : 等待传输完成
*参数      : DMA:DMA模块选择,见DMA_TypeDef;ch:通道选择,见DMA_CHX;
*返回      : 无
*依赖  :  底层
*作者      : cp1300@139.com
*时间     : 20130131
*最后修改时间 : 20130131
*说明     : 无
*************************************************************************************************************************/
void DMA_WaitComplete(DMA_TypeDef *DMA, DMA_CHX ch)
{
 while(!(DMA->RawIntTCStatus & (1 << ch)));
}


/*************************************************************************************************************************
*函数      : void DMA_ClearIntTCStatus(DMA_TypeDef *DMA, DMA_CHX ch)
*功能      : DMA清除DMA传输完成中断状态
*参数      : DMA:DMA模块选择,见DMA_TypeDef;ch:通道选择,见DMA_CHX;
*返回      : 无
*依赖  :  底层
*作者      : cp1300@139.com
*时间     : 20130131
*最后修改时间 : 20130131
*说明     : 无
*************************************************************************************************************************/
void DMA_ClearIntTCStatus(DMA_TypeDef *DMA, DMA_CHX ch)
{
 DMA->IntTcClear |= 1 << ch;
}


/*************************************************************************************************************************
*函数      : void DMA_ClearIntErrorStatus(DMA_TypeDef *DMA, DMA_CHX ch)
*功能      : 清除DMA传输错误中断状态
*参数      : DMA:DMA模块选择,见DMA_TypeDef;ch:通道选择,见DMA_CHX;
*返回      : 无
*依赖  :  底层
*作者      : cp1300@139.com
*时间     : 20130131
*最后修改时间 : 20130131
*说明     : 无
*************************************************************************************************************************/
void DMA_ClearIntErrorStatus(DMA_TypeDef *DMA, DMA_CHX ch)
{
 DMA->IntErrClear |= 1 << ch;
}

  • 1
  • 2
  • 下一页

相关内容