色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

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

DMA的基本定義、主要特征及配置

硬件筆記本 ? 來源:車端 ? 作者:初光 ? 2022-11-14 11:50 ? 次閱讀

DMA的基本介紹

什么是DMA (DMA的基本定義)

DMA,全稱Direct Memory Access,即直接存儲器訪問。

DMA傳輸將數(shù)據(jù)從一個地址空間復(fù)制到另一個地址空間,提供在外設(shè)和存儲器之間或者存儲器和存儲器之間的高速數(shù)據(jù)傳輸。

我們知道CPU有轉(zhuǎn)移數(shù)據(jù)、計算、控制程序轉(zhuǎn)移等很多功能,系統(tǒng)運作的核心就是CPU。

CPU無時不刻的在處理著大量的事務(wù),但有些事情卻沒有那么重要,比方說數(shù)據(jù)的復(fù)制和存儲數(shù)據(jù),如果我們把這部分的CPU資源拿出來,讓CPU去處理其他的復(fù)雜計算事務(wù),是不是能夠更好的利用CPU的資源呢?

因此:轉(zhuǎn)移數(shù)據(jù)(尤其是轉(zhuǎn)移大量數(shù)據(jù))是可以不需要CPU參與。比如希望外設(shè)A的數(shù)據(jù)拷貝到外設(shè)B,只要給兩種外設(shè)提供一條數(shù)據(jù)通路,直接讓數(shù)據(jù)由A拷貝到B,不經(jīng)過CPU的處理。

DMA就是基于以上設(shè)想設(shè)計的,它的作用就是解決大量數(shù)據(jù)轉(zhuǎn)移過度消耗CPU資源的問題。有了DMA使CPU更專注于更加實用的操作–計算、控制等。

DMA定義

DMA用來提供在外設(shè)和存儲器之間或者存儲器和存儲器之間的高速數(shù)據(jù)傳輸。無須CPU的干預(yù),通過DMA數(shù)據(jù)可以快速地移動。這就節(jié)省了CPU的資源來做其他操作。

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

DMA傳輸參數(shù)

我們知道,數(shù)據(jù)傳輸,首先需要的是:1 數(shù)據(jù)的源地址,2 數(shù)據(jù)傳輸位置的目標地址,3 傳遞數(shù)據(jù)多少的數(shù)據(jù)傳輸量,4 進行多少次傳輸?shù)膫鬏斈J健MA所需要的核心參數(shù),便是這四個。

當用戶將參數(shù)設(shè)置好,主要涉及源地址、目標地址、傳輸數(shù)據(jù)量這三個,DMA控制器就會啟動數(shù)據(jù)傳輸,當剩余傳輸數(shù)據(jù)量為0時,達到傳輸終點,結(jié)束DMA傳輸。當然,DMA 還有循環(huán)傳輸模式。當?shù)竭_傳輸終點時,會重新啟動DMA傳輸。也就是說,只要剩余傳輸數(shù)據(jù)量不是0,而且DMA是啟動狀態(tài),那么就會發(fā)生數(shù)據(jù)傳輸。

DMA的主要特征

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

在同一個DMA模塊上,多個請求間的優(yōu)先權(quán)可以通過軟件編程設(shè)置(共有四級:很高、高、中等和低),優(yōu)先權(quán)設(shè)置相等時由硬件決定(請求0優(yōu)先于請求1,依此類推);

獨立數(shù)據(jù)源和目標數(shù)據(jù)區(qū)的傳輸寬度(字節(jié)、半字、全字),模擬打包和拆包的過程。源和目標地址必須按數(shù)據(jù)傳輸寬度對齊;

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

每個通道都有3個事件標志(DMA半傳輸、DMA傳輸完成和DMA傳輸出錯),這3個事件標志邏輯或成為一個單獨的中斷請求;

存儲器和存儲器間的傳輸、外設(shè)和存儲器、存儲器和外設(shè)之間的傳輸;

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

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

STM32少個DMA資源?

對于大容量的STM32芯片有兩個DMA控制器,DMA1有7個通道,DMA2有5個通道。每個通道都可以配置一些外設(shè)的地址。

①DMA1 controller

從外設(shè)(TIMx[x=1、2、3、4]、ADC1、SPI1、SPI/I2S2、I2Cx[x=1、2]和USARTx[x=1、2、3])產(chǎn)生的7個DMA請求,通過邏輯或輸入到DMA1控制器,其中每個通道都對應(yīng)著具體的外設(shè):

② DMA2 controller

