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