1. DMA方式的傳送方式
DMA傳送方式有3種:單元傳送方式、塊傳送方式和on-the-fly傳送方式。與外部DMA請求/應答協議不同的是,DMA傳送方式定義了每次傳送讀/寫的單元數,如表所示。
(1)單元傳送方式(單位元組傳送方式)
單元傳送方式意味著每個DMA請求對應一對DMA讀/寫周期,即1個單元讀,然後1個單元寫。
(2)塊傳送方式(連續傳送方式)
塊傳送方式意味著在連續4個字的DMA寫周期前有連續的4個字的DMA讀周期,即4個字突發讀,然後4個字突發寫,因此傳輸的數據個數應該是16位元組的倍數。
如果傳送大小或者DMA計數值不是16的倍數,則DMA將不能完整地傳送完數據。假設要傳送的數據為50個位元組,則3*16=48位元組,會導致2個位元組不能被傳送,DMA在傳送48個位元組後停止。所以,選擇DMA塊傳送方式時,一定要注意這一點。
(3)on-the-fly傳送方式(請求傳送方式)
在on-the-fly傳送方式下DMA讀/寫可以同時進行。DMA應答信號通知外部設備去讀或者寫。同時,存儲控制器將產生與讀/寫相關的控制信號給外部存儲器。如果外部設備能夠支持on-the-fly傳送方式,將會使得外設的數據傳輸速率大大地增加。
停止CPU訪問內存
當外圍設備要求傳送一批數據時,由DMA控制器發一個停止信號給CPU,要求CPU放棄對地址匯流排、數據匯流排和有關控制匯流排的使用權。DMA控制器獲得匯流排控制權以後,開始進行數據傳送。在一批數據傳送完畢後,DMA控制器通知CPU可以使用內存,並把匯流排控制權交還給CPU。在這種DMA傳送過程 中,CPU基本處於不工作狀態或者說保持狀態。
優點:控制簡單,它適用於數據傳輸率很高的設備進行成組傳送。
缺點:在DMA控制器訪內階段,內存的效能沒有充分發揮,相當一部分內存工作周期是空閑的。這是因為,外圍設備傳送兩個數據之間的間隔一般總是大於內存存儲周期,即使高速I/O設備也是如此。
周期挪用
當I/O設備沒有DMA請求時,CPU按程序要求訪問內存;一旦I/O設備有DMA請求,則由I/O設備挪用一個或幾個內存周期。
I/O設備要求DMA傳送時可能遇到兩種情況:
(1)此時CPU不需要訪內,如CPU正在執行乘法指令。由於乘法指令執行時間較長,此時I/O訪內與CPU訪內沒有沖突,即I/O設備挪用一二個內存周期對CPU執行程序沒有任何影響。
(2)I/O設備要求訪內時CPU也要求訪內,這就產生了訪內沖突,在這種情況下I/O設備訪內優先,因為I/O訪內有時間要求,前一個I/O數據必須在下一個訪內請求到來之前存取完畢。顯然,在這種情況下I/O設備挪用一二個內存周期,意味著CPU延緩了對指令的執行,或者更明確地說,在CPU執行訪內指令的過程中插入DMA請求,挪用了一二個內存周期。
與停止CPU訪內的DMA方法比較,周期挪用的方法既實現了I/O傳送,又較好地發揮了內存和CPU的效率,是一種廣泛採用的方法。但是I/O設備每一次周期挪用都有申請匯流排控制權、建立匯流排控制權和歸還匯流排控制權的過程,所以傳送一個字對內存來說要佔用一個周期,但對DMA控制器來說一般要2—5個 內存周期(視邏輯線路的延遲而定)。因此,周期挪用的方法適用於I/O設備讀寫周期大於內存存儲周期的情況。
DMA與CPU交替訪內
如果CPU的工作周期比內存存取周期長很多,此時採用交替訪內的方法可以使DMA傳送和CPU同時發揮最高的效率。假設CPU工作周期為 1.2μs,內存存取周期小於0.6μs,那麼一個CPU周期可分為C1和C2兩個分周期,其中C1供DMA控制器訪內,C2專供CPU訪內。
這種方式不需要匯流排使用權的申請、建立和歸還過程,匯流排使用權是通過C1和C2分時進行的。CPU和DMA控制器各自有自己的訪內地址寄存器、數據寄存 器和讀/寫信號等控制寄存器。在C1周期中,如果DMA控制器有訪內請求,可將地址、數據等信號送到匯流排上。在C2周期中,如CPU有訪內請求,同樣傳送 地址、數據等信號。事實上,對於匯流排,這是用C1,C2控制的一個多路轉換器,這種匯流排控制權的轉移幾乎不需要什麼時間,所以對DMA傳送來講效率是很高的。
這種傳送方式又稱為「透明的DMA」方式,其來由是這種DMA傳送對CPU來說,如同透明的玻璃一般,沒有任何感覺或影響。在透明的DMA方式下工作,CPU既不停止主程序的運行,也不進入等待狀態,是一種高效率的工作方式。當然,相應的硬體邏輯也就更加復雜。
2. dma方式為什麼能實現高速外設與主存間的信息交換dma的傳送方法有哪幾種
外設編程語言問題。直接內存存取(DMA) 技術。
DMA 傳輸重要地將一個內存區從一個裝置復制到另外一個。當 CPU初始化這個傳輸動作,傳輸動作本身是由 DMA 控制器 來實行和完成。典型的例子就是移動一個外部內存的區塊到晶元內部更快的內存去。像是這樣的操作並沒有讓處理器工作拖延,反而可以被重新排程去處理其他的工作。DMA 傳輸對於高效能 嵌入式系統 演算法和網路是很重要的。
在實現DMA傳輸時,是由DMA控制器直接掌管匯流排,因此,存在著一個匯流排控制權轉移問題。即DMA傳輸前,CPU要把匯流排控制權交給DMA控制器,而在結束DMA傳輸後,DMA控制器應立即把匯流排控制權再交回給CPU。 一個完整的DMA傳輸過程必須經過下面的4個步驟。
1.DMA請求
CPU對DMA控制器初始化,並向I/O介面發出操作命令,I/O介面提出DMA請求。
2.DMA響應
DMA控制器對DMA請求判別優先順序及屏蔽,向匯流排裁決邏輯提出匯流排請求。當CPU執行完當前匯流排周期即可釋放匯流排控制權。此時,匯流排裁決邏輯輸出匯流排應答,表示DMA已經響應,通過DMA控制器通知I/O介面開始DMA傳輸。
3.DMA傳輸
DMA控制器獲得匯流排控制權後,CPU即刻掛起或只執行內部操作,由DMA控制器輸出讀寫命令,直接控制RAM與I/O介面進行DMA傳輸。
在DMA控制器的控制下,在存儲器和外部設備之間直接進行數據傳送,在傳送過中不需要中央處理器的參與。開始時需提供要傳送的數據的起始位置和數據長度。
4.DMA結束
當完成規定的成批數據傳送後,DMA控制器即釋放匯流排控制權,並向I/O介面發出結束信號。當I/O介面收到結束信號後,一方面停 止I/O設備的工作,另一方面向CPU提出中斷請求,使CPU從不介入的狀態解脫,並執行一段檢查本次DMA傳輸操作正確性的代碼。最後,帶著本次操作結果及狀態繼續執行原來的程序。
由此可見,DMA傳輸方式無需CPU直接控制傳輸,也沒有中斷處理方式那樣保留現場和恢復現場的過程,通過硬體為RAM與I/O設備開辟一條直接傳送數據的通路,使CPU的效率大為提高。
3. 什麼是DMA傳輸
什麼是DMA?
當我們向計算機中加入了一塊新的音效卡或其它適配卡時,安裝程序可能會提醒我們應該選擇一個DMA通道。那DMA是什麼呢? DMA(Direct Memory Access),即直接存儲器存取,是一種快速傳送數據的機制。數據傳遞可以從適配卡到內存,從內存到適配卡或從一段內存到另一段內存。DMA技術的重要 性在於,利用它進行數據傳送時不需要CPU的參與。每台電腦主機板上都有DMA控制器,通常計算機對其編程,並用一個適配器上的ROM(如軟盤驅動控制器 上的ROM)來儲存程序,這些程序控制DMA傳送數據。一旦控制器初始化完成,數據開始傳送,DMA就可以脫離CPU,獨立完成數據傳送。
在DMA傳送開始的短暫時間內,基本上有兩個處理器為它工作,一個執行程序代碼,一個傳送數據。利用DMA傳送數據的另一個好處是,數據直接在源地址和目 的地址之間傳送,不需要中間媒介。如果通過CPU把一個位元組從適配卡傳送至內存,需要兩步操作。首先,CPU把這個位元組從適配卡讀到內部寄存器中,然後再 從寄存器傳送到內存的適當地址。DMA控制器將這些操作簡化為一步,它操作匯流排上的控制信號,使寫位元組一次完成。這樣大大提高了計算機運行速度和工作效 率。
計算機發展到今天,DMA已不再用於內存到內存的數據傳送,因為CPU速度非常快,做這件事,比用DMA控制還要快,但要在適配卡和內存之間傳送數據,仍 然是非DMA莫屬。要從適配卡到內存傳送數據,DMA同時觸發從適配卡讀數據匯流排(即I/O讀操作)和向內存寫數據的匯流排。激活I/O讀操作就是讓適配卡 把一個數據單位(通常是一個位元組或一個字)放到PC數據匯流排上,因為此時內存寫匯流排也被激活,數據就被同時從PC匯流排上拷貝到內存中。
對於每一次寫操作,DMA控制器都控制地址匯流排,通知應將數據寫到哪段內存中去。 DMA控制數據從內存傳送到適配卡的方法與上面類似。對每一個要傳送的單位數據,DMA控制器激活讀內存和I/O寫操作的匯流排。內存地址被放到地址匯流排 上,像從適配卡到內存傳送數據一樣,以數據匯流排為通道,數據從源地址直接傳送到目的地址。 DMA從DMA請求線(DREQ)上接收DMA請求,正像中斷控制器從中斷請求線(IRQ)上接收中斷請求一樣。
一個典型的從適配卡到內存的數據傳送是這樣進行的,首先,對DMA控制器編程,寫入數據要到達的內存地址和要傳送的位元組數。適配器可以開始傳送數據時,它 將激活DREQ線,與DMA控制器連通。DMA控制器在與CPU取得匯流排控制權後,輸出內存地址,發送控制信號,使得一個位元組或一個字從適配器讀出並寫入 相應內存中,然後更新內存地址,指向下一個位元組(或字)要寫入的地址,重復上面的操作,直至數據傳送完畢。對控制器進行不同編程,就可以實現單位元組傳送 (即每傳送一個位元組都要求一個DREQ信號)或塊數據傳送(即全部數據傳送只需要一個DREQ信號)。
如果你要往計算機中插一塊適配卡,而且適配卡使用DMA,通常安裝程序會讓你選擇一個DMA通道,設定DIP開關或跳線,來為相應適配器設置DMA通道。 盡管從理論上講,只要不是同時使用DREQ線,不同的適配卡可以共享這條線的,但是按常規,我們最好為每個適配卡單獨安排一個DMA通道,這樣就可以保證 不會發生DMA沖突。附表是DMA的預設分配情況。通道 功能通道 功能 O 空閑 4 用於級聯DMA控制器 1 空閑 5 空閑 2 軟盤 6 空閑 3 空閑 7 空閑從中可以看出,DMA通道2和4已被佔用,在大多數微機上,通道1、3、5、6和7可由你任意分配。我們平時最好對自己的計算機上DMA通道的分配情 況記錄下來,以免我們向計算機增加新硬體時出現兩個適配卡共用一個通道,導致沖突。 DMA---Direct Memory Access,直接內存訪問,是一種數據傳輸模式。DMA方式下由於不直接訪問計算機的CPU,而直接在RAM與設備之間傳輸,因而大大提高了數據傳輸速度。 呵呵,看過上面的DMA的含義及用途了,所以我們只需要打開DMA傳輸方式就可以了~~~操作方法: Windows 98/Me 啟用內存直接存取DMA 右擊Windows桌面上的「我的電腦」 圖標並從彈出菜單選擇「屬性」。系統屬性窗口出現。單擊「設備管理」標簽。雙擊「CDROM驅動器」,查看硬碟驅動器列表。右擊IDE DISK(可能會有其他名稱,例如 GENERIC IDE DISK)並從彈出菜單選擇 「屬性」。該硬碟屬性窗口出現。單擊「設置」標簽。選擇「DMA」如果該項未選,然後單擊「確認」。Windows問您是否要重新啟動,單擊是。 在Windows 2000啟用內存直接存取DMA 作為管理員(或具管理員特權的用戶)登錄進入Windos。右擊Windows 桌面上的「我的電腦」圖標並從彈出菜單選擇屬性。系統屬性窗口出現。單擊硬體標簽, 然後單擊設備管理器。設備管理員窗口出現。雙擊 IDE ATA/ATAPI 控制器來查看控制器列表。雙擊主IDE 通道。主IDE信道屬性窗口出現。單擊高級設置標簽。選擇DMA,如果該項可從設備0的傳輸模式列表中找到的話。單擊確認。Windows問您是否要重新 啟動, 單擊是。 在Windows XP啟用內存直接存取DMA 作為管理員(或具管理員特權的用戶)登錄進入Windows。單擊「開始」按鈕,,然後右擊「我的電腦」並從彈出菜單選擇屬性。系統屬性窗口出現。單擊 「硬體」 標簽,,然後單擊「設備管理員」。設備管理員窗口出現。雙擊「IDE ATA/ATAPI」控制器來查看控制器列表。雙擊「從IDE 通道」。從IDE通道屬性窗口出現。單擊「高級設置」標簽。選擇DMA,如果該項可從裝置0(或1,視您的刻錄機的跳線設置而定)的傳輸模式列表中找到的 話。單擊確認。您不必重新啟動 Windows。 ================================================
附錄:DMA精讀 /********************************************************************************\
* Copyright (C) 2000 Texas Instruments Incorporated.
* All Rights Reserved
*------------------------------------------------------------------------------
* FILENAME...... dma1.c
* DATE CREATED.. 01/11/2000
* LAST MODIFIED. 01/04/2001
\******************************************************************************/
#include <std.h>
#include <log.h> /* Include DSPBIOS/CSL GUI configuration header file */
#include "dma1cfg.h" #include <csl.h>
#include <csl_irq.h>
#include <csl_dma.h> /* Constant defines transfer length */
#define N 128 /* Place src and dst of DMA transfer in seperate memory section */
/* to better control placement in user specified memory range */
#pragma DATA_SECTION(src,"dmaMem")
Uint16 src[N]; #pragma DATA_SECTION(dst, "dmaMem")
Uint16 dst[N];
/* This example effects a single-frame transfer of 128 */
/* elements from DARAM to DARAM, via DMA */
/* The macro invocation reflect the settings required in */
/* DMA control registers to make this happen. */ /* DMACSDP dstben == 0 */
/* dstpack == 0 */
/* dst == 0 */
/* srcben == 0 */
/* srcpack == 0 */
/* src == 0 */
/* datatype == 1 */
/* */
/* DMACCR dstamode == 1 */
/* srcamode == 1 */
/* endprog == 0 */
/* fifoflush == 0 */
/* repeat == 0 */
/* autoinit == 0 */
/* en == 0 */
/* prio == 0 */
/* fs == 0 */
/* sync == 0 */
/* */
/* DMACICR blockie == 1 */
/* lastie == 1 */
/* frameie == 1 */
/* firsthalfie == 1 */
/* dropie == 1 */
/* timeoutie == 1 */ DMA_Config myconfig = {
DMA_DMACSDP_RMK(
DMA_DMACSDP_DSTBEN_NOBURST,
DMA_DMACSDP_DSTPACK_OFF,
DMA_DMACSDP_DST_DARAM,
DMA_DMACSDP_SRCBEN_NOBURST,
DMA_DMACSDP_SRCPACK_OFF,
DMA_DMACSDP_SRC_DARAM,
DMA_DMACSDP_DATATYPE_16BIT
), /* DMACSDP */
DMA_DMACCR_RMK(
DMA_DMACCR_DSTAMODE_POSTINC,
DMA_DMACCR_SRCAMODE_POSTINC,
DMA_DMACCR_ENDPROG_OFF,
DMA_DMACCR_FIFOFLUSH_OFF,
DMA_DMACCR_REPEAT_OFF,
DMA_DMACCR_AUTOINIT_OFF,
DMA_DMACCR_EN_STOP,
DMA_DMACCR_PRIO_HI,
DMA_DMACCR_FS_ENABLE,
DMA_DMACCR_SYNC_NONE
), /* DMACCR */
DMA_DMACICR_RMK(
DMA_DMACICR_BLOCKIE_OFF,
DMA_DMACICR_LASTIE_OFF,
DMA_DMACICR_FRAMEIE_ON,
DMA_DMACICR_FIRSTHALFIE_OFF,
DMA_DMACICR_DROPIE_OFF,
DMA_DMACICR_TIMEOUTIE_OFF
), /* DMACICR */
(DMA_AdrPtr) &src, /* DMACSSAL */
0, /* DMACSSAU */
(DMA_AdrPtr) &dst, /* DMACDSAL */
0, /* DMACDSAU */
N, /* DMACEN */
1, /* DMACFN */
0, /* DMACFI */
0 /* DMACEI */
}; /* Define a DMA_Handle object */
DMA_Handle myhDma;
int i, j;
Uint16 err = 0;
volatile Bool WaitForTransfer = TRUE; void main(void)
{
/* Initialize source and destination buffers */
for (i = 0; i <= (N - 1); i++) {
dst[i] = 0;
src[i] = i + 1;
}
} void taskFxn(void)
{
/* Open DMA Channel 0 */
myhDma = DMA_open(DMA_CHA0, 0); /* By default, the TMS320C55xx compiler assigns all data symbols word */
/* addresses. The DMA however, expects all addresses to be byte */
/* addresses. Therefore, we must shift the address by 2 in order to */
/* change the word address to a byte address for the DMA transfer. */
myconfig.dmacssal =
(DMA_AdrPtr)(((Uint16)(myconfig.dmacssal))<<1);
myconfig.dmacdsal =
(DMA_AdrPtr)(((Uint16)(myconfig.dmacdsal))<<1); /* Write configuration structure values to DMA control registers */
DMA_config(myhDma, &myconfig); /* Enable DMA channel for to begin transfer */
DMA_FSETH(myhDma,DMACCR,EN,1); /* Wait for FRAME status bit in DMA status register to signal */
/* transfer is complete. */
while (!DMA_FGETH(myhDma,DMACSR,FRAME)) {
;
} /* Check dta values to make sure transfer happened correctly */
for (i = 0; i <= (N - 1); i++) {
if (dst[i] != src[i]) {
++err;
}
} if (err) {
LOG_printf(&trace, ">>> Warning, DMA Example 1 Failed");
}
else {
LOG_printf(&trace, "...DMA Example 1 Complete");
} /* We are through with DMA, so close it */
DMA_close(myhDma);
} DMA Functions Function Purpose
DMA_close() Closes the DMA and its corresponding handler
DMA_config() Sets up DMA using configuration structure (DMA_Config)
DMA_configArgs() Sets up DMA using register values passed to the function
DMA_getConfig() Reads the DMA configuration
DMA_getEventId() Returns the IRQ Event ID for the DMA completion interrupt
DMA_open() Opens the DMA and assigns a handler to it
DMA_pause() Interrupts the transfer in the corresponding DMA channel
DMA_reset() Resets the DMA registers with default values
DMA_start() Enables transfers in the corresponding DMA channel
DMA_stop() Disables the transfer in the corresponding DMA channel
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1568514 本文來自CSDN博客,轉載請標明出處: http://blog.csdn.net/zhongrg/archive/2007/11/18/1891323.aspx
4. 在DMA方式下,外設數據輸入到內存的路徑是什麼
DMA 模式就是「Direct Memory Access」直接內存訪問的縮寫。就是允許設備從 CPU 手中接管系統匯流排,並直接把數據傳送到主內存。通常 CPU 分兩步來傳送數據:1,從設備的I/O存儲空間讀數據,把數據放在CPU內部;2,CPU把數據從其內部送到主內存,DMA 方式通常用一步就可把數據從設備直接送到主內存。但並不是所有的設備都可以使用DMA的,設備硬體必須內置有這種能力,才能支持。從DMA傳輸佔用系統匯流排開始的傳輸過程中CPU就不做什麼了。這樣採用DMA模式的設備佔用系統匯流排資源就非常小,從而提高計算機子系統的性能。
5. 緊急!!!!請問有那位大蝦,能告訴俺,DMA是什麼
DMA=Direct Memory Access 即直接存儲器存取,是一種快速傳送數據的機制。數據傳遞可以從適配卡到內存,從內存到適配卡或從一段內存到另一段內存。
利用它進行數據傳送時不需要CPU的參與。每台電腦主機板上都有DMA控制器,通常計算機對其編程,並用一個適配器上的ROM(如軟盤驅動控制器上的ROM)來儲存程序,這些程序控制DMA傳送數據。一旦控制器初始化完成,數據開始傳送,DMA就可以脫離CPU,獨立完成數據傳送。
在DMA傳送開始的短暫時間內,基本上有兩個處理器為它工作,一個執行程序代碼,一個傳送數據。利用DMA傳送數據的另一個好處是,數據直接在源地址和目的地址之間傳送,不需要中間媒介。如果通過CPU把一個位元組從適配卡傳送至內存,需要兩步操作。首先,CPU把這個位元組從適配卡讀到內部寄存器中,然後再從寄存器傳送到內存的適當地址。DMA控制器將這些操作簡化為一步,它操作匯流排上的控制信號,使寫位元組一次完成。這樣大大提高了計算機運行速度和工作效率。
計算機發展到今天,DMA已不再用於內存到內存的數據傳送,因為CPU速度非常快,做這件事,比用DMA控制還要快,但要在適配卡和內存之間傳送數據,仍然是非DMA莫屬。要從適配卡到內存傳送數據,DMA同時觸發從適配卡讀數據匯流排(即I/O讀操作)和向內存寫數據的匯流排。激活I/O讀操作就是讓適配卡把一個數據單位(通常是一個位元組或一個字)放到PC數據匯流排上,因為此時內存寫匯流排也被激活,數據就被同時從PC匯流排上拷貝到內存中。
直接內存訪問(DMA)方式是一種完全由硬體執行I/O交換的工作方式。DMA控制器從CPU完全接管對匯流排的控制。數據交換不經過CPU,而直接在內存和I/O設備之間進行。DMA控制器採用以下三種方式:
①停止CPU訪問內存:當外設要求傳送一批數據時,由DMA控制器發一個信號給CPU。DMA控制器獲得匯流排控制權後,開始進行數據傳送。一批數據傳送完畢後,DMA控制器通知CPU可以使用內存,並把匯流排控制權交還給CPU。
②周期挪用:當I/O設備沒有 DMA請求時,CPU按程序要求訪問內存:一旦 I/O設備有DMA請求,則I/O設備挪用一個或幾個周期。
③DMA與CPU交替訪內:一個CPU周期可分為2個周期,一個專供DMA控制器訪內,另一個專供CPU訪內。不需要匯流排使用權的申請、建立和歸還過程。
6. STM32的usart的DMA方式發送 一個數 ,程序怎麼寫
我是用的原子的寄存器版的,
串口部分初始化部分加入這個
USART1->CR3=1<<7; //使能串口1的DMA發送
這是初始化
MYDMA_Config(DMA1_Channel4,(u32)&USART1->DR,(u32)TData,32);//DMA1通道4,外設為串口1,存儲器為SendBuff,長度32.
下面是DMA.C文件里的配置
u16 DMA1_MEM_LEN;//保存DMA每次數據傳送的長度
//DMA1的各通道配置
//這里的傳輸形式是固定的,這點要根據不同的情況來修改
//從存儲器->外設模式/8位數據寬度/存儲器增量模式
//DMA_CHx:DMA通道CHx
//cpar:外設地址
//cmar:存儲器地址
//cndtr:數據傳輸量
void MYDMA_Config(DMA_Channel_TypeDef*DMA_CHx,u32 cpar,u32 cmar,u16 cndtr)
{
u32 DR_Base; //做緩沖用,不知道為什麼.非要不可
RCC->AHBENR|=1<<0;//開啟DMA1時鍾
DR_Base=cpar;
DMA_CHx->CPAR=DR_Base; //DMA1 外設地址
DMA_CHx->CMAR=(u32)cmar; //DMA1,存儲器地址
DMA1_MEM_LEN=cndtr; //保存DMA傳輸數據量
DMA_CHx->CNDTR=cndtr; //DMA1,傳輸數據量
DMA_CHx->CCR=0X00000000;//復位
DMA_CHx->CCR|=1<<1; //TCIE:允許傳輸完成中斷
DMA_CHx->CCR|=1<<4; //從存儲器讀
DMA_CHx->CCR|=0<<5; //普通模式
DMA_CHx->CCR|=0<<6; //外設地址非增量模式
DMA_CHx->CCR|=1<<7; //存儲器增量模式
DMA_CHx->CCR|=0<<8; //外設數據寬度為8位
DMA_CHx->CCR|=0<<10; //存儲器數據寬度8位
DMA_CHx->CCR|=1<<12; //中等優先順序
DMA_CHx->CCR|=0<<14; //非存儲器到存儲器模式
MY_NVIC_Init(2,1,DMA1_Channel4_IRQChannel,3); //搶占優先順序3,響應優先順序0,組3
}
//開啟一次DMA傳輸
void MYDMA_Enable(DMA_Channel_TypeDef*DMA_CHx)
{
DMA_CHx->CCR&=~(1<<0); //關閉DMA傳輸
DMA_CHx->CNDTR=DMA1_MEM_LEN; //DMA1,傳輸數據量
DMA_CHx->CCR|=1<<0; //開啟DMA傳輸
}
void DMAChannel4_IRQHandler(void)
{
if (DMA1->ISR & (1<<13)) {
DMA1->IFCR|=1<<13;//清除通道4傳輸完成標志
}
}
然後每次使用調用一次這個
MYDMA_Enable(DMA1_Channel4);//開始一次DMA傳輸
就可以了
7. stm32f103 dma是怎麼實現的
DMA,全稱為:Direct Memory Access,即直接存儲器訪問。DMA傳輸方式無需CPU 直接控制傳輸,也沒有中斷處理方式那樣保留現場和恢復現場的過程,通過硬體為RAM 與I/O設備開辟一條直接傳送數據的通路,能使CPU 的效率大為提高。
STM32中 DMA1有7個通道,DMA2有5個通道(DMA2 僅存在大容量產品中)。DMA掛載的時鍾為AHB匯流排,其時鍾為72Mhz,所以可以實現高速數據搬運。
STM32F103RBT6 只有1 個DMA控制器,DMA1 ,下面我們就針對DMA1 進行介紹。
從外設(TIMx、ADC、SPIx 、I2Cx 和USARTx )產生的DMA請求,通過邏輯或輸入到DMA控制器,這就意味著同時只能有一個請求有效。外設的DMA請求,可以通過設置相應的外設寄存器中的控制位,被獨立地開啟或關閉。
DMA1各通道一覽:
這里我們要使用的是串口 1 的 DMA 傳送,也就是要用到通道 4。
DMA1通道4的配置方法如下:
dma.c主要代碼:
[cpp] view plain
u16 DMA1_MEM_LEN;//保存DMA每次數據傳送的長度
//DMA1的各通道配置
//這里的傳輸形式是固定的,這點要根據不同的情況來修改
//從存儲器->外設模式/8位數據寬度/存儲器增量模式
//DMA_CHx:DMA通道CHx
//cpar:外設地址
//cmar:存儲器地址
//cndtr:數據傳輸量
void MYDMA_Config(DMA_Channel_TypeDef*DMA_CHx,u32 cpar,u32 cmar,u16 cndtr)
{
RCC->AHBENR|=1<<0; //開啟DMA1時鍾
delay_ms(1); //等待DMA時鍾穩定
DMA_CHx->CPAR=cpar; //DMA1 外設地址
DMA_CHx->CMAR=(u32)cmar;//DMA1,存儲器地址
DMA1_MEM_LEN=cndtr; //保存DMA傳輸數據量
DMA_CHx->CNDTR=cndtr; //DMA1,傳輸數據量
DMA_CHx->CCR=0X00000000;//復位
DMA_CHx->CCR|=1<<4; //從存儲器讀
DMA_CHx->CCR|=0<<5; //普通模式
DMA_CHx->CCR|=0<<6; //外設地址非增量模式
DMA_CHx->CCR|=1<<7; //存儲器增量模式
DMA_CHx->CCR|=0<<8; //外設數據寬度為8位
DMA_CHx->CCR|=0<<10; //存儲器數據寬度8位
DMA_CHx->CCR|=1<<12; //中等優先順序
DMA_CHx->CCR|=0<<14; //非存儲器到存儲器模式
}
//開啟一次DMA傳輸
void MYDMA_Enable(DMA_Channel_TypeDef*DMA_CHx)
{
DMA_CHx->CCR&=~(1<<0); //關閉DMA傳輸
DMA_CHx->CNDTR=DMA1_MEM_LEN; //DMA1,傳輸數據量
DMA_CHx->CCR|=1<<0; //開啟DMA傳輸
}
}
在主函數里主要有這幾個語句完成DMA傳輸:
1.首先配置DMA1通道4相關參數
MYDMA_Config(DMA1_Channel4,(u32)&USART1->DR,(u32)SendBuff,5200);//DMA1通道4,外設為串口1,存儲器為SendBuff,長度5200.
2.然後將待發送內容裝入存儲器
SendBuff[i]=TEXT_TO_SEND[t];
3.然後開啟一次DMA傳輸
MYDMA_Enable(DMA1_Channel4);//開始一次DMA傳輸!
4.監控傳送進度。
pro=DMA1_Channel4->CNDTR;//得到當前還剩餘多少個數據
8. DMA的原理
Direct Memory Access 直接存儲器訪問
DMA原理:DMA 是所有現代電腦的重要特色,他允許不同速度的硬體裝置來溝通,而不需要依於 CPU 的大量 中斷 負載。否則,CPU 需要從 來源 把每一片段的資料復制到 暫存器,然後把他們再次寫回到新的地方。在這個時間中,CPU 對於其他的工作來說就無法使用。 DMA 傳輸重要地將一個內存區從一個裝置復制到另外一個。當 CPU 初始化這個傳輸動作,傳輸動作本身是由 DMA 控制器 來實行和完成。典型的例子就是移動一個外部內存的區塊到晶元內部更快的內存去。像是這樣的操作並沒有讓處理器工作拖延,反而可以被重新排程去處理其他的工作。DMA 傳輸對於高效能 嵌入式系統 演算法和網路是很重要的。
在實現DMA傳輸時,是由DMA控制器直接掌管匯流排,因此,存在著一個匯流排控制權轉移問題。即DMA傳輸前,CPU要把匯流排控制權交給DMA控制器,而在結束DMA傳輸後,DMA控制器應立即把匯流排控制權再交回給CPU。一個完整的DMA傳輸過程必須經過下面的4個步驟。
DMA傳輸
DMA控制器獲得匯流排控制權後,CPU即刻掛起或只執行內部操作,由DMA控制器輸出讀寫命令,直接控制RAM與I/O介面進行DMA傳輸。
DMA結束
當完成規定的成批數據傳送後,DMA控制器即釋放匯流排控制權,並向I/O介面發出結束信號。當I/O介面收到結束信號後,一方面停 止I/O設備的工作,另一方面向CPU提出中斷請求,使CPU從不介入的狀態解脫,並執行一段檢查本次DMA傳輸操作正確性的代碼。最後,帶著本次操作結果及狀態繼續執行原來的程序。
由此可見,DMA傳輸方式無需CPU直接控制傳輸,也沒有中斷處理方式那樣保留現場和恢復現場的過程,通過硬體為RAM與I/O設備開辟一條直接傳送數據的通路,使CPU的效率大為提高。
基本就這樣
希望我的回答對你有幫助
9. DMA方式傳送數據中的DMA是什麼啊
DMA(Direct
Memory
Access),即直接存儲器存取,是一種快速傳送數據的機制。數據傳遞可以從適配卡到內存,從內存到適配卡或從一段內存到另一段內存。利用它進行數據傳送時不需要CPU的參與。每台電腦主機板上都有DMA控制器,通常計算機對其編程DMA方式傳送數據中的DMA是什麼啊
?