DMA优点是其进行数据传输时不需要CPU的干涉,可以大大提高CPU的工作效率。
DMA大容量数据传输中非常重要,比如图像数据传输,SD卡数据传输,USB数据传输等等。
S3C2410有四个DMA,每个DMA支持工作方式基本相同,但支持的source Dest可能略有不同。
那么怎么使用DMA呢,S3C2410内部集成了DMA控制器,我们只需要简单的配置一下寄存器就可以实现DMA的传输了。
步骤与要点:
1.数据从哪里来,到哪里去?
使用DMA当然首先我们要知道数据的流向,DISRCx寄存器是DMA初始源寄存器存放了数据的源地址。DIDSTx是DMA的初始目的寄存器,应该存放数据的目的地址。
2.数据走得什么总线?地址是否是固定的?
我们还要知道源与目的数据存储设备是在什么总线上(AHB系统总线,一般是高速的比如内存,APB外围总线低速的,比如SD,UART);
以及数据传输结束以后起始地址还原到发送前的起始地址呢,还是在现在的末尾+1做为新的起始地址。
这些设置在DISRCCx与DIDSTCx两个寄存器里面配置。
3.数据以什么方式传输?源与目的是什么设备?要不要自动重载?
需要确定数据的传输方式有请求还是握手(推荐使用HANDSHAKE),根据上面的总线确定与什么时钟同步(HCLK,PCLK),是单元传输还是突发传输,是以字节传输还是字传输,是否重载。是单服务(只发送一次)还是多服务(不停循环发送),以及数据的传送大小。
选择源与目的设备,这里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
最后还要确定中断是不是传输结束发生(CURR_TC记数是不是0)。
这些都在DCONx中设置。
4.怎么开始传输DMA和停止DMA,这些在DMASKTRIG中设置。
下面是DMA在SD卡中使用的一段示例:
SD卡读的DMA设置:
pISR_DMA0=(unsigned)DMA_end; //DMA中断服务函数入口地址,一次DMA传送结束发生rINTMSK = ~(BIT_DMA0); //开DMA中断
rDISRC0=(int)(Tx_buffer); //源地址在内存 就是从内存读数据到SD卡
rDISRCC0=(0<<1)+(0<<0); //内存的总线是 AHB, 地址是自动增加inc
rDIDST0=(U32)(SDIDAT); // 目的地址SD卡
rDIDSTC0=(1<<1)+(1<<0); // 在总线APB, 地址是固定的因为SD的FIFO是固定大的
rDCON0=(1<<31)+(0<<30)+(1<<29)+(0<<28)+(0<<27)+(2<<24)+(1<<23)+(1<<22)+(2<<20)+128*block;
//handshake握手模式, 与 PCLK同步,发送完产生中断, 单元传输, 单服务, SDI
//不自动重载,每次发送一个字,发送大小
rDMASKTRIG0=(0<<2)+(1<<1)+0; //不停止, DMA0 channel 启动,不用SW触发
SD卡写的相应代码
pISR_DMA0=(unsigned)DMA_end;
rINTMSK = ~(BIT_DMA0);
rDISRC0=(int)(Tx_buffer);
rDISRCC0=(0<<1)+(0<<0);
rDIDST0=(U32)(SDIDAT);
rDIDSTC0=(1<<1)+(1<<0);
rDCON0=(1<<31)+(0<<30)+(1<<29)+(0<<28)+(0<<27)+(2<<24)+(1<<23)+(1<<22)+(2<<20)+128*block;
rDMASKTRIG0=(0<<2)+(1<<1)+0;
上一篇:裸机系列——supervivi烧写
下一篇:S3C2410:DMA介紹
推荐阅读最新更新时间:2024-11-08 12:38
推荐帖子
- 知道吗开发DSP项目需要什么工具?
- 与传统的微处理器一样,一个DSP项目需以下几个指标:把算法转成机器语言要使用codegentools,它主要包括c编译器,汇编器,连接器,代码生成器,闻亭公司为TI各个系列的DSP提供了这样的工具。为了验证这些算法需目标DSP来执行算法。你主要是围绕自己应用中的某一DSP来设计自己的硬件。先让硬件工作起来,可以使用现成的目标板来规范代码。目标板从闻亭公司获得用来支持通用的TIDSP。在调试过程中仿真器对控制DSP运行是必不可少的。闻亭公司销售工作在以下几种调试软件下的仿真工
- fish001 DSP 与 ARM 处理器
- 立即填写问卷, 免费申请价值 USD50 的 C2000 Piccolo-A/B 开发套件
- 立即填写问卷,免费申请价值USD50的Piccolo-A/B开发套件!C2000Piccolo-A/B开发评估套件是一个基于32位C28x内核的微控制器的通用评估平台,支持针对TMS320F2802x或TMS320F2803x系列所有产品的软硬件开发评估。该套件是开发者用于初期设备评估和测试的理想产品,Piccolo开发评估套件包含一个TMS320F28027或TMS320F28035评估板和一个XDS100USB的高性能仿真器。评估板可直接
- tiankai001 Microchip MCU
- 使用C/C++语言编写基于TMS320系列DSP程序的注意事项
- 1、不影响执行速度的情况下,可以使用C或C/C++语言提供的函数库,也可以自己设计函数,这样更易于使用“裁缝师”优化处理,例如:进行绝对值运算,可以调用fabs()或abs()函数,也可以使用if...else...判断语句来替代。2、要非常谨慎地使用局部变量,根据自己项目开发的需要,应尽可能多地使用全局变量和静态变量。3、一定要非常重视中断向量表的问题,很多朋友对中断向量表的调用方式不清楚。其实中断向量表中的中断名是任意取定的,DSP是不认名字的,它只认地址!!中断
- Jacktang DSP 与 ARM 处理器
- 51单片机到底使用哪种晶振好
- 从定时器中断准确的角度看,12M的晶振可以算出每个机器周期为1微妙从串口的角度看,使用11.0592M可以准确算出定时器起始值我现在要自己设计一个电路板,请问使用哪种好呢?谢谢。51单片机到底使用哪种晶振好11.0592M更好定时器的中断周期好像跟机器周期没什么关系不过51的话22.1184M也可以啊C51的最大晶振是24M的用来玩的问题都不大用来做产品的话,先用可靠的,再用便宜的我现在主要是想做一个电子钟,又要有串口下载功能是不是选用12M的晶振更好些?建议用12m
- shenyesanbu 嵌入式系统
- [转贴]数字电视地面传输标准敲定融合方案
- Felix 移动便携
- LLC拓扑电源死区时间一般都是IC内部自己定义的么?
- 各位老师好,在学习LLC拓扑电源时,也发现其他地方有这个问题,一直没有解决。看看咱们这里的老师是否知道,LLC拓扑电源死区时间一般都是IC内部自己定义的么?所以就想问是否还有其他方式可以进行调整。主控芯片为英飞凌的IDP2303A,资料如下附件中,如下图为该IC的datasheet和原理图,谢谢。LLC拓扑电源死区时间一般都是IC内部自己定义的么?
- kal9623287 电源技术
设计资源 培训 开发板 精华推荐
- ADA4505-2ACBZ-R7 血糖仪中使用的四极黄油值滤波器的典型应用电路
- EVAL-AD9238,用于 AD9238 双 VGA 和 ADC 的评估板
- EVAL-ADG5248FEBZ,ADG5248F 过压保护 8:1 多路复用器评估板
- EVAL-ADMP621Z-FLEX,基于 ADMP621 的 PDM 数字输出 MEMS 麦克风评估板
- LF33ABV 3.3V 顺序极低压降稳压器多输出电源的典型应用
- LTC3621EMS8E-25 1.2Vout、同步至 600kHz、强制连续模式同步降压稳压器的典型应用
- 使用 NXP Semiconductors 的 MKE02Z64VQH4 的参考设计
- 山西晋中理工学院实验室卡片
- LTC2481、具有轻松驱动输入电流消除和 I2C 接口的 16 位 Delta Sigma ADC 的典型应用
- 【训练营官方案例】USB电流表