新四季網

stm32的dma工作原理(自學STM32-08)

2023-09-16 12:05:21

作者:junziyang

(註:如非特別聲明,以下筆記內容均針對stm32f103ZET6而言。不同型號,細節可能存在差別)

8.1 DMA簡介

DMA是Direct memory access的簡稱,意為直接存儲器訪問,是一種提高數據傳輸速度,並在數據傳輸過程中為CPU減負的技術。常規的數據傳輸過程中,CPU要先將數據從存儲器或外設的數據寄存器讀取到緩存,然後再寫入到目的地(存儲器或外設數據寄存器)。DMA傳輸數據時則無需經CPU處理,而是直接將數據從一個地址複製到另一個地址,因此數據傳輸過程中極大地減少了對CPU資源的佔用。

8.2 DMA的原理框圖

stm32內置有兩個DMA控制器,原理框圖如圖1所示。

圖1. DMA原理框圖

從圖中可以看出,DMA1有7個通道,DMA2有5個通道,共有12個通道。DMA充當的是外設和存儲器(內部SRAM,SD卡,FSMC接口的外部存儲器)之間的橋梁,由外設發起DMA請求,實現數據在DMA控制下在外設和存儲器,以及存儲器和存儲器之間傳輸。每個DMA通道都可以獨立響應一到多個外設訪問請求,由DMA內部的仲裁器(Arbiter)來管理DMA請求的優先級。DMA的主要特徵包括:

每個通道都與專門的硬體DMA請求關聯,支持軟體觸發和配置。向同一個DMA各通道發出的多個請求,可由軟體配置優先級。共支持4級:低、中、高、最高。優先級相同時,由硬體來管理,低編號通道的請求優先。傳輸數據寬度可以為字節、半字或字。源和目標雙方的數據寬度可以獨立設置,傳輸過程類似於打包(源)和解包(目標)。源和目標地址必須按數據寬度對齊。支持緩存區循環使用。支持傳輸過半、傳輸完成、傳輸錯誤3個事件即相關的中斷。這3個事件的標誌位可以通過或操作,合成一個全局中斷,即發生其中任何一個事件都會觸發的中斷。支持3種模式:外設到存儲器、存儲器到外設,以及存儲器到存儲器的DMA傳輸。Flash、SRAM,APB1和APB2以及AHB的外設均可作為源或目標。可編程設置數據傳輸個數,範圍:0-65535。8.3 DMA主要寄存器

任何外設的功能配置都是通過設置相關寄存器實現的。為了便於後續學習,將DMA相關的寄存器先列於此。DMA相關寄存器地址映射與復位值如圖2所示。

圖2. DMA相關寄存器地址映射與復位值表

前兩個寄存器是DMA各個通道共用的寄存器,DMA_ISR(Interrupt Status Register)管理各個通道的中斷狀態標誌,每個通道都有4個中斷。DMA_IFCR(Interrupt Flag Clear Register)用來復位DMA_ISR的對應位。

後面的4個寄存器是各個通道專用的寄存器,也就是說每個通道都有4個這樣的寄存器。DMA_CMAx後,地址偏移4個字節,然後排入下一個通道的4個寄存器,依次類推。

8.4 DMA主要功能及設置

DMA控制器是通過與內核共享總線來實現直接存儲器訪問的。總線矩陣通過輪詢調度來管理CPU和DMA對總線的訪問,一般會保證CPU對總線有至少一半的佔用帶寬。儘管如此,當出現CPU和DMA同時要訪問同一個目標(存儲器或外設)時,仍存在CPU對總線的訪問被DMA請求妨礙幾個總線時鐘周期的可能。因此,程序中執行完DMA相關的指令後(例如HAL_ADC_START_DMA),一般要適當延遲,然後再去讀取DMA傳輸過去的數據,否則可能會出現數據讀取錯誤的現象。

DMA的最大優點是可以獨立於CPU去實現數據的傳輸,最好將DMA傳輸數據的過程和CPU對數據的處理過程分開。例如,ADC掃描模式下必須使用DMA,此時可將數據採集和數據處理分開,在一個循環中進行AD轉換,DMA將數據存入數組;在另一個循環中再去訪問數組中的數據並進行處理。而不是在一個循環中,觸發ADC一次,立即去讀數組中的數據,這樣容易導致程序「跑飛」。

