ARM入門筆記(7)
一.背景
DMA是Direct Memory Access的縮寫,即“存儲器直接訪問”。它是指一種高速的數(shù)據(jù)傳輸操作,允許在外部設備和存儲器之間直接讀寫數(shù)據(jù),即不通過CPU,也不需要CPU干預。整個數(shù)據(jù)傳輸操作在一個稱為“DMA控制器”的控制下進行的。CPU除了在數(shù)據(jù)傳輸開始和結束時作一點處理外,在傳輸過程中CPU可以進行其它的工作。這樣,在大部分時間里,CPU和輸入輸出都處在并行操作。因此,使整個計算機系統(tǒng)的效率大大提高。
AT91SAM7S64串口外圍DAM控制器的工作過程:將要發(fā)送的數(shù)據(jù)緩沖區(qū)的起始地址賦給串口DMA控制器的發(fā)送指針寄存器,再將要發(fā)送的字節(jié)個數(shù)賦給PDC的發(fā)送計數(shù)寄存器,然后無須 CPU的干預,DMA自動起動串口發(fā)送操作,發(fā)送完這些數(shù)據(jù)后又自動停止;同理,只要將接收數(shù)據(jù)緩沖區(qū)的起始地址賦給串口DMA控制器的接收指針寄存器,再將要接收的字節(jié)個數(shù)賦給PCD的接收計數(shù)值,DMA將自動啟動串口接收數(shù)據(jù),接收完這些數(shù)據(jù)后,再通知CPU。
二.實驗目的
驗證上述所描述的串口DMA控制器的工作過程,可用串口調試軟件進行驗證。
三.實驗程序和參數(shù)設置
1>連接器選項設置和啟動代碼都與上個實驗相同
2>C語言的代碼
#i nclude "AT91SAM7S64.h"
#i nclude "Board.h"
unsigned char RxBuff[256],TxBuff[256];
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;//使能系統(tǒng)時鐘寄存器的處理器時鐘
*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;//復位接收器和發(fā)送器,使能接收與發(fā)送,復位狀態(tài)位
*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; //使能發(fā)送與接收
*AT91C_US0_PTCR = AT91C_PDC_TXTEN | AT91C_PDC_RXTEN;//使能US0的PDC 發(fā)送與接收
for (i = 0; i //給發(fā)送緩沖區(qū)覆值
TxBuff = i;
} //下面可用單步執(zhí)行,來觀察現(xiàn)象
*AT91C_US0_TPR = (unsigned int)TxBuff;//覆發(fā)送緩沖區(qū)起始地址
*AT91C_US0_TCR = 256; //起動PDC發(fā)送256個字節(jié)
*AT91C_US0_RPR = (unsigned int)RxBuff;//覆接收緩沖區(qū)起始地址
*AT91C_US0_RCR = 256; //開始PDC接收
while (1);
}
四.總結
我們在用51等單片機的串口進行收發(fā)數(shù)據(jù)時,因為發(fā)送與接收共用一個Buffer,所以在發(fā)送一字節(jié)數(shù)據(jù)后,通常都要加“while(!TI);”語句,來等待數(shù)據(jù)發(fā)送完畢;在接收數(shù)據(jù)時都要使用中斷來處理,每當接收到一個字節(jié)數(shù)據(jù)后都要中斷一次CPU。有了DMA這個功能,就不用這樣浪費CPU的時間,可大大的提高CPU的實時性能。
評論