從外設(shè)(TIMx[5、6、7、8]、ADC3、SPI/I2S3、UART4、DAC通道1、2和SDIO)產(chǎn)生的5個請求,經(jīng)邏輯或輸入到DMA2控制器,其中每個通道都對應(yīng)著具體的外設(shè):

這些在下方系統(tǒng)框圖中,也可以清晰地看到。

DMA工作系統(tǒng)框圖

上方的框圖,我們可以看到STM32內(nèi)核,存儲器,外設(shè)及DMA的連接,這些硬件最終通過各種各樣的線連接到總線矩陣中,硬件結(jié)構(gòu)之間的數(shù)據(jù)轉(zhuǎn)移都經(jīng)過總線矩陣的協(xié)調(diào),使各個外設(shè)和諧的使用總線來傳輸數(shù)據(jù)。我們對他來進行一點一點的分析:

下面看有與沒有DMA的情況下,ADC采集的數(shù)據(jù)是怎樣存放到SRAM中的?

沒有DMA

1.如果沒有DMA,CPU傳輸數(shù)據(jù)還要以內(nèi)核作為中轉(zhuǎn)站,比如要將ADC采集的數(shù)據(jù)轉(zhuǎn)移到到SRAM中,這個過程是這樣的:

內(nèi)核通過DCode經(jīng)過總線矩陣協(xié)調(diào),從獲取AHB存儲的外設(shè)ADC采集的數(shù)據(jù),

然后內(nèi)核再通過DCode經(jīng)過總線矩陣協(xié)調(diào)把數(shù)據(jù)存放到內(nèi)存SRAM中。

在這里插入圖片描述

有DMA傳輸

有DMA的話:

DMA傳輸時外設(shè)對DMA控制器發(fā)出請求。

DMA控制器收到請求,觸發(fā)DMA工作。

DMA控制器從AHB外設(shè)獲取ADC采集的數(shù)據(jù),存儲到DMA通道中。

DMA控制器的DMA總線與總線矩陣協(xié)調(diào),使用AHB把外設(shè)ADC采集的數(shù)據(jù)經(jīng)由DMA通道存放到SRAM中,這個數(shù)據(jù)的傳輸過程中,完全不需要內(nèi)核的參與,也就是不需要CPU的參與。

在這里插入圖片描述

我們把上面的步驟專業(yè)一點介紹:

在發(fā)生一個事件后,外設(shè)向DMA控制器發(fā)送一個請求信號。DMA控制器根據(jù)通道的優(yōu)先權(quán)處理請求。當DMA控制器開始訪問發(fā)出請求的外設(shè)時,DMA控制器立即發(fā)送給它一個應(yīng)答信號。當從DMA控制器得到應(yīng)答信號時,外設(shè)立即釋放它的請求。一旦外設(shè)釋放了這個請求,DMA控制器同時撤銷應(yīng)答信號。DMA傳輸結(jié)束,如果有更多的請求時,外設(shè)可以啟動下一個周期。

總之,每次DMA傳送由3個操作組成:

從外設(shè)數(shù)據(jù)寄存器或者從當前外設(shè)/存儲器地址寄存器指示的存儲器地址取數(shù)據(jù),第一次傳輸時的開始地址是DMA_CPARx或DMA_CMARx寄存器指定的外設(shè)基地址或存儲器單元;

存數(shù)據(jù)到外設(shè)數(shù)據(jù)寄存器或者當前外設(shè)/存儲器地址寄存器指示的存儲器地址,第一次傳輸時的開始地址是DMA_CPARx或DMA_CMARx寄存器指定的外設(shè)基地址或存儲器單元;

執(zhí)行一次DMA_CNDTRx寄存器的遞減操作,該寄存器包含未完成的操作數(shù)目。

DMA傳輸方式

方法1:DMA_Mode_Normal,正常模式。

當一次DMA數(shù)據(jù)傳輸完后,停止DMA傳送,也就是只傳輸一次。

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

當傳輸結(jié)束時,硬件自動會將傳輸數(shù)據(jù)量寄存器進行重裝,進行下一輪的數(shù)據(jù)傳輸。也就是多次傳輸模式。

仲裁器

仲裁器的作用是確定各個DMA傳輸?shù)膬?yōu)先級。

仲裁器根據(jù)通道請求的優(yōu)先級來啟動外設(shè)/存儲器的訪問。

優(yōu)先權(quán)管理分2個階段:

軟件:每個通道的優(yōu)先權(quán)可以在DMA_CCRx寄存器中設(shè)置,有4個等級:

最高優(yōu)先級

高優(yōu)先級

中等優(yōu)先級

低優(yōu)先級;

