欧美性猛交xxxx免费看_牛牛在线视频国产免费_天堂草原电视剧在线观看免费_国产粉嫩高清在线观看_国产欧美日本亚洲精品一5区

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

小白都看得懂的STM32的DMA知識(shí)

撞上電子 ? 2023-11-27 08:00 ? 次閱讀

一、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ù)是可以不需要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更專注于更加實(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)用戶將參數(shù)設(shè)置好,主要涉及源地址、目標(biāo)地址、傳輸數(shù)據(jù)量這三個(gè),DMA控制器就會(huì)啟動(dòng)數(shù)據(jù)傳輸,傳輸?shù)慕K點(diǎn)就是剩余傳輸數(shù)據(jù)量為0。換句話說(shuō)只要剩余傳輸數(shù)據(jù)量不是0,而且DMA是啟動(dòng)狀態(tài),那么就會(huì)發(fā)生數(shù)據(jù)傳輸。


3、DMA是否影響CPU的運(yùn)行

在X86架構(gòu)系統(tǒng)中,當(dāng)DMA運(yùn)作時(shí),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ú)立的可配置的通道DMA1有7個(gè)通道,DMA2 有5個(gè)通道
● 每個(gè)通道都直接連接專用的硬件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,依此類推) 。
● 獨(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寄存器列表

① 中斷類

DMA_ISR:DMA中斷狀態(tài)寄存器DMA_IFCRDMA中斷標(biāo)志位清除寄存器說(shuō)明:DMA1、DMA2分別有一組寄存器。

② 控制傳輸類

DMA_CCRxDMA通道x配置寄存器DMA_CNDTRxDMA通道x數(shù)據(jù)數(shù)量寄存器DMA_CPARxDMA通道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è)定的傳輸量。

舉個(gè)例子: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ù)氖录梦灰淮?,完成一次傳輸。如果是由外設(shè)引發(fā)的DMA傳輸,則傳輸完成后,相應(yīng)傳輸事件會(huì)置為無(wú)效,而存儲(chǔ)器對(duì)存儲(chǔ)器的傳輸,則一次傳輸完成后,相應(yīng)事件一直有效,直至完成設(shè)定的傳輸量。

④外設(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é)論。

三、STM32的DMA軟件編程

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

①初始化配置

/** * @brief USART1 TX DMA 配置,內(nèi)存到內(nèi)存 * @param 無(wú) * @retval 無(wú) */void DMA_Mem2Mem_Config(void){ DMA_InitTypeDef DMA_InitStructure; /*開(kāi)啟DMA時(shí)鐘*/ 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)先級(jí):中*/ 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通道,一旦使能就開(kāi)始傳輸*/ DMA_Cmd (DMA1_Channel4,DISABLE); }

②DMA中斷配置

/* * @brief DMA 中斷配置 * @param 無(wú) * @retval 無(wú) */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);}

③啟動(dòng)傳輸

DMA_Cmd (DMA1_Channel4,ENABLE);

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

方法1:?jiǎn)未蝹鬏斈J?/h4>

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


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

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


四、再談STM32的DMA傳輸是否影響CPU的運(yùn)行速度

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

1、S3C2440的DMA傳輸

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

顯然,DMA的運(yùn)行與CPU的運(yùn)行有交叉點(diǎn),DMA就會(huì)影響到CPU的運(yùn)行。

