當前位置:首頁 > 公眾號精選 > 玩轉嵌入式
[導讀]DMA簡介 DMA(Direct Memory Access:直接內存存取)是一種可以大大減輕CPU工作量的數(shù)據(jù)轉移方式。

一、DMA簡介

1、DMA簡介
DMA(Direct Memory Access:直接內存存取)是一種可以大大減輕CPU工作量的數(shù)據(jù)轉移方式。
CPU有轉移數(shù)據(jù)、計算、控制程序轉移等很多功能,但其實轉移數(shù)據(jù)(尤其是轉移大量數(shù)據(jù))是 可以不需要CPU參與 。比如希望外設A的數(shù)據(jù)拷貝到外設B,只要給兩種外設提供一條數(shù)據(jù)通路,再加上一些控制轉移的部件就可以完成數(shù)據(jù)的拷貝。 DMA就是基于以上設想設計的,它的作用就是解決大量數(shù)據(jù)轉移過度消耗CPU資源的問題。有了DMA使CPU更專注于更加實用的操作--計算、控制等。

2、DMA的工作原理 DMA的作用就是實現(xiàn)數(shù)據(jù)的直接傳輸,而去掉了傳統(tǒng)數(shù)據(jù)傳輸需要CPU寄存器參與的環(huán)節(jié) ,主要涉及四種情況的數(shù)據(jù)傳輸,但本質上是一樣的,都是從內存的某一區(qū)域傳輸?shù)絻却娴牧硪粎^(qū)域(外設的數(shù)據(jù)寄存器本質上就是內存的一個存儲單元)。四種情況的數(shù)據(jù)傳輸如下:

  • 外設到內存
  • 內存到外設
  • 內存到內存
  • 外設到外設 當用戶將參數(shù)設置好,主要涉及 源地址 、 目標地址 、 傳輸數(shù)據(jù)量 這三個,DMA控制器就會啟動數(shù)據(jù)傳輸,傳輸?shù)慕K點就是剩余傳輸數(shù)據(jù)量為0(循環(huán)傳輸不是這樣的)。換句話說只要剩余傳輸數(shù)據(jù)量不是0,而且DMA是啟動狀態(tài),那么就會發(fā)生數(shù)據(jù)傳輸。


3、DMA是否影響CPU的運行
在X86架構系統(tǒng)中,當DMA運作時(假設我們從磁盤拷貝一個文件到U盤),DMA實際上會占用系統(tǒng)總線周期中的一部分時間。也就是說,在DMA未開啟前,系統(tǒng)總線可能完全被CPU使用;當DMA開啟后,系統(tǒng)總線要為DMA分配一定的時間,以保證DMA和CPU同時運作。那么顯然,DMA會降低CPU的運行速度。
在STM32控制器中,芯片采用Cortex-M3架構,總線結構有了很大的優(yōu)化,DMA占用另外的總線,并不會與CPU的系統(tǒng)總線發(fā)生沖突。也就是說,DMA的使用不會影響CPU的運行速度。

二、STM32的DMA結構

1、DMA的主要特性
● 12個 獨立的可配置的通道(請求)DMA1有7個通道,DMA2 有5個通道
● 每個通道都直接連接專用的硬件DMA請求,每個通道都同樣支持軟件觸發(fā)。這些功能通過
軟件來配置。
● 在七個請求間的優(yōu)先權可以通過軟件編程設置(共有四級:很高、高、中等和低),假如在相
等優(yōu)先權時由硬件決定(請求0優(yōu)先于請求1,依此類推) 。
● 獨立的源和目標數(shù)據(jù)區(qū)的傳輸寬度(字節(jié)、半字、全字),模擬打包和拆包的過程。源和目標
地址必須按數(shù)據(jù)傳輸寬度對齊。
● 支持循環(huán)的緩沖器管理
● 每個通道都有3個事件標志(DMA 半傳輸,DMA傳輸完成和DMA傳輸出錯),這3個事件標志邏輯或成為一個單獨的中斷請求。
● 存儲器和存儲器間的傳輸
● 外設和存儲器,存儲器和外設的傳輸
● 閃存、SRAM 、外設的SRAM 、APB1 APB2和AHB外設均可作為訪問的源和目標。
● 可編程的數(shù)據(jù)傳輸數(shù)目:最大為65536
下面為功能框圖:

2、兩個DMA控制器結構 ① DMA1 controller

② DMA2 controller

3、DMA寄存器列表

① 中斷類
DMA_ISR:  DMA中斷狀態(tài)寄存器
DMA_IFCR:  DMA中斷標志位清除寄存器 說明:DMA1、DMA2分別有一組寄存器。

