/================翻譯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寄存器