8.3.1 DMA傳輸過程

觸發DMA的某個事件發生後,先由外設向DMA控制器發送請求信號。DMA控制器會按信道的優先級響應收到的請求。當DMA控制器訪問外設時,會向外設發出應答信號。外設收到應答信號後立刻釋放請求,進而DMA控制器立刻釋放應答,並開始傳輸數據。如果有更多的請求,外設可以啟動下一次傳輸。簡而言之,一次DMA傳輸包括一下三個操作步驟:

從源地址載入數據:源可以是外設的數據寄存器或存儲器。外設寄存器和存儲器的基地址分別在DMA_CPARx (Channelx Peripheral Address Register)寄存器或DMA_CMARx(Channelx Memory Address Register)寄存器中設置。向目標地址存儲數據:目標同樣可以是外設的數據寄存器或存儲器。首地址也是在上述兩個寄存器中設置。計數遞減:DMA_CNDTRx寄存器中設置的是待傳輸數據個數,每次傳輸完成,數值遞減1。也就是說,傳輸數據個數是提前設置的,數據傳輸期間通過讀此寄存器可以判斷傳輸進度。8.3.2 仲裁器

仲裁器Arbiter根據通道DMA請求的優先級設置,來依次啟動對外設/存儲器的訪問。優先權的管理分兩個階段:

軟體設置:通過DMA_CCRx寄存器的PL[1:0]位,可以為通道x設置優先級。2個寄存器位可以設置4級(低、中、高、最高),從00-11,值越大優先級越高。硬體仲裁:軟體設置優先級高的有效。如果軟體設置的優先級相同,則低編號通道優先,這由硬體來仲裁。例如,若同時收到來自通道2和通道4優先級相同的請求,則通道2的請求優先。

上述是同一個DMA內部通道的優先級管理,由各自的仲裁器負責。另外,在有兩個DMA的MCU中,在經Bus Matrix爭取總線使用權的過程中,DMA1控制器的優先級高於DMA2的。

8.3.3 DMA的通道管理

用DMA來傳輸數據時,需要約定通道兩端的地址、傳輸數據的寬度(字節/半字/全字)、待傳輸數據個數、數據傳輸模式、緩存使用方式等。

1. 通道設置步驟

通道配置的步驟如下:(x是通道編號)

設置外設的地址:DMA_CPARx寄存器。外設的地址一般是固定的,即外設DR寄存器的地址。設置存儲器地址:DMA_CMARx寄存器。一般是程序中一個數組的首地址。設置待傳輸數據個數:DMA_CNDTRx寄存器。每次傳輸後該數值會遞減1。設置通道優先級:DMA_CCRx寄存器的PL[1:0]位。通道參數設置:在DMA_CCRx寄存器中設置 - 傳輸方向(DIR位)、循環模式(CIRC位)、外設&存儲器遞增模式(PINC&MINC位)、外設&存儲器數據寬度(PSIZE[1:0]&MSIZE[1:0]位),並按需使能中斷(TCIE/HTIE/TEIE)。激活DMA通道:DMA_CCRx的EN位。

DMA通道激活後即可響應來自外設的DMA請求了。

2. 循環模式

設置DMA_CCRx寄存器中的CIRC位為1可以開啟循環模式。循環模式主要用來處理連續的數據流,例如ADC掃描模式中的連續數據採集。該模式下DMA_CNDTRx寄存器中的值遞減到0後,會重新裝載回初值,緩存也會被循環利用。

3. 存儲器-存儲器模式

除了實現外設-存儲器間的數據傳輸,DMA模式也可以用來在兩個存儲器間傳輸數據。通過設置DMA_CRx寄存器中的MEM2MEM位即可開啟存儲器-存儲器模式。無論是外設-存儲器模式,還是存儲器-存儲器模式,本質上來說DMA都只是將數據從一個地址搬運到另一個地址。區別之處在於:外設地址通常是固定的,而存儲器地址可以人為設置且可遞增;外設可以發出DMA請求,而存儲器間的數據傳輸需要通過軟體設置DMA_CCRx寄存器的EN位來觸發DMA。通信雙方的首地址仍然是在CPARx和CMARx兩個寄存器中設置,傳輸方向也是由CCRx寄存器中的DIR位設定。