硬件:如果2個請求有相同的軟件優(yōu)先級,則較低編號的通道比較高編號的通道有較高的優(yōu)先權(quán)。比如:如果軟件優(yōu)先級相同,通道2優(yōu)先于通道4。

注意:在大容量產(chǎn)品和互聯(lián)型產(chǎn)品中,DMA1控制器擁有高于DMA2控制器的優(yōu)先級。

DMA數(shù)據(jù)流(僅存在于STM32F4/M4內(nèi)核上)

在設(shè)置了DMA的通道之后,還要選擇通道對應(yīng)外設(shè)的數(shù)據(jù)流。

8 個 DMA 控制器數(shù)據(jù)流都能夠提供源和目標之間的單向傳輸鏈路。每個數(shù)據(jù)流配置后都可以執(zhí)行:

常規(guī)類型事務(wù):存儲器到外設(shè)、外設(shè)到存儲器或存儲器到存儲器的傳輸。

雙緩沖區(qū)類型事務(wù):使用存儲器的兩個存儲器指針的雙緩沖區(qū)傳輸(當 DMA 正在進行自/至緩沖區(qū)的讀/寫操作時,應(yīng)用程序可以進行至/自其它緩沖區(qū)的寫/讀操作)。要傳輸?shù)臄?shù)據(jù)量(多達 65535)可以編程,并與連接到外設(shè) AHB 端口的外設(shè)(請求 DMA 傳輸)的源寬度相關(guān)。每個事務(wù)完成后,包含要傳輸?shù)臄?shù)據(jù)項總量的寄存器都會遞減。

DMA_SxCR 寄存器控制數(shù)據(jù)流到底使用哪一個通道,每個數(shù)據(jù)流有 8 個通道可供選擇,每次只能選擇其中一個通道進行 DMA 傳輸。接下來,我們看看 DMA2 的各數(shù)據(jù)流通道映射表,如表 28.1.1 所示:

DMA傳輸通道

每個通道都可以在有固定地址的外設(shè)寄存器和存儲器地址之間執(zhí)行DMA傳輸。DMA傳輸?shù)臄?shù)據(jù) 量是可編程的,大達到65535。包含要傳輸?shù)臄?shù)據(jù)項數(shù)量的寄存器,在每次傳輸后遞減。

可編程的數(shù)據(jù)量:外設(shè)和存儲器的傳輸數(shù)據(jù)量可以通過DMA_CCRx寄存器中的PSIZE和MSIZE位編程。

指針遞增模式

根據(jù) DMA_SxCR 寄存器中 PINC 和 MINC 位的狀態(tài),外設(shè)和存儲器指針在每次傳輸后可以自動向后遞增或保持常量。當設(shè)置為增量模式時,下一個要傳輸?shù)牡刂穼⑹乔耙粋€地址加上增量值。

通過單個寄存器訪問外設(shè)源或目標數(shù)據(jù)時,禁止遞增模式十分有用。

如果使能了遞增模式,則根據(jù)在 DMA_SxCR 寄存器 PSIZE 或 MSIZE 位中編程的數(shù)據(jù)寬度,下一次傳輸?shù)牡刂穼⑹乔耙淮蝹鬏數(shù)牡刂愤f增 1個數(shù)據(jù)寬度、2個數(shù)據(jù)寬度或 4個數(shù)據(jù)寬度。

存儲器到存儲器模式

DMA通道的操作可以在沒有外設(shè)請求的情況下進行,這種操作就是存儲器到存儲器模式。

當設(shè)置了DMA_CCRx寄存器中的MEM2MEM位之后,在軟件設(shè)置了DMA_CCRx寄存器中的EN位啟動DMA通道時,DMA傳輸將馬上開始。當DMA_CNDTRx寄存器變?yōu)?時,DMA傳輸結(jié)束。存儲器到存儲器模式不能與循環(huán)模式同時使用。

這里要注意僅 DMA2 的外設(shè)接口可以訪問存儲器,所以僅 DMA2 控制器支持存儲器到存儲器的傳輸,DMA1 不支持。

存儲器到存儲器模式不能與循環(huán)模式同時使用。

DMA中斷

每個DMA通道都可以在DMA傳輸過半、傳輸完成和傳輸錯誤時產(chǎn)生中斷。為應(yīng)用的靈活性考慮,通過設(shè)置寄存器的不同位來打開這些中斷。

使沒開啟,我們也可以通過查詢這些位來獲得當前 DMA 傳輸?shù)臓顟B(tài)。這里我們常用的是 TCIFx位,即數(shù)據(jù)流 x 的 DMA 傳輸完成與否標志。

