DMA分析之代码

本代码来自http://blog.csdn.net/cp1300/article/details/8605104 博主的博客 再此表示感谢

/*************************************************************************************************************
 * 文件名: 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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值