DMA机制(基于S3C6410)
来源:互联网 发布:手机图文转换软件 编辑:程序博客网 时间:2024/06/05 12:12
1.DMA概括
DMA的英文拼写是“Direct Memory Access”,汉语的意思就是直接内存访问,是一种不经过CPU而直接从内存存取数据的数据交换模式。在DMA模式下,CPU只须向DMA控制器下达指令,让DMA控制器来处理数据的传送,数据传送完毕再把信息反馈给CPU,这样就很大程度上减轻了CPU资源占有率,可以大大节省系统资源。上节我们做的串口驱动就是由CPU完成数据的传输的,现在我们打开DMA,让DMA去完成这项工作,这样就可以解放CPU,让CPU去做其他的事情。
2.关于DMA控制器
(1)通道数:6410有4个DMA控制器(初始化的时候要选择),每个控制器有8个通道,所以一共有32个通道。
(2)请求源:这里列出部分请求源,从图中可以看出每个串口源对应的控制器有两个DMAx和SDMAx,但是在实际中只能选择一个控制器来用,默认情况下使用SDMAx。
(3)基本时序
nXDREQ请求生效并经过2CLK周期同步后,nXDACK响应并开始生效,但至少还要经过3CLK的周期延迟,DMA控制器才可获得总线的控制权,并开始数据传输
(4)工作模式:
•Demond模式:
如果DMA完成一次请求后如果Request仍然有效,那么DMA就认为这是下一次DMA请求,并立即开始下一次的传输
•Handshake模式:
DMA完成一次请求后等待Request信号无效,如果Request无效,DMA会无效ACK两个时钟周期,再等待下一次Request。
3.初始化DMA
DMA控制器的作用就是将内存中的数据放到串口中去,所以其实主要就是对源地址和目的地址的初始化。初始化工作分为以下几个步骤。
选择DMA控制器
由上文可知,使用串口时有两个控制器,但是只能用一个,这里引入SDMA_SEL寄存器。
因为使用串口0,选择SDMA控制器,所以应该选择SDMA_SEL寄存器中第0位,写入0即可。
使能DMA控制器
这里引入DMACConfiguration寄存器,这个寄存器中第0位设置为1,去使能DMA控制器。]\
初始化源地址
这里引入DMACCxSrcAddr寄存器,这个寄存器只需要写入源地址即可。
初始化目的地址
这里引入DMACCxDestAddr寄存器,这里同样只要写入目的地址即可。
对控制寄存器进行配置
这里引入DMACCxControl寄存器,DMACCxControl1主要是配置25,26和31位。其中25位是目的地址的选择,由于目的地址是串口,属于外设,所以写入1。26是设置源地址增长,由于在数据传输过程中,DMA每从内存中取出一个数据放到串口后,源地址需要增长一位供DMA取出数据,所以这里设置为1。31位设置中断允许位,设置为1。DMACCxControl2主要是设置传输数据的大小。
这里还需要设置DMACCxConfiguration寄存器,关于这个寄存器主要配置第0,6,11,14,15位。
第6位:由于目的地址是属于外设的,所以这里设置为1。
第11位:设置流控,由于数据是从内存到外设中去(Memory to peripheral),所以11位设置为001。
第14位和第15位主要是设置中断屏蔽的,这里直接设置为1。所有工作都配置好了后,最后就是启动DMA传输,只要设置第0位,使能channel enable即可。
下面附上程序:
/*S3C6410中DMA操作步骤:1、决定使用安全DMAC(SDMAC)还是通用DMAC(DMAC);2、开启DMAC控制,设置DMAC_Configuration寄存器;3、清除传输结束中断寄存器和错误中断寄存器;4、选择合适的优先级通道;5、设置通道的源数据地址和目的数据地址(设置DMACC_SrcAddr和DMACC_DestAddr);6、设置通道控制寄存器0(设置DMACC_Control0);7、设置通道控制寄存器1,(传输大小,设置DMACC_Control1);8、设置通道配置寄存器;(设置DMACC_Configuration)9、使能相应通道(设置DMACC_Configuratoin);*/#define SDMA_SEL (*((volatile unsigned long *)0x7E00F110))#define DMACIntTCClear (*((volatile unsigned long *)0x7DB00008))#define DMACIntErrClr (*((volatile unsigned long *)0x7DB00010))#define DMACConfiguration (*((volatile unsigned long *)0x7DB00030))#define DMACSync (*((volatile unsigned long *)0x7DB00034))#define DMACC0SrcAddr (*((volatile unsigned long *)0x7DB00100))#define DMACC0DestAddr (*((volatile unsigned long *)0x7DB00104))#define DMACC0Control0 (*((volatile unsigned long *)0x7DB0010c))#define DMACC0Control1 (*((volatile unsigned long *)0x7DB00110))#define DMACC0Configuration (*((volatile unsigned long *)0x7DB00114))#define UTXH0 (volatile unsigned long *)0x7F005020char src[100] = "\n\rHello World-> This is a test!\n\r";void dma_init(){ //DMA控制器的选择(SDMAC0) SDMA_SEL = 0; //DMA控制器使能 DMACConfiguration = 1; //初始化源地址 DMACC0SrcAddr = (unsigned int)src; //初始化目的地址 DMACC0DestAddr = (unsigned int)UTXH0; //对控制寄存器进行配置 /* 源地址自增 目的地址固定、 目标主机选择AHB主机2 源主机选择AHB主机1 */ DMACC0Control0 =(1<<25) | (1 << 26)| (1<<31); DMACC0Control1 = 0x64; //传输的大小 /* 流控制和传输类型:MTP 为 001 目标外设:DMA_UART0_1,源外设:DMA_MEM 通道有效: 1 */ DMACC0Configuration = (1<<6) | (1<<11) | (1<<14) | (1<<15);}void dma_start(){ //开启channel0 DMA DMACC0Configuration = 1; }
- DMA机制(基于S3C6410)
- dma s3c6410
- s3c6410 DMA
- s3c6410 DMA 实现(入门级)
- AC97之DMA(s3c6410)
- s3c6410 DMA驱动分析
- S3C6410 裸机DMA
- S3C6410-DMA裸机编程
- S3C6410--DMA裸机开发实例
- s3c6410 linux DMA驱动分析
- s3c6410 linux DMA驱动分析
- S3C6410--DMA裸机开发实例
- 基于S3c6410触摸屏驱动分析(一)
- 基于S3c6410触摸屏驱动分析(二)
- 基于S3c6410触摸屏驱动分析(一)
- 串口驱动设计(基于S3C6410)
- Linux 内核DMA机制
- Linux 内核DMA机制
- igmp
- Python:汉诺塔问题递归算法
- CAD.net 创建面板
- 自定义view--刻度尺rulerview
- 最重要的AI资源都在这里(大牛,研究机构,视频,博客,书籍,Quora......)
- DMA机制(基于S3C6410)
- 多人合作开发的标准制定
- 剑指offer-机器人的运动范围
- SQL Server 客户端连接的问题
- 典型例题
- cmd里面的标识?
- SIFT算法学习总结
- POJ1300 欧拉回路 解题报告
- js ---str转utf8与utf-8转str