可編程的數(shù)據(jù)傳輸寬度、對齊方式和數(shù)據(jù)大小端,當PSIZE和MSIZE不相同時,DMA模塊按照下圖進行數(shù)據(jù)對齊。

注意:在大容量產(chǎn)品中, DMA2 通道 4 和 DMA2 通道 5 的中斷被映射在同一個中斷向量上。在互聯(lián)型產(chǎn)品中, DMA2 通道 4 和 DMA2 通道 5 的中斷分別有獨立的中斷向量。所有其他的 DMA 通道都有自己的 中斷向量。

DMA的內(nèi)存占用

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

但是要注意:DMA 控制器和Cortex-M3核共享系統(tǒng)數(shù)據(jù)總線執(zhí)行直接存儲器數(shù)據(jù)傳輸。當CPU和DMA同時訪問相同的目標(RAM或外設(shè))時,DMA請求可能會停止 CPU訪問系統(tǒng)總線達若干個周期,總線仲裁器執(zhí)行循環(huán)調(diào)度,以保證CPU至少可以得到一半的系統(tǒng)總線(存儲器或外設(shè))帶寬。

DMA配置部分

此部分我們分為DMA寄存器和DMA庫函數(shù)分別介紹:

DMA寄存器

DMA配置參數(shù)包括:通道地址、優(yōu)先級、數(shù)據(jù)傳輸方向、存儲器/外設(shè)數(shù)據(jù)寬度、存儲器/外設(shè)地址是否增量、循環(huán)模式、數(shù)據(jù)傳輸量。

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

我們?nèi)绻_啟了 DMA_ISR 中這些中斷,在達到條件后就會跳到中斷服務(wù)函數(shù)里面去,即使沒開啟,我們也可以通過查詢這些位來獲得當前 DMA 傳輸?shù)臓顟B(tài)。這里我們常用的是 TCIFx,即通道 DMA 傳輸完成與否的標志。

注意此寄存器為只讀寄存器,所以在這些位被置位之后,只能通過其他的操作來清除。

DMA中斷標志清除寄存器(DMA_IFCR)

DMA_IFCR 的各位就是用來清除 DMA_ISR 的對應(yīng)位的,通過寫 0 清除。在 DMA_ISR 被置位后,我們必須通過向該位寄存器對應(yīng)的位寫入 0 來清除。

DMA通道x配置寄存器(DMA_CCRx)

該寄存器控制著 DMA 的很多相關(guān)信息,包括數(shù)據(jù)寬度、外設(shè)及存儲器的寬度、通道優(yōu)先級、增量模式、傳輸方向、中斷允許、使能等都是通過該寄存器來設(shè)置的。所以,DMA_CCRx 是 DMA 傳輸?shù)暮诵目刂萍拇嫫鳌?/p>

DMA通道x傳輸數(shù)量寄存器(DMA_CNDTRx)(x = 1…7)

這個寄存器控制 DMA 通道 x 的每次傳輸所要傳輸?shù)臄?shù)據(jù)量。其設(shè)置范圍為 0~65535。并且該寄存器的值會隨著傳輸?shù)倪M行而減少,當該寄存器的值為 0 時,就代表此次數(shù)據(jù)傳輸已經(jīng)全部發(fā)送完成了。所以,可以通過這個寄存器的值來知道當前 DMA 傳輸?shù)倪M度。

DMA通道x外設(shè)地址寄存器(DMA_CPARx)(x = 1…7)

該寄存器用來存儲 STM32 外設(shè)的地址,比如我們使用串口 1,那么該寄存器必須寫入 0x40013804(其實就是&USART1_DR)。如果使用其他外設(shè),就修改成相應(yīng)外設(shè)的地址就行了。

DMA通道x配置寄存器(DMA_CMARx)

該寄存器和 DMA_CPARx 差不多,不過是用來放存儲器的地址的。比如我們使用 SendBuf[5200]數(shù)組來做存儲器,那么我們在 DMA_CMARx 中寫入&SendBuff 就可以了。

DMA寄存器配置流程

通道配置過程,下面是配置DMA通道x的過程(x代表通道號):

在DMA_CPARx寄存器中設(shè)置外設(shè)寄存器的地址。發(fā)生外設(shè)數(shù)據(jù)傳輸請求時,這個地址將是數(shù)據(jù)傳輸?shù)脑椿蚰繕恕?/p>

在DMA_CMARx寄存器中設(shè)置數(shù)據(jù)存儲器的地址。發(fā)生外設(shè)數(shù)據(jù)傳輸請求時,傳輸?shù)臄?shù)據(jù)將從這個地址讀出或?qū)懭脒@個地址。

