MCU微課堂
第五十二期 2025.02.18
DMA簡介
直接存儲器存取(DMA)用來提供在外設和存儲器之間或者存儲器和存儲器之間的高速數據傳輸。無須CPU干預,數據可以通過DMA快速地移動,這就節省了CPU的資源來做其他操作。兩個DMA控制器有12個通道(DMA1有7個通道,DMA2有5個通道),每個通道專門用來管理來自于一個或多個外設對存儲器訪問的請求。還有一個仲裁器來協調各個DMA請求的優先權。
DMA主要特性
12個獨立的可配置的通道(請求):DMA1有7個通道,DMA2有5個通道;
每個通道都直接連接專用的硬件DMA請求,每個通道都同樣支持軟件觸發。這些功能通過軟件來配置;
在同一個DMA模塊上,多個請求間的優先權可以通過軟件編程設置(共有四級:很高、高、中等和低),優先權設置相等時由硬件決定(請求0優先于請求1,依此類推);
獨立數據源和目標數據區的傳輸寬度(字節、半字、全字),模擬打包和拆包的過程。源和目標地址必須按數據傳輸寬度對齊;
支持循環的緩沖器管理;
每個通道都有3個事件標志(DMA半傳輸、DMA傳輸完成和DMA傳輸出錯),這3個事件標志邏輯或成為一個單獨的中斷請求;
存儲器和存儲器間的傳輸;
外設和存儲器、存儲器和外設之間的傳輸;
閃存、SRAM、外設的SRAM、APB1、APB2和AHB外設均可作為訪問的源和目標;
可編程的數據傳輸數目:最大為65535。
DMA通道
每個通道都可以在有固定地址的外設寄存器和存儲器地址之間執行DMA傳輸。DMA傳輸的數據量是可編程的,最大達到65535。包含要傳輸的數據項數量的寄存器,在每次傳輸后遞減。
1、可編程的數據量
外設和存儲器的傳輸數據量可以通過DMA_CCRx寄存器中的PSIZE和MSIZE位編程。
2、指針增量
通過設置DMA_CCRx寄存器中的PINC和MINC標志位,外設和存儲器的指針在每次傳輸后可以有選擇地完成自動增量。當設置為增量模式時,下一個要傳輸的地址將是前一個地址加上增量值,增量值取決與所選的數據寬度為1、2或4。第一個傳輸的地址是存放在DMA_CPARx/DMA_CMARx寄存器中地址。在傳輸過程中,這些寄存器保持它們初始的數值,軟件不能改變和讀出當前正在傳輸的地址(它在內部的當前外設/存儲器地址寄存器中)。
當通道配置為非循環模式時,傳輸結束后(即傳輸計數變為0)將不再產生DMA操作。要開始新的DMA傳輸,需要在關閉DMA通道的情況下,在DMA_CNDTRx寄存器中重新寫入傳輸數目。
在循環模式下,最后一次傳輸結束時,DMA_CNDTRx寄存器的內容會自動地被重新加載為其初始數值,內部的當前外設/存儲器地址寄存器也被重新加載為DMA_CPARx/DMA_CMARx寄存器設定的初始基地址。
3、通道配置過程
下面是配置DMA通道x的過程(x代表通道號):
在DMA_CPARx寄存器中設置外設寄存器的地址。發生外設數據傳輸請求時,這個地址將是數據傳輸的源或目標。
在DMA_CMARx寄存器中設置數據存儲器的地址。發生外設數據傳輸請求時,傳輸的數據將從這個地址讀出或寫入這個地址。
在DMA_CNDTRx寄存器中設置要傳輸的數據量。在每個數據傳輸后,這個數值遞減。
在DMA_CCRx寄存器的PL[1:0]位中設置通道的優先級。
在DMA_CCRx寄存器中設置數據傳輸的方向、循環模式、外設和存儲器的增量模式、外設和存儲器的數據寬度、傳輸一半產生中斷或傳輸完成產生中斷。
設置DMA_CCRx寄存器的ENABLE位,啟動該通道。
一旦啟動了DMA通道,它既可響應連到該通道上的外設的DMA請求。當傳輸一半的數據后,半傳輸標志(HTIF)被置1,當設置了允許半傳輸中斷位(HTIE)時,將產生一個中斷請求。在數據傳輸結束后,傳輸完成標志(TCIF)被置1,當設置了允許傳輸完成中斷位(TCIE)時,將產生一個中斷請求。
4、循環模式
循環模式用于處理循環緩沖區和連續的數據傳輸(如ADC的掃描模式)。在DMA_CCRx寄存器中的CIRC位用于開啟這一功能。當啟動了循環模式,數據傳輸的數目變為0時,將會自動地被恢復成配置通道時設置的初值,DMA操作將會繼續進行。
5、存儲器到存儲器模式
DMA通道的操作可以在沒有外設請求的情況下進行,這種操作就是存儲器到存儲器模式。當設置了DMA_CCRx寄存器中的MEM2MEM位之后,在軟件設置了DMA_CCRx寄存器中的EN位啟動DMA通道時,DMA傳輸將馬上開始。當DMA_CNDTRx寄存器變為0時,DMA傳輸結束。存儲器到存儲器模式不能與循環模式同時使用。
中斷
每個DMA通道都可以在DMA傳輸過半、傳輸完成和傳輸錯誤時產生中斷。為應用的靈活性考慮,通過設置寄存器的不同位來打開這些中斷。
表1 DMA中斷請求
DMA請求映射
DMA1控制器
從外設(TIMx[x=1、2、3、4]、ADC1、SPI1、SPI/I2S2、I2Cx[x=1、2]和USARTx[x=1、2、3])產生的7個請求,通過邏輯或輸入到DMA控制器,這意味著同時只能有一個請求有效。參見表2各個通道的DMA1請求一覽。
表1 DMA中斷請求
DMA2控制器
從外設(TIMx[5、6、7、8]、ADC3、SPI/I2S3、UART4、USART6、DAC通道1、2和SDIO)產生的5個請求,經邏輯或輸入到DMA2控制器,這意味著同時只能有一個請求有效。參見表3的各個通道的DMA2請求一覽。外設的DMA請求,可以通過設置相應外設寄存器中的DMA控制位,被獨立地開啟或關閉。
表3 各個通道的DMA2請求一覽
-
控制器
+關注
關注
113文章
16505瀏覽量
179925 -
存儲器
+關注
關注
38文章
7538瀏覽量
164528 -
緩沖器
+關注
關注
6文章
1999瀏覽量
45736 -
dma
+關注
關注
3文章
568瀏覽量
101187
原文標題:MCU微課堂|CKS32F107xx DMA
文章出處:【微信號:中科芯MCU,微信公眾號:中科芯MCU】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
使用STM32F101xx和STM32F103xx DMA控制器
CKS32F4xx系列FSMC功能簡介

CKS32F107xx系列MCU中ADC介紹
CKS32F107xx系列MCU的GPIO內部硬件結構和工作模式

評論