DMA(Direct Memory Access)—直接存儲器存取,是單片機的一個外設,它的主要功能是用來搬數據,但是不需要占用 CPU,即在傳輸數據的時候,CPU 可以干其他的事情,好像是多線程一樣。數據傳輸支持從外設到存儲器或者存儲器到存儲器,這里的存儲器可以是 SRAM 或者是 FLASH。DMA 控制器包含了 DMA1 和 DMA2(大容量產品中才有),其中 DMA1 有 7 個通道,DMA2 有 5 個通道,這里的通道可以理解為傳輸數據的一種管道。
(1-1)DMA框圖
DMA相關概念:
i.DMA請求
外設要想通過 DMA 來傳輸數據,必須先給 DMA 控制器發送 DMA 請求,DMA 收到請求信號之后,控制器會給外設一個應答信號,當外設應答后且 DMA 控制器收到應答信號之后,就會啟動 DMA 的傳輸,直到傳輸完畢。
DMA 有 DMA1 和 DMA2 兩個控制器,DMA1 有 7 個通道,DMA2 有 5 個通道,不同的 DMA 控制器的通道對應著不同的外設請求,這決定了我們在軟件編程上該怎么設置,具體見 DMA 請求映像表。
(1-2)DMA1請求一覽表
(1-3)DMA2請求一覽表
ii.通道
DMA 具有 12 個獨立可編程的通道,其中 DMA1 有 7 個通道,DMA2 有 5 個通道,每個通道對應不同的外設的 DMA 請求。雖然每個通道可以接收多個外設的請求,但是同一時間只能接收一個,不能同時接收多個。
iii.DMA仲裁
當發生多個 DMA 通道請求時,就意味著有先后響應處理的順序問題,這個就由仲裁器也管理。仲裁器管理 DMA 通道請求分為兩個階段。第一階段屬于軟件階段,可以在DMA_CCRx 寄存器中設置,有 4 個等級:非常高、高、中和低四個優先級。第二階段屬于硬件階段,如果兩個或以上的 DMA 通道請求設置的優先級一樣,則他們優先級取決于通道編號,編號越低優先權越高,比如通道 0 高于通道 1。在大容量產品和互聯型產品中, DMA1 控制器擁有高于 DMA2 控制器的優先級。
DMA配置:
i.數據從哪來到哪去
我們知道 DMA 傳輸數據的方向有三個:從外設到存儲器,從存儲器到外設,從存儲器到存儲器。具體的方向 DMA_CCR 位 4 DIR 配置:0 表示從外設到存儲器,1 表示從存儲器到外設。這里面涉及到的外設地址由 DMA_CPAR 配置,存儲器地址由 DMA_CMAR 配置。
ii.數據傳輸的量
當我們配置好數據要從哪里來到哪里去之后,我們還需要知道我們要傳輸的數據是多少,數據的單位是什么。
在DMA傳輸中,要想數據傳輸正確,源和目標地址存儲的數據寬度還必須一致,外設的數據寬度由 DMA_CCR 的PSIZE[1:0]配置,可以是 8/16/32 位,存儲器的數據寬度由 DMA_CCR 的 MSIZE[1:0]配置,可以是 8/16/32 位。
在 DMA 控制器的控制下,數據要想有條不紊的從一個地方搬到另外一個地方,還必須正確設置兩邊數據指針的增量模式。外設的地址指針由 DMA_CCRx 的 PINC 配置,存儲器的地址指針由 MINC 配置。以串口向電腦發送數據為例,要發送的數據很多,每發送完一個,那么存儲器的地址指針就應該加 1,而串口數據寄存器只有一個,那么外設的地址指針就固定不變。具體的數據指針的增量模式由實際情況決定。
iii.數據什么時候傳輸完成
數據什么時候傳輸完成,我們可以通過查詢標志位或者通過中斷的方式來鑒別。每個DMA 通道在 DMA 傳輸過半、傳輸完成和傳輸錯誤時都會有相應的標志位,如果使能了該類型的中斷后,則會產生中斷。有關各個標志位的詳細描述請參考 DMA 中斷狀態寄存器DMA_ISR 的詳細描述。
傳輸完成還分兩種模式,是一次傳輸還是循環傳輸,一次傳輸很好理解,即是傳輸一次之后就停止,要想再傳輸的話,必須關斷 DMA 使能后再重新配置后才能繼續傳輸。循環傳輸則是一次傳輸完成之后又恢復第一次傳輸時的配置循環傳輸,不斷的重復。具體的由 DMA_CCR 寄存器的 CIRC 循環模式位控制。
ST標準外設庫中的初始化結構體
該結構體的成員變量用于指定數據從哪來到哪去,傳輸多大的量,以什么格式進行傳輸以及傳輸的優先權。