当前位置:首页 > 单片机 > 单片机
[导读]1.硬件原理计算机系统中各种常用的数据输入/输出方法有查询方式(包括无条件及条件传送方式)和中断方式,这些方式适用于CPU与慢速及中速外设之间的数据交换。但当高速外设要与系统内存或者要在系统内存的不同区域之间

1.硬件原理

计算机系统中各种常用的数据输入/输出方法有查询方式(包括无条件及条件传送方式)和中断方式,这些方式适用于CPU与慢速及中速外设之间的数据交换。但当高速外设要与系统内存或者要在系统内存的不同区域之间进行大量数据的快速传送时,就在一定程度上限制了数据传送的速率。直接存储器存取(DMA)就是为解决这个问题提出的,采用DMA方式,在一定时间段内,由DMA控制器取代CPU,获得总线控制权,来实现内存与外设或者内存的不同区域之间大量数据的快速传送。

SC2440支持位于系统总线与外围总线之间的四通道DMA控制。每一通道的DMA都可以处理一下四种情况:

1.源和目的器件均可以在系统总线

2.源器件在系统总线而目的器件在外围总线

3.源器件在外围总线而目的器件在系统总线

4.源和目的器件均可以在外围总线

DMA最大的有点就是可以在没有CPU干涉的情况下进行数据的传送。可以通过软件控制DMA启动,或者通过内部请求或者外部请求引脚启动。

2.芯片手册

3.mini2440电路图

4.S3C2440寄存器

DISRCx源初始化寄存器,存储发送源的地址。

DISRCCx源初始化控制寄存器,[0]控制地址增长模式,[1]用于配置源是在AHB总线还是在APB总线。

DIDSTx目标初始化寄存器,存储接收目标的地址。

DIDSTCx目标初始化控制寄存器,[0]控制地址增长模式,[1]用于配置源是在AHB总线还是在APB总线,[2]选择中断触发的时间。

DCONxDMA控制寄存器,

DSTATx状态寄存器,只读。

DCSRCxDMA现在的源地址,只读。

DCDSTxDMA现在的目标地址,只读。

DMASKTRIGxDMA屏蔽触发寄存器,开启DMA开关。

dma-uart.c


#include"def.h"

#include"mmu.h"

#include"2440addr.h"

#defineGLOBAL_CLK//相当于定义了FCLK,HCLK,PCLK,UCLK

#definePCLK150000000

#defineUART_CLKPCLK1

#defineUART_BAUD_RATE115200

#defineUART_BRD((int)(UART_CLK/(UART_BAUD_RATE*16)+0.5)-1)

#defineTXD0READY(1<<2)

#defineRXD0READY(1)

#defineSEND_DATA(*(volatileunsignedchar*)0x30200000)

#defineSEND_ADDR(volatileunsignedchar*)0x30200000//发送源地址

voidDMA_Init(void)

{

rUCON0=rUCON0&0xff3|0xa;//UART0dma收发

/******DMA0Initialize*****/

rDISRC0=(U32)(SEND_ADDR);

rDISRCC0=(0<<1)|(0<<0);//Src=AHB,Increment

rDIDST0=(U32)UTXH0;//TxFIFOaddress

rDIDSTC0=(1<<1)|(1<<0);//Dst=APB,Fixed;

rDCON0=(0<<31)|(0<<30)|(1<<29)|(0<<28)|(0<<27)|(1<<24)|(1<<23)|(1<<22)|(0<<20)|(50);

//handshake,Sync=APB,IntEn,unit,single,dst=UART0,HwReqMode,NoAutoReload,Halfword,

rDMASKTRIG0=(1<<1);//DMA0En

}

voidUart0_Init(void)

{

rGPHCON&=~(0xf<<4)|(0xa<<4);//GPH2,GPH3用作TXD0,RXD0

rGPHUP=0x0c;//GPH2,GPH3内部上拉

rULCON0=0x03;//数据格式:数据位为8位

//rUCON0=0x245;//允许查询或中断方式,不使用DMA通道,并设置接收超时

rUFCON0=0x00;//不使用FIFO

rUMCON0=0x00;//不使用流控

rUBRDIV0=UART_BRD;//设置波特率为115200kb/s

}

voidMain(void)

{

volatileunsignedchar*p=SEND_ADDR;

inti;

SEND_DATA=0x41;

for(i=0;i<128;i++)

*p++=0x41+i;

MMU_Init();

Uart0_Init();

DMA_Init();

while(1);

}



本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

从我们的直观感受来说,DMA并不是一个复杂的东西,要做的事情也很单纯直白。因此Linux kernel对它的抽象和实现,也应该简洁、易懂才是。不过现实却不甚乐观(个人感觉),Linux kernel dmaengine...

关键字: Linux dma

  吉利dma项目进展   为进一步扩大市场份额和开拓大客户市场,吉利汽车拟在梅山岛新建整车生产工业园,本项目总用地面积约1888亩,项目位于宁波市北仑区东南海滨的梅山岛。地块北侧为七星

关键字: dma 吉利

  吉利品牌包含BMA乘用车在内的三大项目此前已宣布落户成都,预计整车总产能将达60万台。近日网通社从成都市发改委获悉,吉利正推进成都BMA/PMA、宁波梅山DMA基地建设项目,未来将投产多款吉

关键字: dma 吉利

什么是8位微控制器STM8L050?它有什么作用?2019年1月16日 - 意法半导体推出了全新的8位微控制器STM8L050的推出,以提升低成本、低功耗8位微控制器(MCU)的功能集成度。作为超高能效的STM8L系列的...

关键字: dma MCU stm8l050

这是一篇指导驱动工程师如何使用DMA API的文档。

关键字: CPU dma

本文从计算机组成原理的层面详细介绍了DMA,以及Linux网络子系统的DMA机制是如何实现的。

关键字: dma Linux 编程

你知道嵌入式驱动程序关于设计层面的技术吗?无论学习什么都有需要掌握的要点与窍门,本文我们一起深入了解关于嵌入式驱动程序关于设计层面的窍门。每一个嵌入式应用软件都会在某些时候访问最底层的固件和进行一些硬件控制。 驱动的设计...

关键字: dma 嵌入式设计 usart驱动程序

今天,我将带您了解Linux内存管理。 对于精通CURD的学生,内存管理似乎离我们还很远,但是尽管这一知识点并不热门(据估计,很多人在学习后不会再使用它),但这无疑是基础。 虽然学完后没有看到即时的效果,但是它将对您将来...

关键字: dma Linux zone
关闭
关闭