DMA解析

来源:互联网 发布:python ascii转utf8 编辑:程序博客网 时间:2024/05/02 05:45

一、DMA原理解析
Demand模式:如果DMA完成一次请求后Request仍然有效,那么DMA就认为这是下一次DMA请求,并立即开始下一次的传输。
Handshake模式:DMA完成一次请求后等待Request信号无效,如果Request无效,DMA会无效ACK两个时钟周期,再等待下一次Request。
二、S3C2440芯片手册与原理图解析
1、请求源
这里写图片描述
2、基本时序
这里写图片描述
nXDREQ请求生效并经过2CLK周期同步后,nXDACK响应并开始生效,但至少还要经过3CLK的周期延迟,DMA控制器才可获得总线的控制权,并开始数据传输。
3、芯片手册解读
3.1
这里写图片描述
内存走AHB BUS, 串口走APB BUS
3.2
这里写图片描述
3.3
这里写图片描述
3.4
这里写图片描述
3.5
这里写图片描述
3.6
这里写图片描述
这里写图片描述
这里写图片描述
3.7
这里写图片描述
三、DMA程序设计
char *buf = “Hello World!”
#define DISRC0 (*(volatile unsigned long)0x4B000000)
#define DISRCC0 (*(volatile unsigned long)0x4B000004)
#define DIDST0 (*(volatile unsigned long)0x4B000008)
#define DIDSTC0 (*(volatile unsigned long)0x4B00000C)
#define DCON0 (*(volatile unsigned long)0x4B000010)
#define DMASKTRIG0 (*(volatile unsigned long)0x4B000020)
#define UTXH0 (volatile unsigned long*)0x50000020
void dma_init()
{
//初始化源地址
DISRC0 = (unsigned int)buf;
DISRCC0 = (0<<1)| (0<<0);
//初始化目的地址
DIDST0 = UTXH0;
DIDSTC0 = (1<<1)| (1<<0);
DCON0 = (1<<24)| (1<<23)| (1<<22)| (12<<0);
}
void dma_start()
{
DMASKTRIG0 = (1<<1);
}

0 0