关键词: samsung S3C4510B 实战
共5条
1/1 1 跳转至页
samsung S3C4510B之DMA实战篇
以前从未接触过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 实战
关键词: samsung S3C4510B 实战
第一个问题:前面我已经说了,我是第一次用dma,所以这只是一个测试程序,没有其它程序来调用,不是很正规,但完全可以跑起来,DMAInit相当我的主程序。当然你也可以去掉taskSuspend,但系统会释放掉DMAInit中所有的局部变量。
第二个问题:DMA中断并不是在外部请求时产生的,而是在dma传完后产生的,此时4个寄存器的值已经改变,所以在下一次传输开始之前必须重新初始化。而中断的产生又依赖于最开始的寄存器初始化,所以开始的初始化并不多余!
第三个问题:不难看出,index只是一个用来循环点灯的变量,只是方便一些而已,你完全可以用其它的方法。
[color=#000066][此贴子已经被作者于2002-6-21 17:51:24编辑过][/color]
共5条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
vscode+cmake搭建雅特力AT32L021开发环境被打赏30分 | |
【换取逻辑分析仪】自制底板并驱动ArduinoNanoRP2040ConnectLCD扩展板被打赏47分 | |
【分享评测,赢取加热台】RISC-V GCC 内嵌汇编使用被打赏38分 | |
【换取逻辑分析仪】-基于ADI单片机MAX78000的简易MP3音乐播放器被打赏48分 | |
我想要一部加热台+树莓派PICO驱动AHT10被打赏38分 | |
【换取逻辑分析仪】-硬件SPI驱动OLED屏幕被打赏36分 | |
换逻辑分析仪+上下拉与多路选择器被打赏29分 | |
Let'sdo第3期任务合集被打赏50分 | |
换逻辑分析仪+Verilog三态门被打赏27分 | |
换逻辑分析仪+Verilog多输出门被打赏24分 |