STM32F103之DMA學習記錄


/================翻譯STM32F103開發手冊DMA章節===========================/

13 DMA(Direct memory access)

13.1 DMA介紹

DMA(直接存儲器存取)是用來給外設與存儲器以及存儲器與存儲器提供高速的數據傳輸。

數據可以通過DMA快速地移動而不需經過CPU。

這使得CPU資源可以用於其他操作。

兩個DMA控制器一共有12個通道(DAM1有7個,DAM2有5個),

每一個都能專注地管理一個或多個外設的存儲器訪問請求。

有一個仲裁機制處理DMA請求的優先級問題。

13.2 DMA主要特性

12個可配置的獨立通道:DMA1有7個,DMA2有5個。

12個通道都連接到專用的硬件DMA請求,

每個通道也支持軟件觸發。這由軟件進行配置。

DMA通道的請求優先級是可以通過軟件編程設置的,

優先級等級包括:非常高、高、中、低,

如果是同等級的話,請求1有限請求2。

獨立的源點和目標點傳輸大小,模擬打包和拆包。

源點和目標點地址必須與數據大小對齊。

支持循環緩沖區管理。

有3個事件標志:DMA傳輸一半、DMA傳輸完成以及DMA傳輸錯誤。

每個通道的單獨中斷請求對於這三個事件標志會邏輯上或在一起。

存儲器與存儲器之間的傳輸。

外設到存儲器、存儲器到外設、外設到外設都是可以傳輸的。

FLSH,SRAM,掛在APB1、APB2與AHB上的外設都可以作為DMA傳輸的源點和目標點。

傳輸的數據量是可以設置的,最高可達65536。

 

 

 上圖就是DMA的模塊圖,可以看出模塊與存儲器之間的數據傳輸可以不經過CPU。

 

13.3 DMA功能描述

DMA控制器通過與Cortex-M3內核共享系統總線執行存儲器數據的直接傳輸。

當DMA請求與CPU針對相同的目標點(存儲器或者外設)時,

DMA請求可能會使CPU訪問系統總線停止幾個周期。

總線矩陣實現循環調度,從而保證CPU能占用至少一半的系統總線帶寬。

13.3.1 DMA事務

時間發生后,外設向DMA控制器發送一個控制信號。

DMA控制器根據通道的優先級處理請求。

只要DMA控制器訪問外圍設備,DMA控制器就會給外設發送一個響應。

當外設接收到DMA控制器的響應,外設會釋放它的請求。

一旦請求被外圍設備拒絕,DMA控制器會停止響應。

如果有更多的請求,外設會開始下一個事務。

綜上所述,每個DMA包含包含3個操作:

(1)從外圍數據寄存器或內存地址加載數據,

通過一個內部的當前外設或存儲器地址寄存器。

 用於第一次傳輸的起始地址是基本外設/內存地址,

這些地址可以在DMA_CPARx或DMA_CMARx寄存器中編程設置。

(2)加載到外圍數據寄存器的數據的存儲或內存地址通過當前內部外設/存儲器地址寄存器。

用於第一次傳輸的起始地址是基本外設/內存地址,

這些地址可以在DMA_CPARx或者DMA_CMARx寄存器里編程設置。

(3)后遞減的DMA_CNDTRx寄存器包含一些仍需要執行的事件。

13.3.2 仲裁者

仲裁程序根據通道請求的優先級管理它們,

並且啟動外圍/內存訪問序列。

優先級分兩階段管理:

(1)軟件:每一個通道的優先級都可以通過DMA_CCRx寄存器配置。

有四個等級:非常高、高、中等、低。

(2)硬件:如果兩個請求具有相同的軟件優先級,

最低數字的通道會獲得優先權而不是最高數字的通道。

例如:通道2比通道4有優先權。

在高密度、超高密度以及連接線器件中,DMA1控制器比DMA2控制器有優先權。

 

 

 

13.3.3 DMA通道

每一個通道都能處理固定地址的外設寄存器與一個內存地址的DMA傳輸。

數據量大小是可以編程控制的,數據最大是65535。

每一次傳輸后,包含數據量的寄存器會遞減。

可編程數據大小

在外設與內存之間,傳輸數據的大小都是可通過設置DMA_CCRx寄存器的RSIZE和MSIZE位編程改變。

 

指針增量

在每一個事件之后,外設和內存指針可以自動遞增,

這取決於DMA_CCRx寄存器的PINC和MINC位。

如果遞增模式啟用,下一個轉換的地址將是前一個地址加1或2或4,

這個遞增的數據取決於選擇數據的大小。