存儲器間的數據傳輸不要同時開啟循環模式。DMA_CNDTRx寄存器遞減到0,傳輸自動停止。

8.3.4 數據寬度與對齊問題

DMA支持按字節、半字或全字傳輸數據。如果雙方的數據寬度相同,DMA只需將數據依次傳輸過去即可。但如果源和目標端的數據寬度不同,即PSIZE和MSIZE不相等,就涉及到傳輸過程中的數據對齊問題。

如果目標端數據寬度比源端大,則目標端接收數據後按右對齊存儲,閒置高位補0。例如,源為8位,目標為32位,傳輸4個數據,傳輸過程和結果如下:

如果目標端數據寬度比源端小,則源端高位被截掉,僅傳輸目標端能容納的低位。例如,源為32位,目標為16位,傳輸4個數據,傳輸過程和結果如下:

可見,無論哪種情況,DMA都是按源端的數據寬度讀取數據,然後按目標端的數據寬度按右對齊寫入數據的。目標端按自己的數據寬度和傳輸數據個數分配內存,傳輸過來的數據「多去少補,對號入座」。如果條件允許,儘量雙方一致,尤其要避免「大筐倒小筐」。

注意:

對於不支持字節和半字寫入的AHB外設,傳入的字節或半字會從低位到高位重複填滿總線數據寄存器HWDATA。例如0xAB在會被重複成0xABABABAB。這種情況下,如果從內存向寄存器寫入數據,內存端MSIZE應該按存儲器數據寬度設置,而外設端PSIZE則設為32bit。例如向APB備份寄存器(16位有效,但佔32位地址)寫入,MSIZE配置位16位,PSIZE配置位32位。

8.3.5 錯誤與中斷管理

在DMA讀/寫預設地址的過程中,如果出現錯誤,硬體會自動關閉出錯的通道,清除DMA_CCRx中的EN位,設置DMA_IFR中的TEIF(Transfer Error Interrupt Flag)中斷標誌位。如果開啟了CCRx中的TEIE位,則會產生中斷。

DMA傳輸過程中會設置3個中斷標誌位:傳輸過半(HTIF)、傳輸完成(TCIF)、傳輸出錯(TEIF)。如果設置了中斷使能位(TCIE/HTIE/TEIE),則會產生對應的中斷。

8.3.6 DMA請求的通道映射

來自外設的DMA請求共有7類:TIMx[1,2,3,4], ADC1, SPI1, SPI/I2S2, I2Cx[1,2] 以及

USARTx[1,2,3]。這些請求被固定的映射到了DMA1的7個通道和DMA2的5個通道。DMA1的映射關係如圖3所示。DMA2的映射關係如圖4所示。

圖3. DMA1的通道映射

圖4. DMA2的通道映射

總結:

同一通道不同外設的DMA請求在進入DMA前是「或」的關係,即每次只能有1個外設可以佔用該通道。通道編號越低,硬體優先級越高。每個通道都支持軟體觸發的MEM2MEM模式。外設請求與通道的關係是固定的,不可通過編程改變。8.4 DMA寄存器

DMA的寄存器非常簡單,如圖2所示。有2個公用寄存器:DMA_ISR和DMA_IFCR。每個通道還有4個專用寄存器:DMA_CCRx/CNDTRx/CPARx/CMARx。

8.4.1 DMA_ISR中斷狀態寄存器

DMA_ISR(Interrupt Status Register)用來管理DMA的中斷狀態。由硬體設置,軟體清除(設置IFCR寄存器的對應位)。每個通道的4個中斷佔連續的4個位。從低到高依次為GIFx(全局中斷標誌)、TCIFx(傳輸完成中斷標誌)、HTIFx(傳輸過半中斷標誌)、TEIFx(傳輸錯誤中斷標誌)。每個通道實際只有3個中斷,其中GIFx是其餘3個標誌位相「與」的結果,三者中任何一種中斷事件發生,該位都會被置1。

8.4.2 DMA_IFCR中斷狀態清除寄存器

DMA_IFCR(Interrupt Flag Clear Register)用來清除ISR寄存器中的對應位,清除中斷狀態。ISR是只讀的,中斷發生時由硬體設置,要清除中斷標誌位,需要向DMA_IFCR寄存器的對應位寫入1(寫0無影響)。另外,向CGIFx寫入1可以清除通道x所有的中斷標誌位

