免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
stm32之DMA詳解

  一、DMA簡介

  1、DMA簡介

  DMA(Direct Memory Access:直接內(nèi)存存取)是一種可以大大減輕CPU工作量的數(shù)據(jù)轉(zhuǎn)移方式。

  CPU有轉(zhuǎn)移數(shù)據(jù)、計算、控制程序轉(zhuǎn)移等很多功能,但其實轉(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è)計的,它的作用就是解決大量數(shù)據(jù)轉(zhuǎn)移過度消耗CPU資源的問題。有了DMA使CPU更專注于更加實用的操作--計算、控制等。

  2、DMA的工作原理

  DMA的作用就是實現(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)存的一個存儲單元)。四種情況的數(shù)據(jù)傳輸如下:

  外設(shè)到內(nèi)存

  內(nèi)存到外設(shè)

  內(nèi)存到內(nèi)存

  外設(shè)到外設(shè)

  當(dāng)用戶將參數(shù)設(shè)置好,主要涉及源地址、目標(biāo)地址、傳輸數(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架構(gòu)系統(tǒng)中,當(dāng)DMA運作時(假設(shè)我們從磁盤拷貝一個文件到U盤),DMA實際上會占用系統(tǒng)總線周期中的一部分時間。也就是說,在DMA未開啟前,系統(tǒng)總線可能完全被CPU使用;當(dāng)DMA開啟后,系統(tǒng)總線要為DMA分配一定的時間,以保證DMA和CPU同時運作。那么顯然,DMA會降低CPU的運行速度。

  在STM32控制器中,芯片采用Cortex-M3架構(gòu),總線結(jié)構(gòu)有了很大的優(yōu)化,DMA占用另外的總線,并不會與CPU的系統(tǒng)總線發(fā)生沖突。也就是說,DMA的使用不會影響CPU的運行速度。

  二、STM32的DMA結(jié)構(gòu)

  1、DMA的主要特性

  ● 12個 獨立的可配置的通道(請求)DMA1有7個通道,DMA2 有5個通道

  ● 每個通道都直接連接專用的硬件DMA請求,每個通道都同樣支持軟件觸發(fā)。這些功能通過

  軟件來配置。

  ● 在七個請求間的優(yōu)先權(quán)可以通過軟件編程設(shè)置(共有四級:很高、高、中等和低),假如在相

  等優(yōu)先權(quán)時由硬件決定(請求0優(yōu)先于請求1,依此類推) 。

  ● 獨立的源和目標(biāo)數(shù)據(jù)區(qū)的傳輸寬度(字節(jié)、半字、全字),模擬打包和拆包的過程。源和目標(biāo)

  地址必須按數(shù)據(jù)傳輸寬度對齊。

  ● 支持循環(huán)的緩沖器管理

  ● 每個通道都有3個事件標(biāo)志(DMA 半傳輸,DMA傳輸完成和DMA傳輸出錯),這3個事件標(biāo)志

  邏輯或成為一個單獨的中斷請求。

  ● 存儲器和存儲器間的傳輸

  ● 外設(shè)和存儲器,存儲器和外設(shè)的傳輸

  ● 閃存、SRAM 、外設(shè)的SRAM 、APB1 APB2和AHB外設(shè)均可作為訪問的源和目標(biāo)。

  ● 可編程的數(shù)據(jù)傳輸數(shù)目:最大為65536

  下面為功能框圖:

  2、兩個DMA控制器結(jié)構(gòu)

 ?、?DMA1 controller

 ?、?DMA2 controller

  3、DMA寄存器列表

  ① 中斷類

  DMA_ISR:   DMA中斷狀態(tài)寄存器

  DMA_IFCR:  DMA中斷標(biāo)志位清除寄存器

  說明:  DMA1、DMA2分別有一組寄存器。

 ?、?控制傳輸類

  DMA_CCRx:   DMA通道x配置寄存器

  DMA_CNDTRx:  DMA通道x數(shù)據(jù)數(shù)量寄存器

  DMA_CPARx:   DMA通道x外設(shè)地址寄存器

  DMA_CMARx:  DMA通道x內(nèi)存地址寄存器

  說明:

  1> 每一個通道都有一組寄存器。

  2> DMA_CPARx、DMA_CMARx是沒有差別的,它們都可以存放外設(shè)的地址、內(nèi)存的地址。DMA_CPARx、DMA_CMARx只不過起得名字有差別而已。

  4、STM32的DMA工作特點

 ?、?DMA進行數(shù)據(jù)傳輸?shù)谋匾獥l件

  剩余傳輸數(shù)據(jù)量大于0

  DMA通道傳輸使能

  通道上DMA數(shù)據(jù)傳輸有事件請求

  前兩者都好理解,對于第三點確實需要詳細的解釋,請看下邊的三條。

 ?、?外設(shè)到XX方向的傳輸

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

 ?、鄞鎯ζ鲗X的DMA傳輸

  因為數(shù)據(jù)是準(zhǔn)備好的,不像ADC還需要等待數(shù)據(jù)到位。所以,不需要對應(yīng)通道的事件。只要使能DMA數(shù)據(jù)傳輸就一直傳輸,直到達到設(shè)定的傳輸量。

  example:

  1.內(nèi)存到內(nèi)存

  DMA傳輸請求一直有效

  2.內(nèi)存到串口

  DMA傳輸請求一直有效

  一種解釋:

  存儲器對存儲器的置位,就相當(dāng)于相應(yīng)通道的事件有效。 對應(yīng)通道的事件有效和存儲器對存儲器的置位,就是傳輸?shù)挠|發(fā)位。每次傳輸?shù)氖录梦灰淮?,完成一次傳輸。如果是由外設(shè)引發(fā)的DMA傳輸,則傳輸完成后,相應(yīng)傳輸事件會置為無效,而存儲器對存儲器的傳輸,則一次傳輸完成后,相應(yīng)事件一直有效,直至完成設(shè)定的傳輸量。

  ④外設(shè)以DMA方式工作時,能否再以軟件方式進行操作?

  有一點是肯定的,當(dāng)外設(shè)以DMA方式正在數(shù)據(jù)傳輸時,不可能再相應(yīng)CPU的軟件控制命令,否則這不符合邏輯。

  但是,倘若外設(shè)僅僅配置成DMA工作方式,但是DMA請求并未產(chǎn)生,數(shù)據(jù)傳輸并沒有進行。此時,軟件控制命令仍然能夠?qū)ν庠O(shè)進行控制。這是筆者在串口以DMA方式發(fā)送數(shù)據(jù)情形下,所得到的測試結(jié)論。

  三、STM32的DMA軟件編程

  1、“內(nèi)存到內(nèi)存”模式傳輸

 ?、?初始化配置

  uint8_t SendBuff[SENDBUFF_SIZE];

  uint8_t ReceiveBuff[RXBUFF_SIZE];

  /**

  * @brief USART1 TX DMA 配置,內(nèi)存到內(nèi)存

  * @param 無

  * @retval 無

  */

  void DMA_Mem2Mem_Config(void)

  {

  DMA_InitTypeDef DMA_InitStructure;

  /*開啟DMA時鐘*/

  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);

  /*設(shè)置DMA源地址*/

  DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)SendBuff;

  /*設(shè)置DMA目的地址*/

  DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)ReceiveBuff;

  /*方向:從內(nèi)存SendBuff到內(nèi)存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;

  /*使能內(nèi)存到內(nèi)存的傳輸 */

  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);

  }

 ?、蹎觽鬏?/p>

  DMA_Cmd (DMA1_Channel4,ENABLE);

  2、利用DMA實現(xiàn)循環(huán)傳輸

  方法1:單次傳輸模式

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

  方法2:循環(huán)傳輸模式

  當(dāng)傳輸結(jié)束時,硬件自動會將傳輸數(shù)據(jù)量寄存器進行重裝,進行下一輪的數(shù)據(jù)傳輸。

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

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

  1、S3C2440的DMA傳輸

  S3C2440的SDRAM是外置的,并且SDRAM的數(shù)據(jù)線、地址線、控制線總共只有一組。假設(shè)DMA傳輸?shù)姆较蚴莾?nèi)存到外設(shè),當(dāng)DMA運作時,需要占用SDRAM的三類線才才能實現(xiàn)傳輸;而與此同時CPU也需要通過這三類線來訪問SDRAM來讀取程序、讀寫數(shù)據(jù)。

  顯然,DMA的運行與CPU的運行有交叉點,DMA就會影響到CPU的運行。

  2、STM32的DMA傳輸

  STM32與S3C2440的區(qū)別是很大的,S3C2440是微處理器,RAM外置且空間很大;STM32是微控制器,RAM片內(nèi)集成且空間較小。此時,ST公司就有可能提升DMA的運作效率,使DMA的工作不影響到CPU的運行。

  外設(shè)與外設(shè)之間的DMA傳輸,因為與CPU的運行沒有交叉點(CPU的數(shù)據(jù)流注意是在Flash、內(nèi)存、寄存器中傳輸),所以不會影響CPU的運行速度。唯一有可能影響的是外設(shè)與內(nèi)存或者內(nèi)存與內(nèi)存之間的DMA傳輸。

  倘若ST公司的SRAM是一個雙口RAM,也就是同時可以由兩組接口對RAM進行訪問,就可以很好的解決速度影響問題。倘若CPU恒定占有一組接口,而另一組接口留給DMA控制器。那么當(dāng)外設(shè)與內(nèi)存或者內(nèi)存與內(nèi)存之間的DMA傳輸時,由于不與CPU的訪問SRAM接口沖突,所以可以解決速度影響問題。

  但其實偶爾還是會影響的,當(dāng)CPU訪問SRAM的空間和DMA訪問SRAM的空間相同時,SRAM勢必會對這種情況進行仲裁,這可能會影響到CPU的訪問SRAM的速度。其實,這種情況的概率也是很小的,所以即使影響CPU的運行速度,也不會很大。

(DMA專題講解)

http://www.makeru.com.cn/live/1392_1048.html?s=45051

http://www.makeru.com.cn/live/1392_1020.html?s=45051

本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
stm32 DMA數(shù)據(jù)搬運 [操作寄存器+庫函數(shù)]-Changing's Blog
野火STM32 ADC(DMA模式)實驗 詳細分析
【STM32】HAL庫 STM32CubeMX教程十一
STM32F0單片機快速入門八 聊聊 Coolie DMA
09輸入輸出系統(tǒng)
DMA控制器原理詳解
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服