一、DMA簡介
1、DMA簡介
DMA(Direct Memory Access:直接內存存取)是一種可以大大減輕CPU工作量的數據轉移方式。
CPU有轉移數據、計算、控制程序轉移等很多功能,但其實轉移數據是可以不需要CPU參與。比如希望外設A的數據拷貝到外設B,只要給兩種外設提供一條數據通路,再加上一些控制轉移的部件就可以完成數據的拷貝。
DMA就是基于以上設想設計的,它的作用就是解決大量數據轉移過度消耗CPU資源的問題。有了DMA使CPU更專注于更加實用的操作--計算、控制等。
2、DMA的工作原理
DMA的作用就是實現數據的直接傳輸,而去掉了傳統數據傳輸需要CPU寄存器參與的環節,主要涉及四種情況的數據傳輸,但本質上是一樣的,都是從內存的某一區域傳輸到內存的另一區域(外設的數據寄存器本質上就是內存的一個存儲單元)。四種情況的數據傳輸如下:
外設到內存
內存到外設
內存到內存
外設到外設
當用戶將參數設置好,主要涉及源地址、目標地址、傳輸數據量這三個,DMA控制器就會啟動數據傳輸,傳輸的終點就是剩余傳輸數據量為0。換句話說只要剩余傳輸數據量不是0,而且DMA是啟動狀態,那么就會發生數據傳輸。
3、DMA是否影響CPU的運行
在X86架構系統中,當DMA運作時,DMA實際上會占用系統總線周期中的一部分時間。也就是說,在DMA未開啟前,系統總線可能完全被CPU使用;當DMA開啟后,系統總線要為DMA分配一定的時間,以保證DMA和CPU同時運作。那么顯然,DMA會降低CPU的運行速度。
在STM32控制器中,芯片采用Cortex-M3架構,總線結構有了很大的優化,DMA占用另外的總線,并不會與CPU的系統總線發生沖突。也就是說,DMA的使用不會影響CPU的運行速度。
二、STM32的DMA結構
1、DMA的主要特性
● 12個 獨立的可配置的通道DMA1有7個通道,DMA2 有5個通道
● 每個通道都直接連接專用的硬件DMA請求,每個通道都同樣支持軟件發。這些功能通過軟件來配置。
● 在七個請求間的優先權可以通過軟件編程設置(共有四級:很高、高、中等和低),假如在相等優先權時由硬件決定(請求0優先于請求1,依此類推) 。
● 獨立的源和目標數據區的傳輸寬度(字節、半字、全字),模擬打包和拆包的過程。源和目標地址必須按數據傳輸寬度對齊。
● 支持循環的緩沖器管理
● 每個通道都有3個事件標志(DMA 半傳輸,DMA傳輸完成和DMA傳輸出錯),這3個事件標志邏輯或成為一個單獨的中斷請求。
●存儲器和存儲器間的傳輸
●外設和存儲器,存儲器和外設的傳輸
● 閃存、SRAM 、外設的SRAM 、APB1 APB2和AHB外設均可作為訪問的源和目標。
● 可編程的數據傳輸數目:最大為65536
下面為功能框圖:
2、兩個DMA控制器結構
① DMA1 controller
② DMA2 controller
3、DMA寄存器列表
① 中斷類
DMA_ISR:DMA中斷狀態寄存器DMA_IFCR:DMA中斷標志位清除寄存器說明:DMA1、DMA2分別有一組寄存器。
② 控制傳輸類
DMA_CCRx:DMA通道x配置寄存器DMA_CNDTRx:DMA通道x數據數量寄存器DMA_CPARx:DMA通道x外設地址寄存器DMA_CMARx:DMA通道x內存地址寄存器
說明: 1> 每一個通道都有一組寄存器。2> DMA_CPARx、DMA_CMARx是沒有差別的,它們都可以存放外設的地址、內存的地址。DMA_CPARx、DMA_CMARx只不過起得名字有差別而已。
4、STM32的DMA工作特點
① DMA進行數據傳輸的必要條件
剩余傳輸數據量大于0
DMA通道傳輸使能
通道上DMA數據傳輸有事件請求
前兩者都好理解,對于第三點確實需要詳細的解釋,請看下邊的三條。
② 外設到XX方向的傳輸
假設是ADC到存儲器的數據傳輸,顯然ADC的DMA傳輸的源地址是ADC的數據寄存器。并不是說只要DMA通道傳輸使能后,就立即進行數據傳輸。只有當一次ADC轉化完成,ADC的DMA通道的傳輸事件有效,DMA才會從ADC的數據寄存器讀出數據,寫入目的地址。當DMA在讀取ADC的數據寄存器時,同時使ADC的DMA通道傳輸事件無效。顯然,要等到下一次ADC轉換完成后,才能啟動再一次的數據傳輸。
③存儲器對XX的DMA傳輸
因為數據是準備好的,不像ADC還需要等待數據到位。所以,不需要對應通道的事件。只要使能DMA數據傳輸就一直傳輸,直到達到設定的傳輸量。
舉個例子:1.內存到內存DMA傳輸請求一直有效2.內存到串口 DMA傳輸請求一直有效
一種解釋:存儲器對存儲器的置位,就相當于相應通道的事件有效。對應通道的事件有效和存儲器對存儲器的置位,就是傳輸的觸發位。每次傳輸的事件置位一次,完成一次傳輸。如果是由外設引發的DMA傳輸,則傳輸完成后,相應傳輸事件會置為無效,而存儲器對存儲器的傳輸,則一次傳輸完成后,相應事件一直有效,直至完成設定的傳輸量。
④外設以DMA方式工作時,能否再以軟件方式進行操作?
有一點是肯定的,當外設以DMA方式正在數據傳輸時,不可能再相應CPU的軟件控制命令,否則這不符合邏輯。
但是,倘若外設僅僅配置成DMA工作方式,但是DMA請求并未產生,數據傳輸并沒有進行。此時,軟件控制命令仍然能夠對外設進行控制。這是筆者在串口以DMA方式發送數據情形下,所得到的測試結論。
三、STM32的DMA軟件編程
1、“內存到內存”模式傳輸
①初始化配置
/** * @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數據單位*/ DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
/*SENDBUFF_SIZE數據單位*/ DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
/*DMA模式:正常模式*/ DMA_InitStructure.DMA_Mode = DMA_Mode_Normal ;
/*優先級:中*/ 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發送完成后產生中斷 */ DMA_ITConfig(DMA1_Channel4,DMA_IT_TC,ENABLE);}
③啟動傳輸
DMA_Cmd (DMA1_Channel4,ENABLE);
2、利用DMA實現循環傳輸
方法1:單次傳輸模式
當傳輸結束時,觸發DMA中斷,在中斷程序中首先失能DMA通道,然后修改該通道的傳輸數據量。最后重新使能DMA通道,注意只有失能的DMA通道才能成功修改傳輸數據量。
方法2:循環傳輸模式
當傳輸結束時,硬件自動會將傳輸數據量寄存器進行重裝,進行下一輪的數據傳輸。
四、再談STM32的DMA傳輸是否影響CPU的運行速度
聲明:經過筆者測試,當DMA工作在內存到外設的傳輸和內存到內存的傳輸時,都不會影響CPU的運行速度。為了給這種現象一個合理的解釋,筆者做以下猜測:
1、S3C2440的DMA傳輸
S3C2440的SDRAM是外置的,并且SDRAM的數據線、地址線、控制線總共只有一組。假設DMA傳輸的方向是內存到外設,當DMA運作時,需要占用SDRAM的三類線才才能實現傳輸;而與此同時CPU也需要通過這三類線來訪問SDRAM來讀取程序、讀寫數據。
顯然,DMA的運行與CPU的運行有交叉點,DMA就會影響到CPU的運行。
2、STM32的DMA傳輸
STM32與S3C2440的區別是很大的,S3C2440是微處理器,RAM外置且空間很大;STM32是微控制器,RAM片內集成且空間較小。此時,ST公司就有可能提升DMA的運作效率,使DMA的工作不影響到CPU的運行。外設與外設之間的DMA傳輸,因為與CPU的運行沒有交叉點(CPU的數據流注意是在Flash、內存、寄存器中傳輸),所以不會影響CPU的運行速度。唯一有可能影響的是外設與內存或者內存與內存之間的DMA傳輸。倘若ST公司的SRAM是一個雙口RAM,也就是同時可以由兩組接口對RAM進行訪問,就可以很好的解決速度影響問題。倘若CPU恒定占有一組接口,而另一組接口留給DMA控制器。那么當外設與內存或者內存與內存之間的DMA傳輸時,由于不與CPU的訪問SRAM接口沖突,所以可以解決速度影響問題。但其實偶爾還是會影響的,當CPU訪問SRAM的空間和DMA訪問SRAM的空間相同時,SRAM勢必會對這種情況進行仲裁,這可能會影響到CPU的訪問SRAM的速度。其實,這種情況的概率也是很小的,所以即使影響CPU的運行速度,也不會很大。
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
寄存器
+關注
關注
31文章
5343瀏覽量
120363 -
STM32
+關注
關注
2270文章
10900瀏覽量
356005 -
dma
+關注
關注
3文章
561瀏覽量
100586
發布評論請先 登錄
相關推薦
ESP32工程編譯提示錯誤,請問該怎么解決?
找到相關辦法,看得懂提示的英文說明,但不知道要具體怎么操作。。。
-- Could NOT find Perl (missing: PERL_EXECUTABLE)
CMake Warning
發表于 06-21 06:32
STM32的USB的數據能通過DMA直接傳到SPI接口嗎?STM32的DMA能訪問USB寄存器不?
提問:STM32的USB的數據能通過DMA直接傳到SPI接口嗎?STM32的DMA能訪問USB寄存器不?多謝啦
發表于 05-17 14:30
STM32F103VCT6 ADC和DMA的速度為什么不一致?
最近調試STM32F103VCT6,發現一個很奇怪的問題。現在采用ADC1和ADC3,同時采集兩路波形,采集速率都配到了1.5時鐘,大約1.17us。因為速度較快,所以,開啟了DMA1和DMA
發表于 05-16 07:12
STM32F407頻繁調用DMA_GetCurrDataCounter,DMA接收不到數據的原因?
STM32F407頻繁調用DMA_GetCurrDataCounter,DMA接收不到數據,像死了一樣
發表于 05-14 07:13
使用stm32CubeMx時,設置DMA為Circular模式會被HAL_ADC_Start_DMA阻塞為什么?
在使用stm32CubeMx時遇到一個問題,我在用DMA方式獲取ADC數據時,設置DMA為Circular模式會被HAL_ADC_Start_DMA阻塞,不懂為什么會這樣,后來換了F1
發表于 04-25 08:12
STM32H7系列上的DMA, MDMA, BDMA的異同是什么?
STM32H7上面有好多類型的DMA,大概看了一下功能都差不多呀!有沒有誰了解的,來講講這幾個DMA都有什么區別,有什么特別之處?實際使用可以用來干嘛
發表于 04-17 08:09
關于STM32L051C8T6芯片LPUART+DMA接收問題求解
,其中UART2的接收是能夠回顯的。但是LPUART就無法做到回顯。兩者之間除了中斷優先級之外其他基本都一樣。我也查閱了文檔,看是否是STM32CUBEMX生成程序配置錯誤的原因,結果也不是。
是LPUART不支持DMA接收么?
發表于 03-28 07:05
STM32開發者社區:從這里開啟你的STM32之旅!小白和PRO都友好
來源:意法半導體博客 當面對STM32Cube生態系統這樣一個龐大而豐富的開發世界時,工程師難免會產生疑問,從哪里開始才好? ST的許多合作伙伴和客戶都希望有更多的產品能夠利用STM32Cube開發
什么是DMA?DMA究竟有多快!
助于提高數據傳輸速度和系統效率。 那么,DMA究竟有多快呢? 實踐出真知 恰好,最近有個多通道數據采集的項目,受限于通道數多、分辨率高,而系統帶寬有限,為了盡可能充分利用有限帶寬,就得想辦法優化時序,把時間都留給數據采集和傳輸。 優化方向就是
雅特力AT32F423 DMA使用指南
通道都支持外設的DMA請求映射到任意通道上。圖1.DMA控制器架構DMAMUX簡介對于如何將外設的DMA請求映射到任意的數據流通道上,就需要使用到DMAMUX。DM
STM32U5系列TIMER+DMA+DAC應用演示
有人使用STM32U575芯片的DAC功能。他希望使用TIMER事件觸發DMA,并通過DMA傳輸內存數據到DAC輸出寄存器,進而產生相應的DAC輸出波形。可他不知如何配置DMA并實現期
常用的基礎電路保護器件都有哪些?談談二極管的基礎知識
作為一名電子工程師,對于電路不說必須要非常精通,但至少能夠看得懂電路,知道電路保護器件的作用,在客戶提出防護需求時,及時給出有效且具有實施性的整改意見。
評論