ARM入门笔记(7)

2010年08月26日 17:28    发布者:绝对好文
串口DMA控制实验

一.背景

DMA是Direct Memory Access的缩写,即“存储器直接访问”。它是指一种高速的数据传输操作,允许在外部设备和存储器之间直接读写数据,即不通过CPU,也不需要CPU干预。整个数据传输操作在一个称为“DMA控制器”的控制下进行的。CPU除了在数据传输开始和结束时作一点处理外,在传输过程中CPU可以进行其它的工作。这样,在大部分时间里,CPU和输入输出都处在并行操作。因此,使整个计算机系统的效率大大提高。

AT91SAM7S64串口外围DAM控制器的工作过程:将要发送的数据缓冲区的起始地址赋给串口DMA控制器的发送指针寄存器,再将要发送的字节个数赋给PDC的发送计数寄存器,然后无须 CPU的干预,DMA自动起动串口发送操作,发送完这些数据后又自动停止;同理,只要将接收数据缓冲区的起始地址赋给串口DMA控制器的接收指针寄存器,再将要接收的字节个数赋给PCD的接收计数值,DMA将自动启动串口接收数据,接收完这些数据后,再通知CPU。

二.实验目的

验证上述所描述的串口DMA控制器的工作过程,可用串口调试软件进行验证。

三.实验程序和参数设置

1>连接器选项设置和启动代码都与上个实验相同
2>C语言的代码

#i nclude "AT91SAM7S64.h"
#i nclude "Board.h"
unsigned char RxBuff,TxBuff;
int main(void)
{
unsigned int i;
*AT91C_CKGR_MOR = 0x701; //使能主振荡器和设置起振时间
*AT91C_PMC_MCKR = 0x01;//选择Mster Clock is main clock, divided by 0  
*AT91C_PMC_SCER = AT91C_CKGR_MOSCEN;//使能系统时钟寄存器的处理器时钟
*AT91C_PMC_PCER = AT91C_ID_US0; //使能USART0时钟
*AT91C_PIOA_PDR = US_RXD_PIN | US_TXD_PIN;//禁止该两个管脚的I/O口功能
*AT91C_PIOA_ASR= US_RXD_PIN | US_TXD_PIN;//将该两个I/O口分配给外围A  
*AT91C_US0_CR = 0x1ac;  //复位接收器和发送器,使能接收与发送,复位状态位
*AT91C_US1_MR =0x8c0;  //正常模式,时钟为MCK,8位长度,无校验,1位停止位,
*AT91C_US0_IDR  = 0xf3fff; //禁止所有UART相关的中断
*AT91C_US0_BRGR = 30;  //设置波特率为38400Hz,AT91C_US0_BRGR为CD值
*AT91C_US0_CR   = 0x50; //使能发送与接收
*AT91C_US0_PTCR = AT91C_PDC_TXTEN | AT91C_PDC_RXTEN;//使能US0的PDC 发送与接收
for (i = 0; i    //给发送缓冲区覆值
TxBuff = i;   
} //下面可用单步执行,来观察现象
*AT91C_US0_TPR = (unsigned int)TxBuff;//覆发送缓冲区起始地址
*AT91C_US0_TCR = 256;    //起动PDC发送256个字节
*AT91C_US0_RPR = (unsigned int)RxBuff;//覆接收缓冲区起始地址
*AT91C_US0_RCR = 256;    //开始PDC接收
while (1);
}

四.总结

我们在用51等单片机的串口进行收发数据时,因为发送与接收共用一个Buffer,所以在发送一字节数据后,通常都要加“while(!TI);”语句,来等待数据发送完毕;在接收数据时都要使用中断来处理,每当接收到一个字节数据后都要中断一次CPU。有了DMA这个功能,就不用这样浪费CPU的时间,可大大的提高CPU的实时性能。

网友评论

长话短说 2010年09月04日
谢了