第一次轉移的地址由DMA_CPARx/DMA_CMARx寄存器設置。

在轉移操作過程中,寄存器保留最初的編程值。

當前的轉移地址不能由軟件編程控制。

如果通道被配置為非循環模式,在上一次轉換后,將不提供DMA請求。

為了重新加載要轉移到DMA_CNDTRx寄存器新數量的數據項,

DMA通道必須禁止。

如果一個DMA通道禁止,DMA寄存器不會重置。

DMA通道寄存器保持初始值,這些初始值是在通道配置階段編程設置的。

在循環模式,在最后一次轉換后,

DMA_CNDTRx寄存器自動加載初始設置的值。

 

通道配置過程

應該用以下順序來配置DMA通道:

1、在DMA_CPARx寄存器上設置外圍寄存器地址。

在外圍事件觸發后,

數據會從外設地址轉移到內存地址。

2、在DMA_CMARx寄存器設置內存地址。

在外圍事件觸發后,會從這個地址讀或寫數據。

3、在DMA_CNDTRx寄存器配置要傳輸的總數據量。

在每次外圍事件后,這個值會遞減。

4、在DMA_CCRx寄存器中使用PL[1:0]位配置通道的優先級。

5、在DMA_CCRx寄存器中配置數據傳輸方向,循環模式,

外設和內存的遞增模式,外設和內存的數據大小,中斷觸發時刻。

6、DMA_CCRx寄存器里通過設置使能位激活通道。

一旦通道激活,該通道可以服務任何連接在此通道上的DMA請求。

當數據傳輸一半時,傳輸過半標志位(HTIF)被置1,

如果過半中斷使能位(HTIE)位被設置了,會產生一個中斷。

在傳輸結束時,傳輸完成標志位(TCIF)被置1,

如果傳輸完成中斷使能位被設置了,會產生一個中斷。

循環模式

循環模式可用於處理循環緩沖區和連續數據流(例如ADC掃描模式)。

在DMA_CCRx寄存器里通過設置CIRC位可以激活這項特征。

如果循環模式被激活,數據將會以初始配置值自動傳輸加載,

初始配置值是在配置階段設置的,並且DMA請求繼續被處理。

內存到內存模式

 DMA通道也可以在沒有外設觸發請求的情況下工作。

這種模式被稱為內存到內存模式。

如果DMA_CCRx寄存器的MEM2MEM位被置1,

當軟件配置DMA_CCRx寄存器的使能位,通道就啟動傳輸。

一旦DMA_CNDTRx寄存器值變為0,傳輸就會停止。

內存到內存模式不能與循環模式同時使用。

 

13.3.4 數據寬度、數據對齊方式以及大小端模式都是可編程的

當PSIZE與MSIZE不相等時,DMA會執行對齊。

尋址AHB外設不支持字節或半字操作

當DMA啟動一個AHB字節或半字寫操作時,

數據會復現在HWDATA[31:0]總線的空閑線路上。

因此當未使用的AHB從設備不支持字節或半字操作(當外設不適用HSIZE時)

並且不產生任何錯誤,DMA將會寫32位HWDATA用以下兩種方式寫:

(1)寫半字“0xABCD”,當HSIZE= 半字

13.3.5 錯誤管理

對一個保留地址空間進行讀或寫操作時,會產生一個DMA傳輸錯誤。

當DMA讀或寫訪問過程中產生一個DMA傳輸錯誤時,

錯誤通道會通過硬件清除使能位自動禁止,

使能位在相應的通道配置寄存器(DMA_CCRx)中。

通道傳輸錯誤中斷標志位(TEIF)在DMA_IFR寄存器中設置,

如果傳輸錯誤中斷使能位(TEIE)被設置后,會產生中斷。

13.3.6 中斷

對於每一個通道,在傳輸一半時,在傳輸完成時或傳輸錯誤時,都會產生一個中斷。

單獨的中斷使能位可靈活配置。

 

 

 

 

13.3.7 DMA請求映射

 DMA1 控制器

在進入DMA1之前,外設的七個請求是簡單的邏輯或關系,

這就意味着在一個時刻只能有一個請求。

通過對相應外設寄存器DMA的控制位進行編程,

外設的DMA請求可以被獨立地激活。

 

 

 從上圖可以看出,外設請求先經過一個或門,然后通過一個選擇器,

接着對7個DMA請求進行優先級設置,最終執行最高優先級DMA請求。

 

 

 DMA2控制器

DMA2控制器的介紹與DMA1控制器的介紹差不多,

只不過DMA1有7個通道,DMA2只有5個通道。

 

 

 

 

 

13.4 DMA寄存器


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM