前言
本篇文章來講解DMA的概念,并使用DMA來進行串口的數(shù)據(jù)收發(fā)。
一、DMA概念
DMA(Direct Memory Access,直接內(nèi)存訪問)是一種計算機系統(tǒng)的技術,允許外部設備(如硬盤驅(qū)動器、網(wǎng)絡適配器或圖形卡)直接與計算機內(nèi)存進行數(shù)據(jù)傳輸,而不需要CPU的直接參與。這種直接的內(nèi)存訪問可以提高數(shù)據(jù)傳輸?shù)男?,并減輕CPU的負擔。
在沒有DMA的情況下,數(shù)據(jù)傳輸通常需要通過CPU來完成,這涉及到CPU的中斷處理程序從設備讀取數(shù)據(jù),然后將數(shù)據(jù)寫入內(nèi)存,或者從內(nèi)存讀取數(shù)據(jù),然后將數(shù)據(jù)發(fā)送到設備。這種方式會消耗CPU的時間和計算資源,限制了系統(tǒng)的性能和吞吐量。
通過DMA技術,外部設備可以直接與系統(tǒng)內(nèi)存進行數(shù)據(jù)傳輸,而不需要CPU的干預。在DMA傳輸開始之前,系統(tǒng)配置好DMA控制器,并提供一個DMA緩沖區(qū),外部設備可以將數(shù)據(jù)直接寫入到該緩沖區(qū)或者從該緩沖區(qū)讀取數(shù)據(jù)。當DMA傳輸完成后,DMA控制器會發(fā)出一個中斷信號,以通知CPU。
使用DMA的好處包括:
1.提高數(shù)據(jù)傳輸速度:由于數(shù)據(jù)傳輸不需要CPU的介入,DMA可以以更高的速度進行數(shù)據(jù)傳輸,從而提高系統(tǒng)性能和吞吐量。
2.減輕CPU負擔:傳統(tǒng)的數(shù)據(jù)傳輸需要CPU的參與,消耗CPU的時間和計算資源。而使用DMA進行數(shù)據(jù)傳輸時,CPU可以專注于其他的計算任務,減輕了CPU的負擔。
3.支持大規(guī)模數(shù)據(jù)傳輸:DMA技術可以支持大規(guī)模的數(shù)據(jù)傳輸,例如高清視頻流、大型文件和網(wǎng)絡數(shù)據(jù)包的處理。
總之,DMA是一種能夠提高系統(tǒng)性能和數(shù)據(jù)傳輸效率的技術,通過允許外部設備直接與內(nèi)存進行數(shù)據(jù)傳輸,減少了CPU的介入。這在需要高速、大量或連續(xù)數(shù)據(jù)傳輸?shù)膱鼍爸刑貏e有用,如高性能計算、網(wǎng)絡通信和存儲系統(tǒng)等。
二、STM32 DMA數(shù)據(jù)手冊分析
從DMA的描述來看在STM32 F103這款芯片中有DMA1和DMA2,DMA1有7個通道,DMA2有5個通道。
DMA架構圖:
DMA支持直接和SRMA進行數(shù)據(jù)的傳輸,不需要經(jīng)過CPU,這樣就可以讓CPU去做其他的事情,提高系統(tǒng)的運行效率。
使用DMA(Direct Memory Access)進行數(shù)據(jù)傳輸時,通常需要經(jīng)過以下步驟:
1.設置DMA控制器:首先,需要在系統(tǒng)中配置和設置DMA控制器。這包括設置DMA的源地址和目標地址,傳輸長度,傳輸方向(從內(nèi)存到設備或從設備到內(nèi)存),以及其他相關參數(shù)。
2.發(fā)送DMA請求:在數(shù)據(jù)傳輸之前,需要向DMA控制器發(fā)送DMA請求。該請求通常由CPU或設備發(fā)起,用于指示DMA控制器執(zhí)行特定的數(shù)據(jù)傳輸操作。
3.DMA傳輸:一旦DMA請求被接收和識別,DMA控制器將啟動數(shù)據(jù)傳輸。它將直接從源地址讀取數(shù)據(jù),并將數(shù)據(jù)傳輸?shù)侥繕说刂?。在傳輸過程中,DMA控制器繞過CPU,直接控制內(nèi)存和設備之間的數(shù)據(jù)傳輸,以提高數(shù)據(jù)傳輸效率并減輕CPU的負擔。
4.中斷或完成通知:一旦DMA傳輸完成,DMA控制器通常會生成一個中斷信號或發(fā)送一個完成通知,以通知CPU或相關設備傳輸已經(jīng)完成。
正常進行數(shù)據(jù)的發(fā)送:
不使用DMA進行串口的數(shù)據(jù)發(fā)送時,CPU需要從SRMA中讀取出存儲的數(shù)據(jù),然后再發(fā)送給串口,發(fā)送少量數(shù)據(jù)是不會影響CPU執(zhí)行其他事情的,假如我想發(fā)送10000個數(shù)據(jù),那么這個時候就會讓CPU處于一直在發(fā)送數(shù)據(jù)的狀態(tài),這樣就會影響到其他程序的執(zhí)行。
根據(jù)手冊描述DMA和CPU共享總線來執(zhí)行直接的內(nèi)存?zhèn)鬏敗?br>
DMA可以直接訪問到外設和SRMA,那么這樣就不需要CPU來進行數(shù)據(jù)的讀取交換了,直接使用DMA就可以解決這個問題,那么這樣的話就可以提高系統(tǒng)的運行效率了。
3.DMA模式介紹
下面我們來看到DMA的兩種模式,一種是循環(huán)模式,一種是內(nèi)存到內(nèi)存的模式。
DMA的循環(huán)模式(Circular Mode):
在循環(huán)模式下,DMA傳輸?shù)臄?shù)據(jù)可以在源和目的地之間循環(huán)傳輸,以連續(xù)地進行數(shù)據(jù)傳輸操作。這種模式下,一旦DMA傳輸完成,它會自動重新開始下一輪傳輸,而無需軟件干預。
循環(huán)模式對于需要在連續(xù)數(shù)據(jù)塊之間進行重復傳輸?shù)膽梅浅S杏?,如音頻、視頻流等。它可以在不中斷DMA傳輸?shù)那闆r下循環(huán)傳輸數(shù)據(jù),大大提高了數(shù)據(jù)傳輸效率和系統(tǒng)性能。
DMA的內(nèi)存到內(nèi)存模式(Memory-to-memory Mode):
內(nèi)存到內(nèi)存模式允許DMA直接在兩個內(nèi)存區(qū)域之間進行數(shù)據(jù)傳輸,而無需外設的參與。在這種模式下,DMA通道可以從一個內(nèi)存位置讀取數(shù)據(jù),并將數(shù)據(jù)直接寫入另一個內(nèi)存位置,而不需要CPU的介入。
內(nèi)存到內(nèi)存模式非常適用于需要在內(nèi)存之間快速傳輸數(shù)據(jù)的應用場景,例如內(nèi)存拷貝、內(nèi)存填充等。通過使用這種模式,DMA可以獨立地執(zhí)行數(shù)據(jù)傳輸,減輕CPU的負擔,提高傳輸效率。
總結(jié):DMA的循環(huán)模式允許數(shù)據(jù)在源和目的地之間循環(huán)傳輸,連續(xù)進行數(shù)據(jù)傳輸操作,并在每次傳輸完成后自動重新開始下一輪傳輸。而DMA的內(nèi)存到內(nèi)存模式允許DMA直接在兩個內(nèi)存區(qū)域之間傳輸數(shù)據(jù),而不需要外設的觸發(fā)請求,并且能夠快速、高效地在內(nèi)存之間傳輸數(shù)據(jù)。這兩種模式都有助于提高數(shù)據(jù)傳輸效率并減輕CPU的負擔,適用于不同的應用場景。
4.cubemx配置
配置一個LED燈觀察實驗現(xiàn)象:
配置串口1:
開啟串口中斷:
這里不開啟串口中斷的話無法判斷串口是否發(fā)送完成一次數(shù)據(jù),這樣串口就一直處于忙狀態(tài)導致完成進行下一次的發(fā)送。
DMA通道設置:
TX設置為從內(nèi)存到外設,因為串口的發(fā)送就是把內(nèi)存中的數(shù)據(jù)取出來再發(fā)給外設,RX設置為從外設到內(nèi)存,串口發(fā)送過來的數(shù)據(jù)將會保存在內(nèi)存中。
模式選擇Normal,循環(huán)模式的話只需要調(diào)用一次發(fā)送函數(shù)就會一直進行數(shù)據(jù)的發(fā)送了。
具體代碼:
這里發(fā)送一個非常長的數(shù)據(jù),同時讓這個LED閃爍,看看串口的發(fā)送會不會影響到LED的閃爍,結(jié)果是不會的。文章來源:http://www.zghlxwxcb.cn/news/detail-678799.html
uint8_t msg[1024] = "hellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohello";
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
HAL_UART_Transmit_DMA(&huart1, msg, strlen(msg) + 1);
HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_5);
HAL_Delay(100);
}
總結(jié)
本篇文章就講解到這里,下篇文章我們講解DMA的具體配置和DMA串口接收不定長數(shù)據(jù)。文章來源地址http://www.zghlxwxcb.cn/news/detail-678799.html
到了這里,關于STM32 cubemx配置USART DMA傳輸?shù)奈恼戮徒榻B完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!