一、使用DMA的优点及DMA支持的请求源
1、DMA优点是其进行数据传输时不需要CPU的干涉,可以大大提高CPU的工作效率。
2、DMA在大容量数据传输中非常重要,比如图像数据传输,SD卡数据传输,USB数据传输等。
3、S3C2440有四个DMA,每个DMA支持的工作方式基本相同,但支持的DMA请求源可能略有不同。如下为四个DMA通道分别支持的DMA请求源:
Ch0: nXDREQ0, UART0, SDI, Timer, USB EP1
Ch1: nXDREQ1, UART1, I2SSDI, SPI0, USB EP2
Ch2: I2SSDO, I2SSDI, SDI, Timer, USB EP3
Ch3: UART1, SDI, SPI1, Timer, USB EP4
那么怎么使用DMA呢,S3C2440内部集成了DMA控制器,我们只需要简单的配置一下寄存器就可以实现DMA的传输了。
二、DMA配置步骤及要点: (参考点击打开链接)
1. 数据从哪里来,到哪里去?
使用DMA首先我们要知道数据的流向,DISRCx寄存器是DMA初始源寄存器,存放了数据的源地址。DIDSTx是DMA的初始目的寄存器,存放数据的目的地址。
2. 数据走的什么总线?地址是否是固定的?
我们还要知道源与目的数据存储设备在什么总线上(AHB系统总线,一般是高速的比如内存,APB外围总线,低速的比如SD,UART;具体走什么总线可以在datasheet上查到);以及数据传输结束以后起始地址还原到发送前的起始地址呢,还是在现在的末尾+1做为新的起始地址。这些设置在DISRCCx与DIDSTCx两个寄存器里面配置。
3. 数据以什么方式传输?源与目的是什么设备?要不要自动重载?
需要确定数据的传输方式有请求还是握手,根据上面的总线确定与什么时钟同步(HCLK,PCLK),是单元传输还是突发传输,是以字节传输还是字传输,是否重载。是单服务(只发送一次)还是多服务(不停循环发送),以及数据的传送大小。选择源与目的设备。最后还要确定中断是不是传输结束发生(CURR_TC记数是不是0)。这些都在DCONx中设置。
4. 怎么开始传输DMA和停止DMA,这些在DMASKTRIG中设置。
三、操作实例(以DMA传输一段字符到控制台为例)
/*
*版权所有(C)2015,ZJU
*
*文件名称:dma.c
*内容摘要:关于DMA的配置
*其它说明:开发板型号: TX2440
* 注意Uart_Init中,设置UCON0寄存器时TX的方式要设置为DMA模式
*当前版本:V1.0
*作 者:Frank
*完成日期:2015.12.19
*
*/
#define DISRC0 (*(volatile unsigned long *)0x4B000000) //DMA 0 initial source register
#define DISRCC0 (*(volatile unsigned long *)0x4B000004) //DMA 0 initial source control register
#define DIDST0 (*(volatile unsigned long *)0x4B000008) //DMA 0 initial destination register
#define DIDSTC0 (*(volatile unsigned long *)0x4B00000C) //DMA 0 initial destination control register
#define DCON0 (*(volatile unsigned long *)0x4B000010) //DMA 0 control register
#define DMASKTRIG0 (*(volatile unsigned long *)0x4B000020) //DMA 0 mask trigger register
#define UTXH0 (volatile unsigned long *)0x50000020 //UART channel 0 transmit buffer register
char *buf = "Hello World!";
/*******************************************************************
*函数名称:Dma_Init()
*功能描述:DMA初始化函数
*其他说明:
*创建日期:2015.12.19
*******************************************************************/
void Dma_Init(void)
{
//初始化源地址
DISRC0 = (unsigned int)buf;
DISRCC0 = (0 << 1) | (0 << 0); //DMA起始地址在AHB总线(Memory), 地址递增
//初始化目的地址
DIDST0 = (unsigned int)UTXH0; //目的地址为 UTXH0
DIDSTC0 = (1 << 1) | (1 << 0); /*DMA目的地址在APB总线(UART0), 地址不
变(因为要发送的字符总是传到UTXH0)*/
DCON0 = (1 << 24) | (1 << 23) | (1 << 22) | (12 << 0); //设置DMA请求源及工作模式
}
/*******************************************************************
*函数名称:Dma_Start()
*功能描述:DMA启动函数
*其他说明:
*创建日期:2015.12.19
*******************************************************************/
void Dma_Start(void)
{
DMASKTRIG0 = (1 << 1); //启动DMA通道
}
需要注意的几点是:
①没有使用DMA中断;
②使用的是Demand模式,实测发现Handshake模式也是可以的(推荐);
③在Uart_Init中,要将UCON0寄存器设置为发送采用DMA模式(开始就是没有设置,所以一直无法看到实验现象);
④源地址和目的地址要使用unsigned int强制转换为整数放进寄存器中;
上一篇:记录2--s3c2440 DMA的操作
下一篇:学习笔记 --- S3C2440 DMA操作原理
推荐阅读最新更新时间:2024-11-17 00:39
设计资源 培训 开发板 精华推荐
- BLE113开发套件设计资料
- REP018: 工作在通用183.6MHz IF的双频双模FE IC
- DC814B-G,使用 LTC6905-80 17MHz 至 170MHz 固定频率硅振荡器的演示板
- Linkwitz-Riley滤波器(低通&高通)
- 萝丽双路双向集成8通接收
- NCV74255V1GEVB:5 V / 150 mA LDO 评估板
- NCP301LSN33T1 3.3V双电源欠压监测典型应用
- AM2G-0505SH30Z 5V 2 瓦 DC-DC 转换器的典型应用
- CY7C68013A-56LTXI 8CH SaleaLogic
- 用于汽车应用的 TRK-USB-S12G128、S12G StarterTRAK USB 开发系统
- 有奖测评 | 英飞凌新品情报站:最新 5V XENSIVTM PAS CO2 传感器 套件测评
- 有奖直播|基于TI最新低功耗60GHz毫米波雷达传感器的工业应用
- 有奖活动“庖丁”解智能睡眠监测仪,一波“水军”来围观
- 技术直播【安森美功率器件在新能源市场中的应用】(9:30入场)
- 艾睿照明设计工具初体验:与LED设计的亲密接触!
- 4月25日上午10:00-11:30 ADI与您相约 TOF (Time Of Flight) 技术介绍及产品应用 有奖直播
- EEWORLD下载中心热力上线!
- 降暑消消乐 和Silicon Labs一起消灭这包“以太网供电难题”
- 【EE团拍卖】RealARM6410 零元风暴来袭,你能HOLD住吗?
- TE 学习中心 视频培训随心点