在DMA_CNDTRx寄存器中設(shè)置要傳輸?shù)臄?shù)據(jù)量。在每個數(shù)據(jù)傳輸后,這個數(shù)值遞減。

在DMA_CCRx寄存器的PL[1:0]位中設(shè)置通道的優(yōu)先級。

在DMA_CCRx寄存器中設(shè)置數(shù)據(jù)傳輸?shù)姆较颉⒀h(huán)模式、外設(shè)和存儲器的增量模式、外設(shè)和存儲器的數(shù)據(jù)寬度、傳輸一半產(chǎn)生中斷或傳輸完成產(chǎn)生中斷。

設(shè)置DMA_CCRx寄存器的ENABLE位,啟動該通道。

一旦啟動了DMA通道,它既可響應(yīng)連到該通道上的外設(shè)的DMA請求。當傳輸一半的數(shù)據(jù)后,半傳輸標志(HTIF)被置1,當設(shè)置了允許半傳輸中斷位(HTIE)時,將產(chǎn)生一個中斷請求。在數(shù)據(jù)傳輸結(jié)束后,傳輸完成標志(TCIF)被置1,當設(shè)置了允許傳輸完成中斷位 (TCIE)時,將產(chǎn)生一個中斷請求。

DMA庫函數(shù)

1.DMA初始化函數(shù)

DMA_DeInit(DMAX_ChannelX);

功能:將DMAyChannelx寄存器的初始化為其默認值。

注釋:RCC_ResetCmd中對DMA無定義,因此采用的直接操縱DMA寄存器的方式。

voidDMA_Init(DMA_Channel_TypeDef*DMAy_Channelx,DMA_InitTypeDef*DMA_InitStruct)

功能:設(shè)置要開啟的通道,還有一些參數(shù),包括外設(shè)基地址,存儲器基地址,傳輸?shù)臄?shù)據(jù)量,增量模式,數(shù)據(jù)寬度等。

具體看下方結(jié)構(gòu)體代碼介紹:

typedefstruct{
uint32_tDMA_PeripheralBaseAddr;
/*設(shè)置DMA源地址*/
uint32_tDMA_MemoryBaseAddr;
/*設(shè)置DMA目的地址*/
uint32_tDMA_DIR;
/*設(shè)置數(shù)據(jù)傳輸方向,決定是從外設(shè)讀取數(shù)據(jù)到內(nèi)存還送從內(nèi)存讀取數(shù)據(jù)發(fā)送到外設(shè),也就是外設(shè)是源地還是目的地
*/
uint32_tDMA_BufferSize;
/*設(shè)置傳輸大小*/
uint32_tDMA_PeripheralInc;
/*設(shè)置ReceiveBuff地址是否自增*/
uint32_tDMA_MemoryInc;
/*設(shè)置傳輸數(shù)據(jù)時候內(nèi)存地址是否遞,需要開啟*/
uint32_tDMA_PeripheralDataSize;
/*外設(shè)的數(shù)據(jù)長度是為字節(jié)傳輸(8bits),半字傳輸(16bits)還是字傳輸(32bits)*/
uint32_tDMA_MemoryDataSize;
/*設(shè)置內(nèi)存的數(shù)據(jù)長度*/
uint32_tDMA_Mode;
/*設(shè)置DMA的模式,正常模式/循環(huán)模式是否循環(huán)發(fā)送*/
uint32_tDMA_Priority;
/*設(shè)置DMA通道的優(yōu)先級,有低,中,高,超高四種模式*/
uint32_tDMA_M2M;
/*設(shè)置是否是存儲器到存儲器模式傳輸,*/}
DMA_InitTypeDef;

2.DMA使能函數(shù)

voidDMA_Cmd(DMA_Channel_TypeDef*DMAy_Channelx,FunctionalStateNewState);

功能:使能或者失能DMA外設(shè)。

例如:DMA_Cmd(DMA1_Channel1 , ENABLE);

3.DMA中斷使能函數(shù)

voidDMA_ITConfig(DMA_Channel_TypeDef*DMAy_Channelx,uint32_tDMA_IT,FunctionalStateNewState);
1

功能:配置指定的DMAy通道x的中斷。

注釋:DMA_IT_TC:傳輸完成 DMA_IT_HT:傳輸一半 DMA_IT_TE:傳輸錯誤。

例如:DMA_ITConfig(DMA1_Channel1 , DMA_IT_TC , ENABLE);

4.設(shè)置CNDTRx和讀CNDTRx函數(shù) (通道傳輸數(shù)據(jù)量)