② 控制傳輸類
DMA_CCRx:   DMA通道x配置寄存器
DMA_CNDTRx:  DMA通道x數(shù)據(jù)數(shù)量寄存器 DMA_CPARx:   DMA通道x外設地址寄存器 DMA_CMARx:  DMA通道x內存地址寄存器 說明:

  • 每一個通道都有一組寄存器。
  • DMA_CPARx、DMA_CMARx是沒有差別的,它們都可以存放外設的地址、內存的地址。DMA_CPARx、DMA_CMARx只不過起得名字有差別而已。


4、STM32的DMA工作特點

① DMA進行數(shù)據(jù)傳輸?shù)谋匾獥l件
剩余傳輸數(shù)據(jù)量大于0,DMA通道傳輸使能通道上DMA數(shù)據(jù)傳輸有事件請求前兩者都好理解,對于第三點確實需要詳細的解釋,請看下邊的三條。

② 外設到XX方向的傳輸
假設是ADC到存儲器的數(shù)據(jù)傳輸,顯然ADC的DMA傳輸?shù)脑吹刂肥茿DC的數(shù)據(jù)寄存器。并不是說只要DMA通道傳輸使能后,就立即進行數(shù)據(jù)傳輸。只有當一次ADC轉化完成,ADC的DMA通道的傳輸事件有效,DMA才會從ADC的數(shù)據(jù)寄存器讀出數(shù)據(jù),寫入目的地址。當DMA在讀取ADC的數(shù)據(jù)寄存器時,同時使ADC的DMA通道傳輸事件無效。顯然,要等到下一次ADC轉換完成后,才能啟動再一次的數(shù)據(jù)傳輸。

③存儲器對XX的DMA傳輸
因為數(shù)據(jù)是準備好的,不像ADC還需要等待數(shù)據(jù)到位。所以,不需要對應通道的事件。只要使能DMA數(shù)據(jù)傳輸就一直傳輸,直到達到設定的傳輸量。

example: 1.內存到內存, DMA傳輸請求一直有效 2.內存到串口, DMA傳輸請求一直有效 一種解釋: 存儲器對存儲器的置位,就相當于相應通道的事件有效。對應通道的事件有效和存儲器對存儲器的置位,就是傳輸?shù)挠|發(fā)位。每次傳輸?shù)氖录梦灰淮?,完成一次傳輸。如果是由外設引發(fā)的DMA傳輸,則傳輸完成后,相應傳輸事件會置為無效,而存儲器對存儲器的傳輸,則一次傳輸完成后,相應事件一直有效,直至完成設定的傳輸量。

④外設以DMA方式工作時,能否再以軟件方式進行操作? 有一點是肯定的,當外設以DMA方式正在數(shù)據(jù)傳輸時,不可能再相應CPU的軟件控制命令,否則這不符合邏輯。 但是,倘若外設僅僅配置成DMA工作方式,但是DMA請求并未產(chǎn)生,數(shù)據(jù)傳輸并沒有進行。此時,軟件控制命令仍然能夠對外設進行控制。這是筆者在串口以DMA方式發(fā)送數(shù)據(jù)情形下,所得到的測試結論。

三、STM32的DMA軟件編程

1、“內存到內存”模式傳輸

① 初始化配置

    uint8_t SendBuff[SENDBUFF_SIZE]; uint8_t ReceiveBuff[RXBUFF_SIZE]; /**
  * @brief  USART1 TX DMA 配置,內存到內存
  * @param  無
  * @retval 無
  */ void DMA_Mem2Mem_Config(void) {
        DMA_InitTypeDef DMA_InitStructure; /*開啟DMA時鐘*/ RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); /*設置DMA源地址*/ DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)SendBuff; /*設置DMA目的地址*/ DMA_InitStructure.DMA_PeripheralBaseAddr =  (uint32_t)ReceiveBuff; /*方向:從內存SendBuff到內存ReceiveBuff*/ DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; /*傳輸大小DMA_BufferSize=SENDBUFF_SIZE*/ DMA_InitStructure.DMA_BufferSize = SENDBUFF_SIZE; /*ReceiveBuff地址自增*/ DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Enable; /*SENDBUFF_SIZE地址自增*/ DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; /*ReceiveBuff數(shù)據(jù)單位*/ DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; /*SENDBUFF_SIZE數(shù)據(jù)單位*/ DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; /*DMA模式:正常模式*/ DMA_InitStructure.DMA_Mode = DMA_Mode_Normal ; /*優(yōu)先級:中*/ DMA_InitStructure.DMA_Priority = DMA_Priority_Medium; /*使能內存到內存的傳輸    */ DMA_InitStructure.DMA_M2M = DMA_M2M_Enable; /*配置DMA1的4通道*/ DMA_Init(DMA1_Channel4, &DMA_InitStructure); /*失能DMA1的4通道,一旦使能就開始傳輸*/ DMA_Cmd (DMA1_Channel4,DISABLE); 
}  
② DMA中斷配置
    /**
  * @brief DMA 中斷配置
  * @param 無
  * @retval 無
  */ void DMA_NVIC_Configuration(void) {                                                                      
    NVIC_InitTypeDef NVIC_InitStructure; /* 配置中斷源 */ NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel4_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure); /* 配置DMA發(fā)送完成后產(chǎn)生中斷 */ DMA_ITConfig(DMA1_Channel4,DMA_IT_TC,ENABLE);
}  

