【STM32】DMA详解
00. 目錄
文章目錄
- 00. 目錄
- 01. DMA簡介
- 02. DMA主要特性
- 03. DMA框圖
- 04. DMA事務
- 05. 通道選擇
- 06. 仲裁器
- 07. DMA數據流
- 08. DMA中斷
- 09. DMA寄存器
- 9.1 DMA 低中斷狀態寄存器 (DMA_LISR)
- 9.2 DMA 高中斷狀態寄存器 (DMA_HISR)
- 9.3 DMA 低中斷標志清零寄存器 (DMA_LIFCR)
- 9.4 DMA 高中斷標志清零寄存器 (DMA_HIFCR)
- 9.5 DMA 數據流 x 配置寄存器 (DMA_SxCR) (x = 0..7)
- 9.6 DMA 數據流 x 數據項數寄存器 (DMA_SxNDTR) (x = 0..7)
- 9.7 DMA 數據流 x 外設地址寄存器 (DMA_SxPAR) (x = 0..7)
- 9.8 DMA 數據流 x 存儲器 0 地址寄存器 (DMA_SxM0AR) (x = 0..7)
- 9.9 DMA 數據流 x 存儲器 1 地址寄存器 (DMA_SxM1AR) (x = 0..7)
- 9.10 DMA 數據流 x FIFO 控制寄存器 (DMA_SxFCR) (x = 0..7)
- 10. 附錄
- 11. 聲明
01. DMA簡介
直接存儲器訪問 (DMA) 用于在外設與存儲器之間以及存儲器與存儲器之間提供高速數據傳輸。可以在無需任何 CPU 操作的情況下通過 DMA 快速移動數據。這樣節省的 CPU 資源可供其它操作使用。
DMA 控制器基于復雜的總線矩陣架構,將功能強大的雙 AHB 主總線架構與獨立的 FIFO 結合在一起,優化了系統帶寬。
兩個 DMA 控制器總共有 16 個數據流(每個控制器 8 個),每一個 DMA 控制器都用于管理一個或多個外設的存儲器訪問請求。每個數據流總共可以有多達 8 個通道(或稱請求)。每個通道都有一個仲裁器,用于處理 DMA 請求間的優先級。
02. DMA主要特性
DMA 主要特性是:
● 雙 AHB 主總線架構,一個用于存儲器訪問,另一個用于外設訪問
● 僅支持 32 位訪問的 AHB 從編程接口
● 每個 DMA 控制器有 8 個數據流,每個數據流有多達 8 個通道(或稱請求)
● 每個數據流有單獨的四級 32 位先進先出存儲器緩沖區 (FIFO),可用于 FIFO 模式或直接模式:
— FIFO 模式:可通過軟件將閾值級別選取為 FIFO 大小的 1/4、1/2 或 3/4
— 直接模式
每個 DMA 請求會立即啟動對存儲器的傳輸。當在直接模式(禁止 FIFO)下將 DMA請求配置為以存儲器到外設模式傳輸數據時,DMA 僅會將一個數據從存儲器預加載到內部 FIFO,從而確保一旦外設觸發 DMA 請求時則立即傳輸數據。
● 通過硬件可以將每個數據流配置為:
— 支持外設到存儲器、存儲器到外設和存儲器到存儲器傳輸的常規通道
— 也支持在存儲器方雙緩沖的雙緩沖區通道
● 8 個數據流中的每一個都連接到專用硬件 DMA 通道(請求)
● DMA 數據流請求之間的優先級可用軟件編程(4 個級別:非常高、高、中、低),在軟件優先級相同的情況下可以通過硬件決定優先級(例如,請求 0 的優先級高于請求 1)
● 每個數據流也支持通過軟件觸發存儲器到存儲器的傳輸(僅限 DMA2 控制器)
● 可供每個數據流選擇的通道請求多達 8 個。此選擇可由軟件配置,允許幾個外設啟動 DMA請求
● 要傳輸的數據項的數目可以由 DMA 控制器或外設管理:
— DMA 流控制器:要傳輸的數據項的數目是 1 到 65535,可用軟件編程
— 外設流控制器:要傳輸的數據項的數目未知并由源或目標外設控制,這些外設通過硬件發出傳輸結束的信號
● 獨立的源和目標傳輸寬度(字節、半字、字):源和目標的數據寬度不相等時,DMA 自動封裝/解封必要的傳輸數據來優化帶寬。這個特性僅在 FIFO 模式下可用。
● 對源和目標的增量或非增量尋址
● 支持 4 個、8 個和 16 個節拍的增量突發傳輸。突發增量的大小可由軟件配置,通常等于外設 FIFO 大小的一半
● 每個數據流都支持循環緩沖區管理
● 5 個事件標志(DMA 半傳輸、DMA 傳輸完成、DMA 傳輸錯誤、DMA FIFO 錯誤、直接模式錯誤),進行邏輯或運算,從而產生每個數據流的單個中斷請求
03. DMA框圖
DMA 控制器執行直接存儲器傳輸:因為采用 AHB 主總線,它可以控制 AHB 總線矩陣來啟動 AHB 事務。
它可以執行下列事務:
● 外設到存儲器的傳輸
● 存儲器到外設的傳輸
● 存儲器到存儲器的傳輸
DMA 控制器提供兩個 AHB 主端口:AHB 存儲器端口 (用于連接存儲器)和 AHB 外設端口(用于連接外設)。但是,要執行存儲器到存儲器的傳輸,AHB 外設端口 必須也能訪問存儲器。
AHB 從端口用于對 DMA 控制器進行編程(它僅支持 32 位訪問)。
有關兩個 DMA 控制器的系統實現
04. DMA事務
DMA 事務由給定數目的數據傳輸序列組成。要傳輸的數據項的數目及其寬度(8 位、16 位或 32 位)可用軟件編程。
每個 DMA 傳輸包含三項操作:
● 通過 DMA_SxPAR 或 DMA_SxM0AR 寄存器尋址,從外設數據寄存器或存儲器單元中加載數據。
● 通過 DMA_SxPAR 或 DMA_SxM0AR 寄存器尋址,將加載的數據存儲到外設數據寄存器或存儲器單元。
● DMA_SxNDTR 計數器在數據存儲結束后遞減,該計數器中包含仍需執行的事務數。
在產生事件后,外設會向 DMA 控制器發送請求信號。DMA 控制器根據通道優先級處理該請求。只要 DMA 控制器訪問外設,DMA 控制器就會向外設發送確認信號。外設獲得 DMA 控制器的確認信號后,便會立即釋放其請求。一旦外設使請求失效,DMA 控制器就會釋放確認信號。如果有更多請求,外設可以啟動下一個事務。
05. 通道選擇
每個數據流都與一個 DMA 請求相關聯,此 DMA 請求可以從 8 個可能的通道請求中選出。此選擇由 DMA_SxCR 寄存器中的 CHSEL[2:0] 位控制。
06. 仲裁器
仲裁器為兩個 AHB 主端口(存儲器和外設端口)提供基于請求優先級的 8 個 DMA 數據流請求管理,并啟動外設/存儲器訪問序列。
優先級管理分為兩個階段:
● 軟件:每個數據流優先級都可以在 DMA_SxCR 寄存器中配置。分為四個級別:
— 非常高優先級
— 高優先級
— 中優先級
— 低優先級
● 硬件:如果兩個請求具有相同的軟件優先級,則編號低的數據流優先于編號高的數據流。例如,數據流 2 的優先級高于數據流 4。
07. DMA數據流
8 個 DMA 控制器數據流都能夠提供源和目標之間的單向傳輸鏈路。
每個數據流配置后都可以執行:
● 常規類型事務:存儲器到外設、外設到存儲器或存儲器到存儲器的傳輸。
● 雙緩沖區類型事務:使用存儲器的兩個存儲器指針的雙緩沖區傳輸(當 DMA 正在進行自/至緩沖區的讀/寫操作時,應用程序可以進行至/自其它緩沖區的寫/讀操作)。
要傳輸的數據量(多達 65535)可以編程,并與連接到外設 AHB 端口的外設(請求 DMA 傳輸)的源寬度相關。每個事務完成后,包含要傳輸的數據項總量的寄存器都會遞減。
08. DMA中斷
對于每個 DMA 數據流,可在發生以下事件時產生中斷:
● 達到半傳輸
● 傳輸完成
● 傳輸錯誤
● FIFO 錯誤(上溢、下溢或 FIFO 級別錯誤)
● 直接模式錯誤
09. DMA寄存器
9.1 DMA 低中斷狀態寄存器 (DMA_LISR)
DMA low interrupt status register
偏移地址:0x00
復位值:0x0000 0000
9.2 DMA 高中斷狀態寄存器 (DMA_HISR)
DMA high interrupt status register
偏移地址:0x04
復位值:0x0000 0000
9.3 DMA 低中斷標志清零寄存器 (DMA_LIFCR)
DMA low interrupt flag clear register
偏移地址:0x08
復位值:0x0000 0000
9.4 DMA 高中斷標志清零寄存器 (DMA_HIFCR)
DMA high interrupt flag clear register
偏移地址:0x0C
復位值:0x0000 0000
9.5 DMA 數據流 x 配置寄存器 (DMA_SxCR) (x = 0…7)
DMA stream x configuration register
此寄存器用于配置相關數據流。
偏移地址:0x10 + 0x18 × 數據流編號
復位值:0x0000 0000
9.6 DMA 數據流 x 數據項數寄存器 (DMA_SxNDTR) (x = 0…7)
DMA stream x number of data register
偏移地址:0x14 + 0x18 × 數據流編號
復位值:0x0000 0000
9.7 DMA 數據流 x 外設地址寄存器 (DMA_SxPAR) (x = 0…7)
DMA stream x peripheral address register
偏移地址:0x18 + 0x18 × 數據流編號
復位值:0x0000 0000
9.8 DMA 數據流 x 存儲器 0 地址寄存器 (DMA_SxM0AR) (x = 0…7)
DMA stream x memory 0 address register
偏移地址:0x1C + 0x18 × 數據流編號
復位值:0x0000 0000
9.9 DMA 數據流 x 存儲器 1 地址寄存器 (DMA_SxM1AR) (x = 0…7)
DMA stream x memory 1 address register
偏移地址:0x20 + 0x18 × 數據流編號
復位值:0x0000 0000
9.10 DMA 數據流 x FIFO 控制寄存器 (DMA_SxFCR) (x = 0…7)
DMA stream x FIFO control register
偏移地址:0x24 + 0x24 × 數據流編號
復位值:0x0000 0021
10. 附錄
10.1 【STM32】STM32系列教程匯總
網址:【STM32】STM32系列教程匯總
11. 聲明
STM32F4xx中文參考手冊.pdf
總結
以上是生活随笔為你收集整理的【STM32】DMA详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Libevent】Libevent学习
- 下一篇: 【STM32】DMA相关函数和类型