电源设计技术实用资料点击免费获取>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » samsung S3C4510B之DMA实战篇

共5条 1/1 1 跳转至

samsung S3C4510B之DMA实战篇

菜鸟
2002-06-17 21:32:00    评分
以前从未接触过DMA数据传输,云里雾里知道一些。这两天刚好在S3C4510B上作DMA传输测试,花了半天时间把它搞定了。可能论坛里也有和我一样对DMA不熟悉的朋友,所以才写了这个DMA实战篇。   S3C4510B有两个通道的DMA控制器,DMA控制比较简单,但由于它的PDF文档不够详细,有些地方还是让初学者感到茫然,两个通道的控制方式是一样的,下面以通道0来作说明。和通道0相关的寄存器一共有4个,它们是:   控制寄存器GDMACON0--开始/停止DMA传输,模式选择,源地址和目的地址的变更,传送完中断允许,传输方向及模式选择等。   源地址寄存器GDMASRC0--数据源地址。注意其值会随数据传输改变。所以每次传完应该重置其值(fix情况下可以不重置)。   目的地址寄存器GDMADST0--数据目的地址。注意其值会随数据传输改变。所以每次传完应该重置其值(fix情况下可以不重置)。   数据计数寄存器GDMACNT0--一次DMA传输数据的个数,每传一个数据,其值减1,当为0时停止DMA传输。如果在控制寄存器GDMACON0中允许中断则会向CPU请求中断。   S3C4510B支持4种传输模式:1)软件方式--内存到内存,2)外部请求,3)UART0,4)UART1。好象不支持到I/O的传输。源地址和目的地址可以采用增,减或者固定不变的方式。数据的传输可以是单独,块,突发,连续,demand方式的组合。数据宽度可以是8位,16位,32位。这些都在控制寄存器GDMACON0中设定。另外,由于采用外部请求时,引脚是复用的,所以此时要配置I/O口相关的几个寄存器,这相对简单。   我始终认为源代码是最好的老师,所以下面给出了我的测试程序源代码,DMA采用外部请求方式,在中断服务程序中移位点灯,修正寄存器的值,重新开始DMA。希望能给初学者一些帮助,不足之处请大方之家指正。:) ----------------------- #include "vxworks.h" #include "stdio.h" #include "snds100.h" #include "arch/arm/ivarm.h" #include "logLib.h" #define SNDS_GDMACON0 (ASIC_BASE+0xB000) #define SNDS_GDMACON1 (ASIC_BASE+0xC000) #define SNDS_GDMASRC0 (ASIC_BASE+0xB004) #define SNDS_GDMASRC1 (ASIC_BASE+0xC004) #define SNDS_GDMADST0 (ASIC_BASE+0xB008) #define SNDS_GDMADST1 (ASIC_BASE+0xC008) #define SNDS_GDMACNT0 (ASIC_BASE+0xB00C) #define SNDS_GDMACNT1 (ASIC_BASE+0xC00C) #define DMA_LEN 8196 unsigned char index = 0; int s[DMA_LEN]; int d[DMA_LEN]; void arm7Dma0Irq(int arg) { *(volatile UINT32 *)SNDS_IOPDATA = ~(0x01<



关键词: samsung     S3C4510B     实战    

工程师
2002-06-17 21:41:00    评分
2楼
谢谢seasoblue经常发一些原创的好文,杂志社正准备对积极在论坛发言的网友按文章数量和质量发放稿费。

菜鸟
2002-06-18 01:41:00    评分
3楼
seasoblue拿到稿费后,可要请客哦

菜鸟
2002-06-18 18:38:00    评分
4楼
只是一些开发过程中的心得体会而已!希望能够对那此初学者有所帮助,因为起步是最难的。:)[em09]

菜鸟
2002-06-22 01:51:00    评分
5楼
第一个问题:前面我已经说了,我是第一次用dma,所以这只是一个测试程序,没有其它程序来调用,不是很正规,但完全可以跑起来,DMAInit相当我的主程序。当然你也可以去掉taskSuspend,但系统会释放掉DMAInit中所有的局部变量。 第二个问题:DMA中断并不是在外部请求时产生的,而是在dma传完后产生的,此时4个寄存器的值已经改变,所以在下一次传输开始之前必须重新初始化。而中断的产生又依赖于最开始的寄存器初始化,所以开始的初始化并不多余! 第三个问题:不难看出,index只是一个用来循环点灯的变量,只是方便一些而已,你完全可以用其它的方法。 [color=#000066][此贴子已经被作者于2002-6-21 17:51:24编辑过][/color]

共5条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]