voidDMA_SetCurrDataCounter(DMA_Channel_TypeDef*DMAy_Channelx,uint16_tDataNumber);
uint16_tDMA_GetCurrDataCounter(DMA_Channel_TypeDef*DMAy_Channelx);
12

作用:前者設(shè)置DMA通道的傳輸數(shù)據(jù)量(DMA處于關(guān)閉狀態(tài));后者獲取當前DMA通道傳輸剩余數(shù)據(jù)量(DMA處于開啟狀態(tài))。

DMA庫函數(shù)配置過程

  • 使能DMA時鐘:RCC_AHBPeriphClockCmd();

  • 初始化DMA通道:DMA_Init();

    • //設(shè)置通道;傳輸?shù)刂罚粋鬏敺较颍粋鬏敂?shù)據(jù)的數(shù)目;傳輸數(shù)據(jù)寬度;傳輸模式;優(yōu)先級;是否開啟存儲器到存儲器。
  • 使能外設(shè)DMA

    • 以串口為例:使能串口DMA發(fā)送,串口DMA使能函數(shù)。調(diào)用函數(shù):USART_DMACmd();
  • 使能DMA通道傳輸;函數(shù):DMA_Cmd();

  • 查詢DMA傳輸狀態(tài)。函數(shù):DMA_GetFlagStatus();

  • 獲取當前剩余數(shù)據(jù)量大小函數(shù):DMA_GetCurrDataCounter(DMA1_Channel4);

UART DMA傳輸

DMA就是一個搬運工,可以將數(shù)據(jù)從一個位置搬運到另一個位置。以UART為例,如果要接收數(shù)據(jù),會觸發(fā)UART中斷,然后CPU介入,在中斷中通過CPU將UART輸入寄存器的值讀出來,存放到內(nèi)存中;而DMA方式,產(chǎn)生UART中斷后,DMA直接參與,把UART輸入寄存器的值搬運到內(nèi)存中,CPU只需要在去檢查內(nèi)存的值就好了,這樣提高了CPU的效率。

DMA代碼配置

① DMA初始化配置

voiddma_init()
{

DMA_InitTypeDefDMA_InitStructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);

/*DMA配置*/

DMA_InitStructure.DMA_PeripheralBaseAddr=USART1_DR_Base;//串口數(shù)據(jù)寄存器地址
DMA_InitStructure.DMA_MemoryBaseAddr=(uint32_t)SendBuff;//內(nèi)存地址(要傳輸?shù)淖兞康闹羔?
DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralDST;//方向(從內(nèi)存到外設(shè))
DMA_InitStructure.DMA_BufferSize=500;//傳輸內(nèi)容的大小
DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable;//外設(shè)地址不增
DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Enable;//內(nèi)存地址自增
DMA_InitStructure.DMA_PeripheralDataSize=
DMA_PeripheralDataSize_Byte;//外設(shè)數(shù)據(jù)單位
DMA_InitStructure.DMA_MemoryDataSize=
DMA_MemoryDataSize_Byte;//內(nèi)存數(shù)據(jù)單位
DMA_InitStructure.DMA_Mode=DMA_Mode_Normal;//DMA模式:一次傳輸,循環(huán)
DMA_InitStructure.DMA_Priority=DMA_Priority_Medium;//優(yōu)先級:高
DMA_InitStructure.DMA_M2M=DMA_M2M_Disable;//禁止內(nèi)存到內(nèi)存的傳輸

DMA_Init(DMA1_Channel4,&DMA_InitStructure);//配置DMA1的4通道
DMA_Cmd(DMA1_Channel4,ENABLE);
DMA_SetCurrDataCounter(DMA_CH4,DMA1_MEM_LEN);//DMA通道的DMA緩存的大小
DMA_ITConfig(DMA1_Channel4,DMA_IT_TC,ENABLE);//配置DMA發(fā)送完成后產(chǎn)生中斷

}

DMA中斷

voidDMA1_Channel4_IRQHandler(void)
{
if(DMA_GetFlagStatus(DMA1_FLAG_TC4)==SET)
{

DMA_ClearFlag(DMA1_FLAG_TC4);
}
}

main函數(shù)

#defineSEND_BUF_SIZE500//發(fā)送數(shù)據(jù)長度,最好等于sizeof(TEXT_TO_SEND)+2的整數(shù)倍.

