天天看點

STM32-一文搞懂DMA1. DMA簡介2. STM32的DMA架構3. DMA詳解4. DMA寄存器

1. DMA簡介

直接存儲器存取(DMA,Direct Memory Access)用來提供在外設和存儲器之間或者存儲器和存儲器之間的高速資料傳輸。無須CPU幹預,資料可以通過DMA快速地移動,節省CPU資源。DMA傳輸本質上是一種CPU進行權力下放的方式,将一些本來需要CPU處理的繁瑣事務經過交代(配置DMA)之後全權交給DMA控制器處理。DMA 傳輸對于高效能嵌入式系統算法和網絡是很重要的。

在實作DMA傳輸時,是由DMA控制器直接接管總線,是以,存在着一個總線控制權轉移問題。即DMA傳輸前,CPU要把總線控制權交給DMA控制器,而在結束DMA傳輸後,DMA控制器應立即把總線控制權再交回給CPU。一個完整的DMA傳輸過程必須經過DMA請求、DMA響應、DMA傳輸、DMA結束4個步驟。

2. STM32的DMA架構

STM32有兩個DMA控制器,共有12個通道(DMA1有7個通道,DMA2有5個通道),每個通道專門用來管理來自于一個或多個外設對存儲器通路的請求。還有一個仲裁器來協調各個DMA請求的優先權。

2.1 DMA框圖

STM32-一文搞懂DMA1. DMA簡介2. STM32的DMA架構3. DMA詳解4. DMA寄存器

由框圖可以看到,DMA1和DMA2、以太網MAC、USB OTG FS均為AHB下的外設(時鐘源是AHB),DMA1、DMA2、以太網MAC可以以DMA方式控制總線。其中主要的DMA1和DMA2控制器的DMA請求源均為APB1和APB2下的外設。一旦DMA接管總線,就可以對總線上外設進行資料讀取,閃存、SRAM、外設的SRAM、APB1、APB2和AHB外設均可作為通路的源和目标。

2.2 DMA主要特性

  • 12個獨立的可配置的通道(請求):DMA1有7個通道,DMA2有5個通道每個通道都直接連接配接專用的硬體DMA請求,每個通道都同樣支援軟體觸發。這些功能通過軟體來配置。
  • 在同一個DMA子產品上,多個請求間的優先權可以通過軟體程式設計設定(共有四級:很高、高、中等和低),優先權設定相等時由硬體決定(請求0優先于請求1,依此類推) 。
  • 獨立資料源和目标資料區的傳輸寬度(位元組、半字、全字),模拟打包和拆包的過程。源和目标位址必須按資料傳輸寬度對齊。
  • 支援循環的緩沖器管理
  • 每個通道都有3個事件标志(DMA半傳輸、DMA傳輸完成和DMA傳輸出錯),這3個事件标志邏輯或成為一個單獨的中斷請求。
  • 存儲器和存儲器間的傳輸
  • 外設和存儲器、存儲器和外設之間的傳輸
  • 閃存、SRAM、外設的SRAM、APB1、APB2和AHB外設均可作為通路的源和目标。
  • 可程式設計的資料傳輸數目:最大為65535

3. DMA詳解

3.1 DMA請求

如框圖所示,APB1和APB2下的外設向DMA控制器發送請求信号。

在發生一個事件後,外設向DMA控制器發送一個請求信号。DMA控制器通過仲裁器根據通道的優先權處理請求。當DMA控制器開始通路送出請求的外設時,立即向請求源發送一個應答信号,請求源得到應答後立即釋放它的請求。

3.2 DMA通道

DMA共有12個獨立可程式設計的通道,DMA1有7個、DMA2有5個。每個通道對應着多個不同的外設的請求,他們通過邏輯或連接配接到一個通道,一個通道同一時間隻能接收一個外設請求。每個通道都可以在有固定位址的外設寄存器和存儲器位址之間執行DMA傳輸。DMA傳輸的資料量是可程式設計的,最大達到65535。

DMA1通道:

STM32-一文搞懂DMA1. DMA簡介2. STM32的DMA架構3. DMA詳解4. DMA寄存器

DMA2通道:

STM32-一文搞懂DMA1. DMA簡介2. STM32的DMA架構3. DMA詳解4. DMA寄存器

3.3 DMA仲裁器

這麼多通道,肯定要有優先級來進行管理,仲裁器根據通道請求的優先級來啟動外設/存儲器的通路。每個通道的優先權可以在DMA_CCRx寄存器中設定,有4個等級:

最高優先級

高優先級

中等優先級

低優先級

優先響應高優先級的通道,如果2個請求通道有相同的軟體優先級,則較低編号的通道比較高編号的通道有較高的優先權。

3.4 DMA中斷

每個DMA通道都可以在DMA傳輸過半、傳輸完成和傳輸錯誤時産生中斷。為應用的靈活性考慮,通過設定寄存器的不同位來打開這些中斷。

DMA中斷請求:

STM32-一文搞懂DMA1. DMA簡介2. STM32的DMA架構3. DMA詳解4. DMA寄存器

3.5 傳輸方向

DMA有三個傳輸方向,外設到存儲器、存儲器到外設、存儲器到存儲器。

3.6 DMA循環模式

傳送一次之後,又恢複第一次的配置,繼續進行傳輸。

