新聞中心

        ARM入門筆記(7)

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

        一.背景

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

        AT91SAM7S64串口外圍DAM控制器的工作過程:將要發(fā)送的數(shù)據(jù)緩沖區(qū)的起始地址賦給串口DMA控制器的發(fā)送指針寄存器,再將要發(fā)送的字節(jié)個(gè)數(shù)賦給PDC的發(fā)送計(jì)數(shù)寄存器,然后無須 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控制器的工作過程,可用串口調(diào)試軟件進(jìn)行驗(yàn)證。

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

        1>連接器選項(xiàng)設(shè)置和啟動(dòng)代碼都與上個(gè)實(shí)驗(yàn)相同
        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; //使能主振蕩器和設(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位長度,無校驗(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í)行,來觀察現(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; //開始PDC接收
        while (1);
        }

        四.總結(jié)

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


        關(guān)鍵詞: ARM入門筆記串口DMA控

        評論


        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 册亨县| 论坛| 宁夏| 石嘴山市| 金川县| 鹤山市| 宜兰县| 大荔县| 二连浩特市| 大石桥市| 礼泉县| 河曲县| 稷山县| 大庆市| 临沂市| 保康县| 金溪县| 扬中市| 松阳县| 平阳县| 济宁市| 睢宁县| 皮山县| 万源市| 盘锦市| 延安市| 开封市| 海晏县| 鹿邑县| 石阡县| 敖汉旗| 沙洋县| 偏关县| 黄山市| 贺兰县| 平谷区| 朔州市| 泸溪县| 茂名市| 萨嘎县| 西乡县|