STM32之DMA原理
一、DMA簡(jiǎn)介
1、DMA簡(jiǎn)介
DMA(Direct Memory Access:直接內(nèi)存存取)是一種可以大大減輕CPU工作量的數(shù)據(jù)轉(zhuǎn)移方式。
CPU有轉(zhuǎn)移數(shù)據(jù)、計(jì)算、控制程序轉(zhuǎn)移等很多功能,但其實(shí)轉(zhuǎn)移數(shù)據(jù)(尤其是轉(zhuǎn)移大量數(shù)據(jù))是可以不需要CPU參與。比如希望外設(shè)A的數(shù)據(jù)拷貝到外設(shè)B,只要給兩種外設(shè)提供一條數(shù)據(jù)通路,再加上一些控制轉(zhuǎn)移的部件就可以完成數(shù)據(jù)的拷貝。
DMA就是基于以上設(shè)想設(shè)計(jì)的,它的作用就是解決大量數(shù)據(jù)轉(zhuǎn)移過(guò)度消耗CPU資源的問(wèn)題。有了DMA使CPU更專(zhuān)注于更加實(shí)用的操作--計(jì)算、控制等。
2、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è)
當(dāng)用戶(hù)將參數(shù)設(shè)置好,主要涉及源地址、目標(biāo)地址、傳輸數(shù)據(jù)量這三個(gè),DMA控制器就會(huì)啟動(dòng)數(shù)據(jù)傳輸,傳輸?shù)慕K點(diǎn)就是剩余傳輸數(shù)據(jù)量為0(循環(huán)傳輸不是這樣的)。換句話說(shuō)只要剩余傳輸數(shù)據(jù)量不是0,而且DMA是啟動(dòng)狀態(tài),那么就會(huì)發(fā)生數(shù)據(jù)傳輸?! ?/p>
3、DMA是否影響CPU的運(yùn)行
在X86架構(gòu)系統(tǒng)中,當(dāng)DMA運(yùn)作時(shí)(假設(shè)我們從磁盤(pán)拷貝一個(gè)文件到U盤(pán)),DMA實(shí)際上會(huì)占用系統(tǒng)總線周期中的一部分時(shí)間。也就是說(shuō),在DMA未開(kāi)啟前,系統(tǒng)總線可能完全被CPU使用;當(dāng)DMA開(kāi)啟后,系統(tǒng)總線要為DMA分配一定的時(shí)間,以保證DMA和CPU同時(shí)運(yùn)作。那么顯然,DMA會(huì)降低CPU的運(yùn)行速度。
在STM32控制器中,芯片采用Cortex-M3架構(gòu),總線結(jié)構(gòu)有了很大的優(yōu)化,DMA占用另外的總線,并不會(huì)與CPU的系統(tǒng)總線發(fā)生沖突。也就是說(shuō),DMA的使用不會(huì)影響CPU的運(yùn)行速度。
二、STM32的DMA結(jié)構(gòu)
1、DMA的主要特性
● 12個(gè) 獨(dú)立的可配置的通道(請(qǐng)求)DMA1有7個(gè)通道,DMA2 有5個(gè)通道?
● 每個(gè)通道都直接連接專(zhuān)用的硬件DMA請(qǐng)求,每個(gè)通道都同樣支持軟件觸發(fā)。這些功能通過(guò)
軟件來(lái)配置。?
● 在七個(gè)請(qǐng)求間的優(yōu)先權(quán)可以通過(guò)軟件編程設(shè)置(共有四級(jí):很高、高、中等和低),假如在相
等優(yōu)先權(quán)時(shí)由硬件決定(請(qǐng)求0優(yōu)先于請(qǐng)求1,依此類(lèi)推) 。?
● 獨(dú)立的源和目標(biāo)數(shù)據(jù)區(qū)的傳輸寬度(字節(jié)、半字、全字),模擬打包和拆包的過(guò)程。源和目標(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è)均可作為訪問(wèn)的源和目標(biāo)。?
● 可編程的數(shù)據(jù)傳輸數(shù)目:最大為65536
下面為功能框圖:
2、兩個(gè)DMA控制器結(jié)構(gòu)
① DMA1 controller
② DMA2 controller
3、DMA寄存器列表
① 中斷類(lèi)
DMA_ISR: DMA中斷狀態(tài)寄存器
DMA_IFCR: DMA中斷標(biāo)志位清除寄存器
說(shuō)明: DMA1、DMA2分別有一組寄存器。
② 控制傳輸類(lèi)
DMA_CCRx: DMA通道x配置寄存器
DMA_CNDTRx: DMA通道x數(shù)據(jù)數(shù)量寄存器
DMA_CPARx: ?DMA通道x外設(shè)地址寄存器
DMA_CMARx: DMA通道x內(nèi)存地址寄存器
說(shuō)明: ? ?
1> 每一個(gè)通道都有一組寄存器。
2> DMA_CPARx、DMA_CMARx是沒(méi)有差別的,它們都可以存放外設(shè)的地址、內(nèi)存的地址。DMA_CPARx、DMA_CMARx只不過(guò)起得名字有差別而已。
4、STM32的DMA工作特點(diǎn)
① DMA進(jìn)行數(shù)據(jù)傳輸?shù)谋匾獥l件
- 剩余傳輸數(shù)據(jù)量大于0
- DMA通道傳輸使能
- 通道上DMA數(shù)據(jù)傳輸有事件請(qǐng)求
?前兩者都好理解,對(duì)于第三點(diǎn)確實(shí)需要詳細(xì)的解釋,請(qǐng)看下邊的三條。
② 外設(shè)到XX方向的傳輸
假設(shè)是ADC到存儲(chǔ)器的數(shù)據(jù)傳輸,顯然ADC的DMA傳輸?shù)脑吹刂肥茿DC的數(shù)據(jù)寄存器。并不是說(shuō)只要DMA通道傳輸使能后,就立即進(jìn)行數(shù)據(jù)傳輸。只有當(dāng)一次ADC轉(zhuǎn)化完成,ADC的DMA通道的傳輸事件有效,DMA才會(huì)從ADC的數(shù)據(jù)寄存器讀出數(shù)據(jù),寫(xiě)入目的地址。當(dāng)DMA在讀取ADC的數(shù)據(jù)寄存器時(shí),同時(shí)使ADC的DMA通道傳輸事件無(wú)效。顯然,要等到下一次ADC轉(zhuǎn)換完成后,才能啟動(dòng)再一次的數(shù)據(jù)傳輸。
③存儲(chǔ)器對(duì)XX的DMA傳輸
因?yàn)閿?shù)據(jù)是準(zhǔn)備好的,不像ADC還需要等待數(shù)據(jù)到位。所以,不需要對(duì)應(yīng)通道的事件。只要使能DMA數(shù)據(jù)傳輸就一直傳輸,直到達(dá)到設(shè)定的傳輸量。
example:
1.內(nèi)存到內(nèi)存
DMA傳輸請(qǐng)求一直有效
2.內(nèi)存到串口?
DMA傳輸請(qǐng)求一直有效
一種解釋:
存儲(chǔ)器對(duì)存儲(chǔ)器的置位,就相當(dāng)于相應(yīng)通道的事件有效。?對(duì)應(yīng)通道的事件有效和存儲(chǔ)器對(duì)存儲(chǔ)器的置位,就是傳輸?shù)挠|發(fā)位。每次傳輸?shù)氖录梦灰淮?#xff0c;完成一次傳輸。如果是由外設(shè)引發(fā)的DMA傳輸,則傳輸完成后,相應(yīng)傳輸事件會(huì)置為無(wú)效,而存儲(chǔ)器對(duì)存儲(chǔ)器的傳輸,則一次傳輸完成后,相應(yīng)事件一直有效,直至完成設(shè)定的傳輸量。 ? 摘自:http://bbs.21ic.com/icview-400841-1-1.html
④外設(shè)以DMA方式工作時(shí),能否再以軟件方式進(jìn)行操作?
有一點(diǎn)是肯定的,當(dāng)外設(shè)以DMA方式正在數(shù)據(jù)傳輸時(shí),不可能再相應(yīng)CPU的軟件控制命令,否則這不符合邏輯。
但是,倘若外設(shè)僅僅配置成DMA工作方式,但是DMA請(qǐng)求并未產(chǎn)生,數(shù)據(jù)傳輸并沒(méi)有進(jìn)行。此時(shí),軟件控制命令仍然能夠?qū)ν庠O(shè)進(jìn)行控制。這是筆者在串口以DMA方式發(fā)送數(shù)據(jù)情形下,所得到的測(cè)試結(jié)論。?
總結(jié)
以上是生活随笔為你收集整理的STM32之DMA原理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: atheros有线网卡LINUX驱动,请
- 下一篇: CC2530通用I/O