循環模式用于處理循環緩沖區和連續的資料傳輸(如ADC的掃描模式)。在DMA_CCRx寄存器中的CIRC位用于開啟這一功能。當啟動了循環模式,資料傳輸的數目變為0時,将會自動地被恢複成配置通道時設定的初值,DMA操作将會繼續進行。當通道配置為非循環模式時,傳輸結束後(即傳輸計數變為0)将不再産生DMA操作。要開始新的DMA傳輸,需要在關閉DMA通道的情況下,在DMA_CNDTRx寄存器中重新寫入傳輸數目。

3.7 位址增量模式

當傳輸的資料不止一個時,需要根據起始位址、資料寬度對後來的資料的讀寫位址進行指定,這就有了位址增量模式。通過設定DMA_CCRx寄存器中的PINC和MINC标志位,外設和存儲器的指針在每次傳輸後可以有選擇地完成自動增量。當設定為增量模式時,下一個要傳輸的位址将是前一個位址加上增量值,增量值取決與所選的資料寬度為1、2或4。第一個傳輸的位址是存放在DMA_CPARx /DMA_CMARx寄存器中位址。在傳輸過程中,這些寄存器保持它們初始的數值,軟體不能改變和讀出目前正在傳輸的位址。

4. DMA寄存器

4.1 DMA中斷狀态寄存器(DMA_ISR)

STM32-一文搞懂DMA1. DMA簡介2. STM32的DMA架構3. DMA詳解4. DMA寄存器

GIFx:通道x的全局中斷标志(x = 1 … 7) (Channel x global interrupt flag)

如果通道x發生了下方三個中斷(TCIFx、HTIFx、TEIFx)任意一個,該位就被置位。

TCIFx:通道x的傳輸完成标志(x = 1 … 7) (Channel x transfer complete flag),完成置1。

HTIFx:通道x的半傳輸标志(x = 1 … 7) (Channel x half transfer flag),完成置1。

TEIFx:通道x的傳輸錯誤标志(x = 1 … 7) (Channel x transfer error flag),出錯置1。

在DMA_IFCR寄存器的相應位寫入’1’可以清除DMA_ISR對應的标志位。

4.2 DMA中斷标志清除寄存器(DMA_IFCR)

STM32-一文搞懂DMA1. DMA簡介2. STM32的DMA架構3. DMA詳解4. DMA寄存器

該寄存器對上述中斷狀态寄存器DMA_ISR清除相應的标志位。寫1清除,寫0無效。

4.3 DMA通道x配置寄存器(DMA_CCRx)(x = 1…7)

STM32-一文搞懂DMA1. DMA簡介2. STM32的DMA架構3. DMA詳解4. DMA寄存器

EN:通道開啟 (Channel enable) 

0:通道不工作

1:通道開啟

TEIE/HTIE/TCIE:允許傳輸錯誤/半傳輸/傳輸完成中斷 (Transfer error interrupt enable) 

0:禁止TE/HT/TC中斷

0:允許TE/HT/TC中斷

DIR:資料傳輸方向 (Data transfer direction)

0:從外設讀

1:從存儲器讀

CIRC:循環模式 (Circular mode)

0:不執行循環操作

1:執行循環操作

PINC:外設位址增量模式 (Peripheral increment mode)

0:不執行外設位址增量操作

1:執行外設位址增量操作

MINC:存儲器位址增量模式 (Memory increment mode)

0:不執行存儲器位址增量操作

1:執行存儲器位址增量操作

PSIZE[1:0]:外設資料寬度 (Peripheral size) 

00:8位     01:16位      10:32位     11:保留

MSIZE[1:0]:存儲器資料寬度 (Memory size)

00:8位      01:16位       10:32位       11:保留

PL[1:0]:通道優先級 (Channel priority level) 

00:低      01:中       10:高     11:最高

MEM2MEM:存儲器到存儲器模式 (Memory to memory mode)

0:非存儲器到存儲器模式;

1:啟動存儲器到存儲器模式。

4.4 DMA通道x傳輸數量寄存器(DMA_CNDTRx)(x = 1…7)

STM32-一文搞懂DMA1. DMA簡介2. STM32的DMA架構3. DMA詳解4. DMA寄存器

NDT[15:0]:資料傳輸數量 (Number of data to transfer)

資料傳輸數量為0至65535。這個寄存器隻能在通道不工作(DMA_CCRx的EN=0)時寫入。通道開啟後該寄存器變為隻讀,訓示剩餘的待傳輸位元組數目。寄存器内容在每次DMA傳輸後遞減。

資料傳輸結束後,寄存器的内容或者變為0;或者當該通道配置為自動重加載模式(循環模式)時,寄存器的内容将被自動重新加載為之前配置時的數值。

4.5 DMA通道x外設位址寄存器(DMA_CPARx)(x = 1…7)

STM32-一文搞懂DMA1. DMA簡介2. STM32的DMA架構3. DMA詳解4. DMA寄存器

PA[31:0]:外設位址 (Peripheral address),這裡存放的是外設資料寄存器的基位址,作為資料傳輸的源或目标。

當PSIZE=’01’(16位),不使用PA[0]位。操作自動地與半字位址對齊。

當PSIZE=’10’(32位),不使用PA[1:0]位。操作自動地與字位址對齊。

4.6 DMA通道x存儲器位址寄存器(DMA_CMARx)(x = 1…7)

STM32-一文搞懂DMA1. DMA簡介2. STM32的DMA架構3. DMA詳解4. DMA寄存器

與外設位址寄存器類似。

參考:

《STM32中/英文手冊》