STM32—DMA
- 1 DMA是什麼?
DMA全稱:Direct Memory Access,意思是直接存儲器通路,個人了解就是:直接把資料通過DMA的内部通道從一個地方發送到另外一個地方(也就是說DMA不像USART一樣,DMA不需要資料發送和接收函數),不需要CPU的記憶體資料寄存器來緩存資料(沒有通過CPU),可以節省CPU的資源。(設計這個的人真厲害)
這個資料可以從存儲器(SRAM、Flash,以下簡稱M)來,到存儲器M或者外設P去,或者反過來,從外設P到存儲器M,或者存儲器M到存儲器M,隻支援上述三種模式:P->M,M->P,M->M。
- 2 DMA資料傳輸過程
①第一種情況是:MtoM,則隻需要調用DMA_Cmd函數即可開啟DMA的資料傳輸,第二種情況是:如果是外設想要通過DMA傳輸資料的話,首先外設需要向DMA控制器發送DMA請求(這個函數在每個外設的頭檔案中,一般都是xxx_DMACmd(x,x,x),且這個函數的第二個參數,Tx表示告訴DMA做好發送準備,Rx表示告訴DMA做好接收準備),然後DMA收到請求信号,控制器會給外設一個應答信号,當外設應答後且 DMA 控制器收到應答信号之後,就會啟動 DMA 的傳輸,直到傳輸完畢。
②在上述的過程中可能存在多個DMA通道需要被同時使用,但是同一時間隻能接收一個,不能同時接收多個,也就是說一個時間點,僅有一個DMA通道可以使用。
③當發生多個 DMA 通道請求時,就意味着有先後響應處理的順序問題,這個就由仲裁器也管理。仲裁器管理 DMA 通道請求分為兩個階段。第一階段屬于軟體階段,可以在DMA_CCRx 寄存器的PL位設定,有 4 個等級:非常高、高、中和低四個優先級。第二階段屬于硬體階段,如果兩個或以上的 DMA 通道請求設定的優先級一樣,則他們優先級取決于通道編号,編号越低優先權越高,比如通道1 高于通道2。
- 3 DMA資源介紹
3.1 DMA1資源:7通道
2.2 DMA2資源:5通道
注:存儲器到存儲器(M->M)的資料傳輸,對于上述所有通道都可以使用。
- 4 DMA結構體詳解:
1 typedef struct
2 {
3 uint32_t DMA_PeripheralBaseAddr; // 外設位址
4 uint32_t DMA_MemoryBaseAddr; // 存儲器位址
5 uint32_t DMA_DIR; // 傳輸方向
6 uint32_t DMA_BufferSize; // 傳輸數目
7 uint32_t DMA_PeripheralInc; // 外設位址增量模式
8 uint32_t DMA_MemoryInc; // 存儲器位址增量模式
9 uint32_t DMA_PeripheralDataSize; // 外設資料寬度
10 uint32_t DMA_MemoryDataSize; // 存儲器資料寬度
11 uint32_t DMA_Mode; // 模式選擇
12 uint32_t DMA_Priority; // 通道優先級
13 uint32_t DMA_M2M; // 存儲器到存儲器模式
14 } DMA_InitTypeDef;
對于其中幾個成員需要注意:
- uint32_t DMA_PeripheralBaseAddr;一般設定為外設的資料寄存器位址
- uint32_t DMA_MemoryBaseAddr;一般設定為自定義存儲器首位址,const常量存儲在flash中,變量存儲在SRAM中
- uint32_t DMA_BufferSize;16位有效,最大支援65535
- uint32_t DMA_PeripheralInc;一般外設都是隻有一個資料寄存器,是以一般不會使能該位
- uint32_t DMA_MemoryInc;自定義的存儲區一般都是存放多個資料的,是以要使能存儲器位址自動遞增功能,即資料分批次發送;換句話說就是資料太多,分批次發送
- uint32_t DMA_PeripheralDataSize;和uint32_t DMA_MemoryDataSize;兩者設定的資料寬度理應一直,但是如果設定不一緻:①資料源寬度(1個字)>目的資料源寬度(1個位元組),則資料源的一個字資料隻有一個位元組資料被發往目的位址,其他的資料會被丢棄;②資料源寬度(1個位元組)<目的資料源寬度(1個字),如果資料源分兩次發兩個位元組的資料(每次發送一個位元組,發送兩次),則1位元組在目的位址占據1個字的1個位元組大小,另外一個位元組占下一個字的一個位元組大小
-
uint32_t DMA_Mode;此模式是傳輸模式,可選DMA_Mode_Normal正常模式:把全部資料發送完成就停止,DMA_Mode_Circular循環發送模式:資料一輪一輪的發送(比如電壓采集可以使用)
從上述的結構體,我們需要解決下述三個問題:
①資料從哪裡來,到哪裡去;(3 - 5行決定)
②傳輸的資料有多少,資料的機關是什麼;(6 - 10行決定)
③傳輸的模式是什麼;(11行決定)
④傳輸完成的标志,可以通過查詢标志位或者通過中斷的方式來鑒别;(通過函數查詢對應标志位即可)
⑤對于多DMA通道傳輸資料時,需要配置通道的優先級;(12行決定)