u8SendBuff[SEND_BUF_SIZE];//發(fā)送數(shù)據(jù)緩沖區(qū)
constu8TEXT_TO_SEND[]={"STM32F1DMA串口實驗"};
uint16_ti;
intmain(void)
{
uart_init(115200);//串口初始化為115200

for(i=0;i<500;i++)
{
SendBuff[i]=0xaf;
}
USART_DMACmd(USART1,USART_DMAReq_Tx,ENABLE);//使能串口dma傳輸

while(1);
}

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

    關(guān)注

    38

    文章

    7525

    瀏覽量

    164160
  • cpu
    cpu
    +關(guān)注

    關(guān)注

    68

    文章

    10899

    瀏覽量

    212615

原文標題:DMA配置部分

文章出處:【微信號:gh_a6560e9c41d7,微信公眾號:硬件筆記本】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    ZYNQ基礎(chǔ)---AXI DMA使用

    前言 在ZYNQ中進行PL-PS數(shù)據(jù)交互的時候,經(jīng)常會使用到DMA,其實在前面的ZYNQ學(xué)習(xí)當中,也有學(xué)習(xí)過DMA的使用,那就是通過使用自定義的IP,完成HP接口向內(nèi)存寫入和讀取數(shù)據(jù)的方式。同樣
    的頭像 發(fā)表于 01-06 11:13 ?404次閱讀
    ZYNQ基礎(chǔ)---AXI <b class='flag-5'>DMA</b>使用

    DMA是什么?詳細介紹

    系統(tǒng)性能。 DMA(直接內(nèi)存訪問)概述 1. DMA定義 直接內(nèi)存訪問(DMA)是一種硬件特性,允許外圍設(shè)備直接讀寫系統(tǒng)內(nèi)存,而不需要CPU的直接控制。這種技術(shù)
    的頭像 發(fā)表于 11-11 10:49 ?9982次閱讀

    電氣設(shè)備或電氣線路故障引起的火災(zāi)主要特征

    1 主要特征 ? 電氣火災(zāi)是由電氣設(shè)備或電氣線路故障引起的火災(zāi)。這類火災(zāi)具有一定的特殊性,主要特征如下: 1)突發(fā)性強 突發(fā)性:電氣火災(zāi)往往在沒有明顯征兆的情況下突然發(fā)生,不易被及時察覺。 瞬間爆發(fā)
    的頭像 發(fā)表于 09-12 18:00 ?607次閱讀
    電氣設(shè)備或電氣線路故障引起的火災(zāi)<b class='flag-5'>主要特征</b>

    DMA控制器的主要功能有哪些

    DMA(Direct Memory Access)控制器是一種在系統(tǒng)內(nèi)部轉(zhuǎn)移數(shù)據(jù)的獨特外設(shè),其主要功能是實現(xiàn)內(nèi)存與外設(shè)之間的直接數(shù)據(jù)傳輸,而無需CPU的頻繁干預(yù)。這種數(shù)據(jù)傳輸方式顯著提高了數(shù)據(jù)傳輸?shù)男屎退俣龋瑴p輕了CPU的負擔,使得CPU能夠更專注于執(zhí)行其他任務(wù)。
    的頭像 發(fā)表于 08-20 10:41 ?1794次閱讀

    揭秘車載VCU項目之外掛界的“大哥”DMA

    引腳配置此實例選擇CAN0進行配置。三、外設(shè)配置對于DMA,其采用的固定映射,對于通道0至通道15,其映射一部分外設(shè),通道16至通道31映射一部分外設(shè),所以對于外設(shè)要使用
    的頭像 發(fā)表于 07-30 08:11 ?753次閱讀
    揭秘車載VCU項目之外掛界的“大哥”<b class='flag-5'>DMA</b>

    GD32F3使用串口DMA時,相應(yīng)bsp里drv_dma.h文件中含有dma_subperipheral_enum報未定義錯誤的原因?

    GD32F3使用串口DMA時,相應(yīng)bsp里drv_dma.h文件中含有dma_subperipheral_enum,報未定義錯誤
    發(fā)表于 07-12 08:55

    生成式AI的定義特征

    行為,生成全新的、具有實際意義的數(shù)據(jù)或內(nèi)容。這種技術(shù)已經(jīng)在自然語言處理、圖像生成、音頻合成等多個領(lǐng)域展現(xiàn)出巨大的潛力和應(yīng)用價值。本文將詳細探討生成式AI的定義特征類,并通過代碼示例展示其在實際應(yīng)用中的實現(xiàn)。
    的頭像 發(fā)表于 07-05 17:33 ?1223次閱讀

    請問stm32H533 SPI DMA如何配置

    stm32H533的spi DMA如何配置,看了一下示例,沒有這方面的教程。
    發(fā)表于 07-05 06:01

    工業(yè)互聯(lián)網(wǎng)安全所具備的主要特征不包括哪些

    工業(yè)互聯(lián)網(wǎng)安全是一個復(fù)雜且不斷發(fā)展的領(lǐng)域,涉及到眾多方面。 一、工業(yè)互聯(lián)網(wǎng)安全的定義和重要性 工業(yè)互聯(lián)網(wǎng),也稱為工業(yè)4.0,是指通過互聯(lián)網(wǎng)技術(shù)將工業(yè)設(shè)備、系統(tǒng)和人員連接起來,實現(xiàn)智能化、自動化的生產(chǎn)
    的頭像 發(fā)表于 07-02 09:32 ?698次閱讀

    電容器擊穿的特征是什么

    電容器擊穿是指電容器的介質(zhì)層失去絕緣能力,導(dǎo)致電流突然大幅增加的現(xiàn)象。了解電容器擊穿的特征有助于正確使用電容器,并在設(shè)計電路時采取適當?shù)念A(yù)防措施。以下是電容器擊穿的幾個主要特征: 電容器的擊穿
    的頭像 發(fā)表于 06-09 17:17 ?2377次閱讀

    請問STM32F469使用16位SDRM時dma如何配置

    有個問題請教一下大家, STM469官方例程中使用 32位 SDRAM時 DMA配置如下: /* Configure common DMA parameters
    發(fā)表于 04-25 07:04

    stm32f401使用hall庫HAL_DMA_Init中DMA_SxCR寄存器的配置無效怎么解決?

    adc+dma采樣,代碼是通過cubemx生成的,調(diào)試時發(fā)現(xiàn)adc通過dma采集到的數(shù)據(jù)不對,通過單步仿真發(fā)現(xiàn)在HAL_DMA_Init函數(shù)中配置d
    發(fā)表于 03-15 06:16

    什么是DMADMA究竟有多快!

    直接內(nèi)存訪問(Direct Memory Access,DMA):在計算機體系結(jié)構(gòu)中,DMA 是一種數(shù)據(jù)傳輸方式,允許外部設(shè)備直接訪問計算機的內(nèi)存,而無需通過中央處理單元(CPU)的干預(yù)。這有
    的頭像 發(fā)表于 02-22 10:43 ?2144次閱讀
    什么是<b class='flag-5'>DMA</b>?<b class='flag-5'>DMA</b>究竟有多快!

    CY8C4248LQI-BL583自定義配置文件讀取特征設(shè)置失敗怎么解決?

    了自定義配置文件實現(xiàn)文檔,但這對我不起作用。有人能指導(dǎo)我嗎? 以下是我的主要代碼供你
    發(fā)表于 01-25 08:34

    STM32U5系列TIMER+DMA+DAC應(yīng)用演示

    有人使用STM32U575芯片的DAC功能。他希望使用TIMER事件觸發(fā)DMA,并通過DMA傳輸內(nèi)存數(shù)據(jù)到DAC輸出寄存器,進而產(chǎn)生相應(yīng)的DAC輸出波形。可他不知如何配置DMA并實現(xiàn)期
    的頭像 發(fā)表于 01-24 09:10 ?2025次閱讀
    STM32U5系列TIMER+<b class='flag-5'>DMA</b>+DAC應(yīng)用演示
    主站蜘蛛池模板: 99re久久热在线视频| CHINESE熟女老女人HD视频| 日本三级黄色大片| 男生J桶进女人P又色又爽又黄| 九九热这里只有精品2| 国产在线观看www| 国产亚洲精品AAAAAAA片| 国产乱对白精彩在线播放| 国产AV白丝爆浆在线播放| 搞av.com| 国产精品A久久777777| 高hbl双性浪荡古代| 国产99久9在线| 国产精品久久久久久精品...| 国产精品成人无码免费视频| 国产成人自拍视频在线观看| 国产电影午夜成年免费视频| 国产AV天堂亚洲AV麻豆| 高h肉文合集| 国产精品色吧国产精品| 国产永久免费观看视频软件| 好大快用力深一点h视频| 精品国产午夜肉伦伦影院| 久久精品国产亚洲AV麻豆欧美玲 | 色AV色婷婷97人妻久久久| 日本漫画之无彩翼漫画| 色一伦一情一区二区三区| 无码成人AAAAA毛片含羞草| 小妇人电影免费完整观看2021| 午夜国产一区在线观看| 亚洲精品无码久久久久A片空| 野花香在线观看免费观看大全动漫| 一个人看的HD免费高清视频| 中文国产乱码在线人妻一区二区| 1级午夜影院费免区| 99精品国产在热| xxxxxl荷兰| 国产高清-国产av| 后式大肥臀国产在线| 久久精品视频在线看| 嗯好大好猛皇上好深用力|