<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 如何用C語(yǔ)言對DMA控制器編程?

如何用C語(yǔ)言對DMA控制器編程?

作者: 時(shí)間:2018-09-13 來(lái)源:網(wǎng)絡(luò ) 收藏

摘要:詳細地分析了PC/AT機系統的DMA(直接存儲器存取)結構及其傳輸方式,并給出了編程實(shí)例。

本文引用地址:http://dyxdggzs.com/article/201809/389062.htm

DMA是英文DiretMemorAccess的縮寫(xiě),即直接存儲器存取,DMA傳輸是PC機與外設

高速數據交換的重要方法,其一個(gè)典型應用是應用于聲卡的錄放音過(guò)程中,錄音時(shí),CPU首先設置好聲卡和DMA的傳輸參數。當啟動(dòng)DMA數據傳輸(即開(kāi)始錄音)后,即由DMADMAC)按管PC總線(xiàn)進(jìn)行數據傳輸,每次傳輸結束后,DMA便歸還總線(xiàn)控制權,并申請CPU中斷,告之數據傳輸完畢,然后由中斷服務(wù)程序將DMA數據緩沖區中數據取走并準備下次數據傳輸(即錄音),由于在傳輸過(guò)程中無(wú)需CPU干沙,因此在錄音期間CPU可以執行其它程序,這樣既極大地提高了數據傳輸速度又提高了CPU的執行效率,正是由于DMA的這些優(yōu)點(diǎn),所以目前在工業(yè)控制領(lǐng)域的數據采集過(guò)程中都大量地采用了DMA數據傳輸方法。但是,由于DMA編程的資料較少,因此DMA編程一直是硬件編程方面的一個(gè)難點(diǎn),本文將以為例詳細介紹DMA編程方法。

1、PC/AT的DMA系統特點(diǎn)

PC/AT使用兩片8237A-5芯片組成級連結構,每片8237A-5芯片內部有4個(gè)獨立的通道,分別以通道O-通道7表示。但由于通道4被用作第0片和第1片的級連,因此PC/AT系統-一共能提供7個(gè)通道的DMA數據傳輸,在這7個(gè)通道中,除通道2作為軟盤(pán)DMA傳輸服務(wù),通道0留給SDIC通信透配器外,其余通道0,1,3,5.6和7均留作擴充使用,在這7個(gè)DMA通道中,通道0~3按8位數據最大傳輸64KB設計;面通道5-7按16位數據最大傳輸64K字(128KB)設計,它們都支持尋址16MB空間的能力。

2、DMA通道地址產(chǎn)生方式

8237A-5只能管理16位地址(AI5-A0),但為了尋址PC/AT機的24位地址空間尋址,在DMA系統中將PCAT機的16M空間分為多個(gè)物理頁(yè)面,從面保證了在DMA周期內只需16位地址尋址,因此DMA系統中為每個(gè)通道設置了一個(gè)DMA頁(yè)面寄存器,用以存放此物理頁(yè)面號。

對于8位傳輸通道0~3,由于芯片的地址使用字節邊界,即A15-A0為16位長(cháng)的字節地址,因此每頁(yè)64KB,而對于16位傳輸通道5-7,由于芯片的地址使用字邊界,即A16-AI(A0固定為0)為16位長(cháng)的字地址,因此每頁(yè)可達128KB,計算地址偏移和計數個(gè)數時(shí)尤其應該性意兩者區別,對于DOS管理下的1M常規內存,頁(yè)面分布圖1所示:

從DMA通道地址產(chǎn)生方式,我們可以看出DMA控制器僅能在-個(gè)物理頁(yè)面內傳輸數據,因此當數據跨頁(yè)面存放時(shí),我們必須分多次對其進(jìn)行數據傳輸,從面保證每次傳輸時(shí)數據都在同一頁(yè)面內。


3、DMAI/O地址

DMA控制器(DMAC)共有16個(gè)端口地址和4個(gè)頁(yè)面寄存器地址,共分為兩大類(lèi):控制DMA狀態(tài)及設置數據地址。

在設置DMA傳輸數據時(shí),要用到3個(gè)端口,分別是:頁(yè)面寄存器,地址(偏移)寄存器和數據計數器,表1給出了每個(gè)通道及其相應1/O口地址。


在控制DMAC的狀態(tài)時(shí),要用到另外3個(gè)端口,分別是:方式寄存器,屏蔽寄存器和清除寄存器。

(1)方式寄存器(地址為0Bh或D6h,分別為8位通道和16位通道地址)

此方式寄存器用于設置DMA的數據傳輸方式,其控制字格式如圖2所示。


例如:我們經(jīng)常用到的兩個(gè)方式字為(假定選DMA通道1):

45h:DMA寫(xiě)(即內存一1/0卡)

49h:DMA讀(即1/0卡一內存)

(2)屏戴寄存器(地址為0Ah或D4h,分e為8位通道和16位通道地址)

此屏蔽寄存器用于使某個(gè)DMA通道屏蔽或開(kāi)放DMA請求,其控制字格式如圖3所示。


(3)清除寄存器(地址為0Qh或D8h,分別為8位通道和16位通道地址)

當輸出0到此端口時(shí),將停止由屏蔽寄存器(地址為0Ah或D4h)所選定的DMA通道所有正在進(jìn)行的過(guò)程。DMA編程

4、DMA編程

通常,對某個(gè)DMA通道編程的步驟如下:

(1)保存原有中斷向量,設置新中斷向量,編寫(xiě)中斷服務(wù)程序,其主要內容為下一次DMA傳輸編程,輸出EO(中斷結束)至中斷控制器;或者是直接轉出(當不需再次DMA傳輸時(shí));

(2)DMAC初始化,包括設置方式控制字,屏數控制字及本次傳輸數據的頁(yè)面號,,頁(yè)面地址偏移及傳輸數據個(gè)數,必須特別注意的是DMAC的數據計數器比要傳輸的實(shí)際個(gè)數要少1;

(3)開(kāi)放該通道允許DMA中斷請求;

計數等,為考慮通用性,使用了目前普遍使用

(4)在程序結束時(shí)恢復中斷向量。

筆者已編制了一個(gè)對DMA進(jìn)行編控制的的TurboC2.0編程,程序也可以不加修改地使程序,此程序包括幾個(gè)有關(guān)DMAC編程的通用用于BorlandC++系統中,程序中假設I/0卡函數,如DMAC控制塊參數的獲得,中斷向量產(chǎn)生的硬件中斷號是DREQ5,使用DMA通道及恢復設置,DMAC初始化,暫停DMA傳輸通道號1,讀者在應用過(guò)程中應根據實(shí)際I/O卡提繼續DMA傳輸,終止DMA傳輸,讀取已傳輸供的硬件中斷號及DMA通道號作相應修改。



關(guān)鍵詞: dma C語(yǔ)言 控制器

評論


相關(guān)推薦

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

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>