電子產(chǎn)業(yè)一站式賦能平臺(tái)

PCB聯(lián)盟網(wǎng)

搜索
查看: 167|回復(fù): 0
收起左側(cè)

詳述單片機(jī)DMA工作原理

[復(fù)制鏈接]

418

主題

418

帖子

4293

積分

四級(jí)會(huì)員

Rank: 4

積分
4293
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2024-11-4 11:45:00 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
關(guān)注+星標(biāo)公眾號(hào),不錯(cuò)過精彩內(nèi)容來源 | 網(wǎng)絡(luò)
DMA,全稱Direct Memory Access,即直接存儲(chǔ)器訪問。
DMA傳輸將數(shù)據(jù)從一個(gè)地址空間復(fù)制到另一個(gè)地址空間,提供在外設(shè)和存儲(chǔ)器之間或者存儲(chǔ)器和存儲(chǔ)器之間的高速數(shù)據(jù)傳輸。
我們知道CPU有轉(zhuǎn)移數(shù)據(jù)、計(jì)算、控制程序轉(zhuǎn)移等很多功能,系統(tǒng)運(yùn)作的核心就是CPU,
CPU無時(shí)不刻的在處理著大量的事務(wù),但有些事情卻沒有那么重要,比方說數(shù)據(jù)的復(fù)制和存儲(chǔ)數(shù)據(jù),如果我們把這部分的CPU資源拿出來,讓CPU去處理其他的復(fù)雜計(jì)算事務(wù),是不是能夠更好的利用CPU的資源呢?
因此:轉(zhuǎn)移數(shù)據(jù)(尤其是轉(zhuǎn)移大量數(shù)據(jù))是可以不需要CPU參與。比如希望外設(shè)A的數(shù)據(jù)拷貝到外設(shè)B,只要給兩種外設(shè)提供一條數(shù)據(jù)通路,直接讓數(shù)據(jù)由A拷貝到B 不經(jīng)過CPU的處理

 DMA就是基于以上設(shè)想設(shè)計(jì)的,它的作用就是解決大量數(shù)據(jù)轉(zhuǎn)移過度消耗CPU資源的問題。有了DMA使CPU更專注于更加實(shí)用的操作–計(jì)算、控制等。
DMA定義:DMA用來提供在外設(shè)和存儲(chǔ)器之間或者存儲(chǔ)器和存儲(chǔ)器之間的高速數(shù)據(jù)傳輸。無須CPU的干預(yù),通過DMA數(shù)據(jù)可以快速地移動(dòng)。這就節(jié)省了CPU的資源來做其他操作。
DMA傳輸方式DMA的作用就是實(shí)現(xiàn)數(shù)據(jù)的直接傳輸,而去掉了傳統(tǒng)數(shù)據(jù)傳輸需要CPU寄存器參與的環(huán)節(jié),主要涉及四種情況的數(shù)據(jù)傳輸,但本質(zhì)上是一樣的,都是從內(nèi)存的某一區(qū)域傳輸?shù)絻?nèi)存的另一區(qū)域(外設(shè)的數(shù)據(jù)寄存器本質(zhì)上就是內(nèi)存的一個(gè)存儲(chǔ)單元)。四種情況的數(shù)據(jù)傳輸如下:
外設(shè)到內(nèi)存內(nèi)存到外設(shè)內(nèi)存到內(nèi)存外設(shè)到外設(shè)DMA傳輸參數(shù)我們知道,數(shù)據(jù)傳輸,首先需要的是1 數(shù)據(jù)的源地址 2 數(shù)據(jù)傳輸位置的目標(biāo)地址 ,3 傳遞數(shù)據(jù)多少的數(shù)據(jù)傳輸量 ,4 進(jìn)行多少次傳輸?shù)膫鬏斈J?/strong> DMA所需要的核心參數(shù),便是這四個(gè)
當(dāng)用戶將參數(shù)設(shè)置好,主要涉及源地址、目標(biāo)地址、傳輸數(shù)據(jù)量這三個(gè),DMA控制器就會(huì)啟動(dòng)數(shù)據(jù)傳輸,當(dāng)剩余傳輸數(shù)據(jù)量為0時(shí) 達(dá)到傳輸終點(diǎn),結(jié)束DMA傳輸 ,當(dāng)然,DMA 還有循環(huán)傳輸模式 當(dāng)?shù)竭_(dá)傳輸終點(diǎn)時(shí)會(huì)重新啟動(dòng)DMA傳輸! 
也就是說只要剩余傳輸數(shù)據(jù)量不是0,而且DMA是啟動(dòng)狀態(tài),那么就會(huì)發(fā)生數(shù)據(jù)傳輸。  