2、STM32的DMA傳輸

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

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 寄存器
    +關(guān)注

    關(guān)注

    31

    文章

    5372

    瀏覽量

    121304
  • STM32
    +關(guān)注

    關(guān)注

    2273

    文章

    10926

    瀏覽量

    357813
  • dma
    dma
    +關(guān)注

    關(guān)注

    3

    文章

    566

    瀏覽量

    101033
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    請(qǐng)問(wèn)INA128具體有什么用?

    它是通用儀表放大器,但是我不懂這個(gè)芯片具體有什么用,和我們用的運(yùn)放有什么區(qū)別 有具體的電路圖嗎,數(shù)據(jù)手冊(cè)上的不是很看得懂
    發(fā)表于 09-02 07:57

    ESP32工程編譯提示錯(cuò)誤,請(qǐng)問(wèn)該怎么解決?

    找到相關(guān)辦法,看得懂提示的英文說(shuō)明,但不知道要具體怎么操作。。。 -- Could NOT find Perl (missing: PERL_EXECUTABLE) CMake Warning
    發(fā)表于 06-21 06:32

    STM32的USB的數(shù)據(jù)能通過(guò)DMA直接傳到SPI接口嗎?STM32DMA能訪問(wèn)USB寄存器不?

    提問(wèn):STM32的USB的數(shù)據(jù)能通過(guò)DMA直接傳到SPI接口嗎?STM32DMA能訪問(wèn)USB寄存器不?多謝啦
    發(fā)表于 05-17 14:30

    STM32F103VCT6 ADC和DMA的速度為什么不一致?

    最近調(diào)試STM32F103VCT6,發(fā)現(xiàn)一個(gè)很奇怪的問(wèn)題?,F(xiàn)在采用ADC1和ADC3,同時(shí)采集兩路波形,采集速率配到了1.5時(shí)鐘,大約1.17us。因?yàn)樗俣容^快,所以,開(kāi)啟了DMA1和DMA
    發(fā)表于 05-16 07:12

    STM32F407頻繁調(diào)用DMA_GetCurrDataCounter,DMA接收不到數(shù)據(jù)的原因?

    STM32F407頻繁調(diào)用DMA_GetCurrDataCounter,DMA接收不到數(shù)據(jù),像死了一樣
    發(fā)表于 05-14 07:13

    大家使用過(guò)STM32DMA功能嗎?感覺(jué)怎么樣?

    大家使用過(guò)STM32DMA功能嗎?感覺(jué)怎么樣。
    發(fā)表于 05-11 06:06

    使用stm32CubeMx時(shí),設(shè)置DMA為Circular模式會(huì)被HAL_ADC_Start_DMA阻塞為什么?

    在使用stm32CubeMx時(shí)遇到一個(gè)問(wèn)題,我在用DMA方式獲取ADC數(shù)據(jù)時(shí),設(shè)置DMA為Circular模式會(huì)被HAL_ADC_Start_DMA阻塞,不懂為什么會(huì)這樣,后來(lái)?yè)Q了F1
    發(fā)表于 04-25 08:12

    STM32H7系列上的DMA, MDMA, BDMA的異同是什么?

    STM32H7上面有好多類型的DMA,大概看了一下功能差不多呀!有沒(méi)有誰(shuí)了解的,來(lái)講講這幾個(gè)DMA都有什么區(qū)別,有什么特別之處?實(shí)際使用可以用來(lái)干嘛
    發(fā)表于 04-17 08:09

    stm32cubemx建立多通道ADC+DMA,想使用DMA中斷要怎么實(shí)現(xiàn)?

    各位大神: 我在用stm32 cubemx建立ADC+DMA多通道,想使用DMA中斷,百度了個(gè)設(shè)置在DMA里增加ADC1,然后在中斷里開(kāi)啟DMA
    發(fā)表于 04-02 07:14

    關(guān)于STM32L051C8T6芯片LPUART+DMA接收問(wèn)題求解

    ,其中UART2的接收是能夠回顯的。但是LPUART就無(wú)法做到回顯。兩者之間除了中斷優(yōu)先級(jí)之外其他基本一樣。我也查閱了文檔,看是否是STM32CUBEMX生成程序配置錯(cuò)誤的原因,結(jié)果也不是。 是LPUART不支持DMA接收么?
    發(fā)表于 03-28 07:05

    stm32f407zet6串口的dma會(huì)和sdio的dma發(fā)生干擾嗎?

    stm32f407zet6 串口的dma會(huì)和sdio的dma發(fā)生干擾嗎
    發(fā)表于 03-11 07:25

    關(guān)于stm32標(biāo)準(zhǔn)庫(kù)的DMA串口接收問(wèn)題?

    想做一個(gè)DMA串口接收,但是接受不到數(shù)據(jù),作為新人小白,具體什么問(wèn)題也看不出來(lái),求求大佬幫忙看看代碼有什么問(wèn)題
    發(fā)表于 03-07 22:22

    STM32開(kāi)發(fā)者社區(qū):從這里開(kāi)啟你的STM32之旅!小白和PRO友好

    來(lái)源:意法半導(dǎo)體博客 當(dāng)面對(duì)STM32Cube生態(tài)系統(tǒng)這樣一個(gè)龐大而豐富的開(kāi)發(fā)世界時(shí),工程師難免會(huì)產(chǎn)生疑問(wèn),從哪里開(kāi)始才好? ST的許多合作伙伴和客戶希望有更多的產(chǎn)品能夠利用STM32Cube開(kāi)發(fā)
    的頭像 發(fā)表于 02-27 15:47 ?627次閱讀
    <b class='flag-5'>STM32</b>開(kāi)發(fā)者社區(qū):從這里開(kāi)啟你的<b class='flag-5'>STM32</b>之旅!<b class='flag-5'>小白</b>和PRO<b class='flag-5'>都</b>友好

    什么是DMA?DMA究竟有多快!

    助于提高數(shù)據(jù)傳輸速度和系統(tǒng)效率。 那么,DMA究竟有多快呢? 實(shí)踐出真知 恰好,最近有個(gè)多通道數(shù)據(jù)采集的項(xiàng)目,受限于通道數(shù)多、分辨率高,而系統(tǒng)帶寬有限,為了盡可能充分利用有限帶寬,就得想辦法優(yōu)化時(shí)序,把時(shí)間留給數(shù)據(jù)采集和傳輸。 優(yōu)化方向就是
    的頭像 發(fā)表于 02-22 10:43 ?2283次閱讀
    什么是<b class='flag-5'>DMA</b>?<b class='flag-5'>DMA</b>究竟有多快!

    雅特力AT32F423 DMA使用指南

    通道支持外設(shè)的DMA請(qǐng)求映射到任意通道上。圖1.DMA控制器架構(gòu)DMAMUX簡(jiǎn)介對(duì)于如何將外設(shè)的DMA請(qǐng)求映射到任意的數(shù)據(jù)流通道上,就需要使用到DMAMUX。DM
    的頭像 發(fā)表于 02-22 08:13 ?799次閱讀
    雅特力AT32F423 <b class='flag-5'>DMA</b>使用指南