8.4.3 DMA_CCRx通道配置寄存器

DMA_CCR(Channel x Configuration Register)用來配置通道x。各功能位作用如下:

MEM2MEM[14] 1-使能存儲器-存儲器模式;0-關閉。PL[13:12] 通道優先級設置。00-11,共4級,數值越大優先級越高。MSIZE[11:10] 存儲器端數據寬度。00-8bits;01-16bits;10-32bits;11-保留。PSIZE[9:8] 外設端數據寬度,配位邏輯同MSIZE。MINC[7] 1-開啟內存端地址遞增;0-關閉。PINC[6] 1-開啟外設端地址遞增;0-關閉。CIRC[5] 循環模式。1-開啟循環模式;0-關閉;DIR[4] 數據傳輸方向。1-內存到外設;0-外設到內存。TEIE[3] 1-使能傳輸錯誤中斷;0-關閉。HTIE[2] 1-使能傳輸過半中斷;0-關閉。TCIE[1] 1-使能傳輸完成中斷;0-關閉。EN[0] 1-使能通道;0-關閉。8.4.4 DMA_CNDTRx數據個數寄存器

DMA_CNDTRx(Channel x Number of Data Register)用來存儲待傳輸數據個數。每次傳輸數值遞減1。非循環模式下,遞減到0時DMA請求結束;循環模式下,遞減凋0後會自動加載初值,繼續DMA傳輸。

8.4.5 DMA_CPARx外設地址寄存器

DMA_CPARx(Channel x Peripheral Address Register)用來設置外設基地址。當PSIZE=01,即數據寬度為16位時,地址中的PA[0]位被忽略,數據自動對齊到半字地址;當PSIZE=10,即數據寬度為32位時,地址中的PA[1:0]位被忽略,數據自動對齊到字地址。

說明:

半字為16bits,即2個字節。字節是最小的存儲單位,即每個地址存1個字節。地址0b000x-0b001x,間隔2個字節,恰為1個半字的空間。同理,0b01xx-0b02xx,間隔4個字節,即一個全字的空間,所以32位時忽略地址的末2位。

8.4.6 DMA_CMARx內存地址寄存器

DMA_CMARx(Channel x Memory Address Register)用來設置存儲器(數組)基地址。DMA_CPARx和CMARx實際上就是兩個地址存儲器,用來存儲源和目標的地址。MEM2MEM時存儲的都是存儲器中的地址。

8.5 HAL庫DMA相關的函數

HAL庫stm32f103xe.h中對DMA的通道地址進行了映射,可以通過通道宏名稱,訪問通道的CCR/CNDTR/CPAR/CMAR寄存器。DMA相關的庫函數在stm32f1xx_hal_dma.h中聲明,在stm32f1xx_hal_dma.c中定義。分類概述如下:

1. 初始化與復位函數

HAL_DMA_Init

DMA初始化函數。設置CCR寄存器中的PL/MSIZE/PSIZE/MINC/PINC/CIRC/DIR,共7個功能位。

HAL_DMA_DeInit

DMA復位函數。關閉DMA,然後清除CCR&CNDTR&CPAR&CMAR,清除hdma句柄中的中斷函數,復位State狀態機和ErrorCode。

2. 啟動與停止函數

HAL_DMA_Start

啟動DMA。函數中完成的工作包括:中斷標誌位清除、設置CNDTR、CPAR、CMAR。設置這些參數前必須先將CCRx的EN位置0(__HAL_DMA_DISABLE(hdma)),然後調用DMA_SetConfig函數進行設置,設置完成後重新開啟(__HAL_DMA_ENABLE(hdma))。

HAL_DMA_Start_IT

以中斷模式啟動DMA。除完成HAL_DMA_Start的工作外,還開啟了3個中斷使能位。

HAL_DMA_Abort

終止DMA傳輸。函數中完成的工作包括:關閉中斷、關閉DMA通道、中斷標誌位清除(向IFCR中的CGIFx寫入1)。

HAL_DMA_Abort_IT

終止DMA傳輸並觸發相應的中斷。

3. 狀態查詢函數

HAL_DMA_PollForTransfer