③啟動傳輸
DMA_Cmd (DMA1_Channel4,ENABLE);
2、利用DMA實現(xiàn)循環(huán)傳輸

方法1:單次傳輸模式 當傳輸結束時,觸發(fā)DMA中斷,在中斷程序中首先失能DMA通道,然后修改該通道的傳輸數(shù)據(jù)量。最后重新使能DMA通道,注意只有失能的DMA通道才能成功修改傳輸數(shù)據(jù)量。

方法2:循環(huán)傳輸模式 當傳輸結束時,硬件自動會將傳輸數(shù)據(jù)量寄存器進行重裝,進行下一輪的數(shù)據(jù)傳輸。

四、再談STM32的DMA傳輸是否影響CPU的運行速度

聲明:經(jīng)過筆者測試,當DMA工作在內存到外設的傳輸和內存到內存的傳輸時,都不會影響CPU的運行速度。為了給這種現(xiàn)象一個合理的解釋,筆者做以下猜測:

1、S3C2440的DMA傳輸
S3C2440的SDRAM是外置的,并且SDRAM的數(shù)據(jù)線、地址線、控制線總共只有一組。假設DMA傳輸?shù)姆较蚴莾却娴酵庠O,當DMA運作時,需要占用SDRAM的三類線才才能實現(xiàn)傳輸;而與此同時CPU也需要通過這三類線來訪問SDRAM來讀取程序、讀寫數(shù)據(jù)。
顯然,DMA的運行與CPU的運行有交叉點,DMA就會影響到CPU的運行。

2、STM32的DMA傳輸
STM32與S3C2440的區(qū)別是很大的,S3C2440是微處理器,RAM外置且空間很大;STM32是微控制器,RAM片內集成且空間較小。此時,ST公司就有可能提升DMA的運作效率,使DMA的工作不影響到CPU的運行。
外設與外設之間的DMA傳輸,因為與CPU的運行沒有交叉點(CPU的數(shù)據(jù)流注意是在Flash、內存、寄存器中傳輸),所以不會影響CPU的運行速度。唯一有可能影響的是外設與內存或者內存與內存之間的DMA傳輸。 倘若ST公司的SRAM是一個雙口RAM,也就是同時可以由兩組接口對RAM進行訪問,就可以很好的解決速度影響問題。倘若CPU恒定占有一組接口,而另一組接口留給DMA控制器。那么當外設與內存或者內存與內存之間的DMA傳輸時,由于不與CPU的訪問SRAM接口沖突,所以可以解決速度影響問題。 但其實偶爾還是會影響的,當CPU訪問SRAM的空間和DMA訪問SRAM的空間相同時,SRAM勢必會對這種情況進行仲裁,這可能會影響到CPU的訪問SRAM的速度。其實,這種情況的概率也是很小的,所以即使影響CPU的運行速度,也不會很大。

免責聲明:本文內容由21ic獲得授權后發(fā)布,版權歸原作者所有,本平臺僅提供信息存儲服務。文章僅代表作者個人觀點,不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!

本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內容真實性等。需要轉載請聯(lián)系該專欄作者,如若文章內容侵犯您的權益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或將催生出更大的獨角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉型技術解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關鍵字: 汽車 人工智能 智能驅動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務中斷的風險,如企業(yè)系統(tǒng)復雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務連續(xù)性,提升韌性,成...

關鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質量流程IT總裁陶景文發(fā)表了演講。

關鍵字: 華為 12nm EDA 半導體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權最終是由生態(tài)的繁榮決定的。

關鍵字: 華為 12nm 手機 衛(wèi)星通信

要點: 有效應對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實提質增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務引領增長 以科技創(chuàng)新為引領,提升企業(yè)核心競爭力 堅持高質量發(fā)展策略,塑強核心競爭優(yōu)勢...

關鍵字: 通信 BSP 電信運營商 數(shù)字經(jīng)濟

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術學會聯(lián)合牽頭組建的NVI技術創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術創(chuàng)新聯(lián)...

關鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(集團)股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關鍵字: BSP 信息技術
關閉
關閉