新聞中心

ARM入門(mén)筆記(7)

作者: 時(shí)間:2016-12-02 來(lái)源:網(wǎng)絡(luò) 收藏
串口DMA控制實(shí)驗(yàn)

一.背景

DMA是Direct Memory Access的縮寫(xiě),即“存儲(chǔ)器直接訪(fǎng)問(wèn)”。它是指一種高速的數(shù)據(jù)傳輸操作,允許在外部設(shè)備和存儲(chǔ)器之間直接讀寫(xiě)數(shù)據(jù),即不通過(guò)CPU,也不需要CPU干預(yù)。整個(gè)數(shù)據(jù)傳輸操作在一個(gè)稱(chēng)為“DMA控制器”的控制下進(jìn)行的。CPU除了在數(shù)據(jù)傳輸開(kāi)始和結(jié)束時(shí)作一點(diǎn)處理外,在傳輸過(guò)程中CPU可以進(jìn)行其它的工作。這樣,在大部分時(shí)間里,CPU和輸入輸出都處在并行操作。因此,使整個(gè)計(jì)算機(jī)系統(tǒng)的效率大大提高。

AT91SAM7S64串口外圍DAM控制器的工作過(guò)程:將要發(fā)送的數(shù)據(jù)緩沖區(qū)的起始地址賦給串口DMA控制器的發(fā)送指針寄存器,再將要發(fā)送的字節(jié)個(gè)數(shù)賦給PDC的發(fā)送計(jì)數(shù)寄存器,然后無(wú)須 CPU的干預(yù),DMA自動(dòng)起動(dòng)串口發(fā)送操作,發(fā)送完這些數(shù)據(jù)后又自動(dòng)停止;同理,只要將接收數(shù)據(jù)緩沖區(qū)的起始地址賦給串口DMA控制器的接收指針寄存器,再將要接收的字節(jié)個(gè)數(shù)賦給PCD的接收計(jì)數(shù)值,DMA將自動(dòng)啟動(dòng)串口接收數(shù)據(jù),接收完這些數(shù)據(jù)后,再通知CPU。

二.實(shí)驗(yàn)?zāi)康?br />
驗(yàn)證上述所描述的串口DMA控制器的工作過(guò)程,可用串口調(diào)試軟件進(jìn)行驗(yàn)證。

三.實(shí)驗(yàn)程序和參數(shù)設(shè)置

1>連接器選項(xiàng)設(shè)置和啟動(dòng)代碼都與上個(gè)實(shí)驗(yàn)相同
2>C語(yǔ)言的代碼

#i nclude "AT91SAM7S64.h"
#i nclude "Board.h"
unsigned char RxBuff[256],TxBuff[256];
int main(void)
{
unsigned int i;
*AT91C_CKGR_MOR = 0x701; //使能主振蕩器和設(shè)置起振時(shí)間
*AT91C_PMC_MCKR = 0x01;//選擇Mster Clock is main clock, divided by 0
*AT91C_PMC_SCER = AT91C_CKGR_MOSCEN;//使能系統(tǒng)時(shí)鐘寄存器的處理器時(shí)鐘
*AT91C_PMC_PCER = AT91C_ID_US0; //使能USART0時(shí)鐘
*AT91C_PIOA_PDR = US_RXD_PIN | US_TXD_PIN;//禁止該兩個(gè)管腳的I/O口功能
*AT91C_PIOA_ASR= US_RXD_PIN | US_TXD_PIN;//將該兩個(gè)I/O口分配給外圍A
*AT91C_US0_CR = 0x1ac;//復(fù)位接收器和發(fā)送器,使能接收與發(fā)送,復(fù)位狀態(tài)位
*AT91C_US1_MR =0x8c0;//正常模式,時(shí)鐘為MCK,8位長(zhǎng)度,無(wú)校驗(yàn),1位停止位,
*AT91C_US0_IDR= 0xf3fff; //禁止所有UART相關(guān)的中斷
*AT91C_US0_BRGR = 30;//設(shè)置波特率為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í)行,來(lái)觀(guān)察現(xiàn)象
*AT91C_US0_TPR = (unsigned int)TxBuff;//覆發(fā)送緩沖區(qū)起始地址
*AT91C_US0_TCR = 256; //起動(dòng)PDC發(fā)送256個(gè)字節(jié)
*AT91C_US0_RPR = (unsigned int)RxBuff;//覆接收緩沖區(qū)起始地址
*AT91C_US0_RCR = 256; //開(kāi)始PDC接收
while (1);
}

四.總結(jié)

我們?cè)谟?1等單片機(jī)的串口進(jìn)行收發(fā)數(shù)據(jù)時(shí),因?yàn)榘l(fā)送與接收共用一個(gè)Buffer,所以在發(fā)送一字節(jié)數(shù)據(jù)后,通常都要加“while(!TI);”語(yǔ)句,來(lái)等待數(shù)據(jù)發(fā)送完畢;在接收數(shù)據(jù)時(shí)都要使用中斷來(lái)處理,每當(dāng)接收到一個(gè)字節(jié)數(shù)據(jù)后都要中斷一次CPU。有了DMA這個(gè)功能,就不用這樣浪費(fèi)CPU的時(shí)間,可大大的提高CPU的實(shí)時(shí)性能。


評(píng)論


技術(shù)專(zhuān)區(qū)

關(guān)閉