檢查傳輸狀態。通過輪詢等待返回傳輸狀態(傳輸過半/傳輸完成)標誌。

HAL_DMA_GetState

查詢DMA狀態。返回DMA狀態機的值,即hdma->State。

HAL_DMA_GetError

查詢DMA錯誤。返回DMA錯誤代碼,即hdma->ErrorCode。

4. 中斷處理函數

HAL_DMA_IRQHandler

中斷請求處理函數。根據hdma的中斷設置,調用相應的回調函數(傳輸完成/過半/出錯/終止)。回調函數需要用戶自己編寫,一般是在外設的HAL_PPP_Stat_DMA函數中被關聯到hdma的句柄。例如,HAL_ADC_Start_DMA中會把HAL_ADC_ConvHalfCpltCallback/HAL_ADC_ConvCpltCallback/HAL_ADC_ErrorCallback函數關聯到DMA的句柄hdma。回調函數是weak函數,需要用戶自己實現。

5. 宏庫函數

__HAL_DMA_ENABLE 使能DMA(CCR->EN)__HAL_DMA_ENABLE_IT 使能指定中斷(CCR->*IE)__HAL_DMA_DISABLE 關閉DMA__HAL_DMA_DISABLE_IT 關閉指定中斷__HAL_DMA_GET_IT_SOURCE 查詢中斷源__HAL_DMA_GET_COUNTER 查詢計數寄存器CNDTRx,
同类文章
葬禮的夢想

葬禮的夢想

夢見葬禮,我得到了這個夢想,五個要素的五個要素,水火只好,主要名字在外面,職業生涯良好,一切都應該對待他人治療誠意,由於小,吉利的冬天夢想,秋天的夢是不吉利的
找到手機是什麼意思?

找到手機是什麼意思?

找到手機是什麼意思?五次選舉的五個要素是兩名士兵的跡象。與他溝通很好。這是非常財富,它擅長運作,職業是仙人的標誌。單身男人有這個夢想,主要生活可以有人幫忙
我不怎麼想?

我不怎麼想?

我做了什麼意味著看到米飯烹飪?我得到了這個夢想,五線的主要土壤,但是Tu Ke水是錢的跡象,職業生涯更加真誠。他真誠地誠實。這是豐富的,這是夏瑞的巨星
夢想你的意思是什麼?

夢想你的意思是什麼?

你是什​​麼意思夢想的夢想?夢想,主要木材的五個要素,水的跡象,主營業務,主營業務,案子應該抓住魅力,不能疏忽,春天夢想的吉利夢想夏天的夢想不幸。詢問學者夢想
拯救夢想

拯救夢想

拯救夢想什麼意思?你夢想著拯救人嗎?拯救人們的夢想有一個現實,也有夢想的主觀想像力,請參閱週宮官方網站拯救人民夢想的詳細解釋。夢想著敵人被拯救出來
2022愛方向和生日是在[質量個性]中

2022愛方向和生日是在[質量個性]中

[救生員]有人說,在出生88天之前,胎兒已經知道哪天的出生,如何有優質的個性,將走在什麼樣的愛情之旅,將與生活生活有什么生活。今天
夢想切割剪裁

夢想切割剪裁

夢想切割剪裁什麼意思?你夢想切你的手是好的嗎?夢想切割手工切割手有一個真正的影響和反應,也有夢想的主觀想像力。請參閱官方網站夢想的細節,以削減手
夢想著親人死了

夢想著親人死了

夢想著親人死了什麼意思?你夢想夢想你的親人死嗎?夢想有一個現實的影響和反應,還有夢想的主觀想像力,請參閱夢想世界夢想死亡的親屬的詳細解釋
夢想搶劫

夢想搶劫

夢想搶劫什麼意思?你夢想搶劫嗎?夢想著搶劫有一個現實的影響和反應,也有夢想的主觀想像力,請參閱週恭吉夢官方網站的詳細解釋。夢想搶劫
夢想缺乏缺乏紊亂

夢想缺乏缺乏紊亂

夢想缺乏缺乏紊亂什麼意思?你夢想缺乏異常藥物嗎?夢想缺乏現實世界的影響和現實,還有夢想的主觀想像,請看官方網站的夢想組織缺乏異常藥物。我覺得有些東西缺失了