|
一、理論理解部分。 1、直接存儲器存?。―MA)用來提供在外設(shè)和存儲器之間或者存儲器和存儲器之間的高速數(shù)據(jù)傳輸。 2、無須CPU干預(yù),數(shù)據(jù)可以通過DMA快速移動,這就節(jié)省了CPU的資源來做其他操作。 3、兩個DMA控制器有12個通道(DMA1有7個通道,DMA2有5個通道),每個通道專門用來管理來自一個或者多個外設(shè)對存儲器訪問的請求。 4、還有一個沖裁器協(xié)調(diào)各個DMA請求的優(yōu)先權(quán)。在同一個DMA模塊上,多個請求間的優(yōu)先權(quán)可以通過軟件編程設(shè)置(共有四級:很高、高、中和低),優(yōu)先權(quán)設(shè)置相等時由硬件決定(請求0優(yōu)先請求1,) 5、每個通道都有三個事件標(biāo)志(DMA半傳輸、DMA傳輸完成和DMA傳輸出錯),這三個事件標(biāo)志邏輯或成為一個單獨(dú)的中斷請求。 6、閃存、SRAM、外設(shè)的SRAM、APB1、APB2和AHB外設(shè)均可作為訪問的源和目標(biāo)。 7、可編程的數(shù)據(jù)傳輸數(shù)目:最大為65535 8、如果外設(shè)要想通過DMA 來傳輸數(shù)據(jù),必須先給DMA 控制器發(fā)送DMA 請求,DMA 收到請求信號之后,控制器會給外設(shè)一個應(yīng)答信號,當(dāng)外設(shè)應(yīng)答后且DMA 控制器收到應(yīng)答信號之后,就會啟動DMA 的傳輸,直到傳輸完畢。DMA 有DMA1 和DMA2 兩個控制器,DMA1 有7 個通道,DMA2有5 個通道,不同的DMA 控制器的通道對應(yīng)著不同的外設(shè)請求,這決定了我們在軟件編程上該怎么設(shè)置,具體見DMA 請求映像表。
9、 仲裁器當(dāng)發(fā)生多個DMA 通道請求時,就意味著有先后響應(yīng)處理的順序問題,這個就由仲裁器也管理。仲裁器管理DMA 通道請求分為兩個階段。第一階段屬于軟件階段,可以在DMA_CCRx 寄存器中設(shè)置,有4 個等級:非常高、高、中和低四個優(yōu)先級。第二階段屬于硬件階段,如果兩個或以上的DMA通道請求設(shè)置的優(yōu)先級一樣,則他們優(yōu)先級取決于通道編號,編號越低優(yōu)先權(quán)越高,比如通道0 高于通道1。 (為了解決多個DMA請求時,就有先后順序,有一個仲裁器管理,分為兩部分:1、軟件處理,可以設(shè)置非常高、高、中、和低四個優(yōu)先級,2、優(yōu)先級一樣,則看他們的編號,編號越低優(yōu)先權(quán)越高)
DMA數(shù)據(jù)配置的詳細(xì)解說: 使用DMA,最核心就是配置要傳輸?shù)臄?shù)據(jù),包括數(shù)據(jù)從哪里來,要到哪里去,傳輸?shù)臄?shù)據(jù)的單位 這里面涉及到的外設(shè)地址由DMA_CPAR 配置,存儲器地址由DMA_CMAR 配置。
要傳多少,單位是什么
二、編程要用的成員:
1、DMA_DIR : 傳輸方向選擇, 可選外設(shè)到存儲器、存儲器到外設(shè)。它設(shè)定DMA_CCR 寄存器的DIR[1:0]位的值。這里并沒有存儲器到存儲器的方向選擇, 當(dāng)使用存儲器到存儲器時,只需要把其中一個存儲器當(dāng)作外設(shè)使用即可。 (DMA_DIR_PeripheralDST:外設(shè)作為數(shù)據(jù)傳輸?shù)哪康牡? DMA_DIR_PeripheralSRC:外設(shè)作為數(shù)據(jù)傳輸?shù)膩碓矗?/span> 2、DMA_PeripheralInc: DMA_MemoryInc= //內(nèi)存地址寄存器遞增與否 如果配置DMA_PeripheralInc_Enable,使能外設(shè)地址自動遞增功能,它設(shè)定DMA_CCR 寄存器的PINC 位的值;一般外設(shè)都是只有一個數(shù)據(jù)寄存器,所以一般不會使能該位。(自動遞增的意思就是:相當(dāng)路邊的自動出售飲料機(jī)器一樣,當(dāng)你買了一瓶汽水,拿出來了,然后后面有自動補(bǔ)上去,這就是自動遞增,這里的數(shù)據(jù)也是一樣,始終拿第一個數(shù)據(jù),其他的會自動遞增上來,不好意思,由于理解錯誤,現(xiàn)在做一下修改:是拿水瓶的手是) 3、DMA_BufferSize= //設(shè)定待傳輸數(shù)目 4、DMA_M2M= //使能DMA通道的內(nèi)存到內(nèi)存?zhèn)鬏?br>5、DMA_MemoryBaseAddr= //存儲器地址
|
|
|