串口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[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;//使能系統時鐘寄存器的處理器時鐘 *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的實時性能。 |