DMA的主要特征每個(gè)通道都直接連接專用的硬件DMA請(qǐng)求,每個(gè)通道都同樣支持軟件觸發(fā)。這些功能通過軟件來配置;
在同一個(gè)DMA模塊上,多個(gè)請(qǐng)求間的優(yōu)先權(quán)可以通過軟件編程設(shè)置(共有四級(jí):很高、高、中等和低),優(yōu)先權(quán)設(shè)置相等時(shí)由硬件決定(請(qǐng)求0優(yōu)先于請(qǐng)求1,依此類推);獨(dú)立數(shù)據(jù)源和目標(biāo)數(shù)據(jù)區(qū)的傳輸寬度(字節(jié)、半字、全字),模擬打包和拆包的過程。源和目標(biāo)地址必須按數(shù)據(jù)傳輸寬度對(duì)齊;支持循環(huán)的緩沖器管理;每個(gè)通道都有3個(gè)事件標(biāo)志(DMA半傳輸、DMA傳輸完成和DMA傳輸出錯(cuò)),這3個(gè)事件標(biāo)志邏輯或成為一個(gè)單獨(dú)的中斷請(qǐng)求;存儲(chǔ)器和存儲(chǔ)器間的傳輸、外設(shè)和存儲(chǔ)器、存儲(chǔ)器和外設(shè)之間的傳輸;閃存、SRAM、外設(shè)的SRAM、APB1、APB2和AHB外設(shè)均可作為訪問的源和目標(biāo);可編程的數(shù)據(jù)傳輸數(shù)目:最大為65535。STM32少個(gè)DMA資源?對(duì)于大容量的STM32芯片有2個(gè)DMA控制器 兩個(gè)DMA控制器,DMA1有7個(gè)通道,DMA2有5個(gè)通道。每個(gè)通道都可以配置一些外設(shè)的地址。
①DMA1 controller
從外設(shè)(TIMx[x=1、2、3、4]、ADC1、SPI1、SPI/I2S2、I2Cx[x=1、2]和USARTx[x=1、2、3])產(chǎn)生的7個(gè)DMA請(qǐng)求,通過邏輯或輸入到DMA1控制器 其中每個(gè)通道都對(duì)應(yīng)著具體的外設(shè):


② DMA2 controller
從外設(shè)(TIMx[5、6、7、8]、ADC3、SPI/I2S3、UART4、DAC通道1、2和SDIO)產(chǎn)生的5個(gè)請(qǐng)求,經(jīng)邏輯或輸入到DMA2控制器,其中每個(gè)通道都對(duì)應(yīng)著具體的外設(shè):


這些在下方系統(tǒng)框圖中也可以清晰地看到
DMA工作系統(tǒng)框圖

上方的框圖,我們可以看到STM32內(nèi)核,存儲(chǔ)器,外設(shè)及DMA的連接,這些硬件最終通過各種各樣的線連接到總線矩陣中,硬件結(jié)構(gòu)之間的數(shù)據(jù)轉(zhuǎn)移都經(jīng)過總線矩陣的協(xié)調(diào),使各個(gè)外設(shè)和諧的使用總線來傳輸數(shù)據(jù)。我們對(duì)他來進(jìn)行一點(diǎn)一點(diǎn)的分析:
下面看有與沒有DMA的情況下,ADC采集的數(shù)據(jù)是怎樣存放到SRAM中的?
沒有DMA
1.如果沒有DMA,CPU傳輸數(shù)據(jù)還要以內(nèi)核作為中轉(zhuǎn)站,比如要將ADC采集的數(shù)據(jù)轉(zhuǎn)移到到SRAM中,這個(gè)過程是這樣的:
內(nèi)核通過DCode經(jīng)過總線矩陣協(xié)調(diào),從獲取AHB存儲(chǔ)的外設(shè)ADC采集的數(shù)據(jù),
然后內(nèi)核再通過DCode經(jīng)過總線矩陣協(xié)調(diào)把數(shù)據(jù)存放到內(nèi)存SRAM中。

發(fā)表回復(fù)

本版積分規(guī)則


聯(lián)系客服 關(guān)注微信 下載APP 返回頂部 返回列表