前言
在嵌入式系統(tǒng)中,串口通信是一項至關(guān)重要的功能,它允許單片機與外部設(shè)備進行數(shù)據(jù)交換,如傳感器、顯示器或其他設(shè)備。然而,在高速數(shù)據(jù)傳輸?shù)膱鼍跋?,傳統(tǒng)的串口通信方式可能會使CPU過于繁忙,從而影響系統(tǒng)的性能。為了解決這一問題,STM32系列微控制器提供了DMA(直接內(nèi)存訪問)技術(shù),可以在不占用CPU資源的情況下實現(xiàn)高速的數(shù)據(jù)傳輸。本文將介紹如何利用STM32 CubeMX配置串口通信并使用DMA進行數(shù)據(jù)傳輸。
一、DMA方式
1.1 DMA是什么
想象一下你在單片機中需要把一堆數(shù)據(jù)從一個地方搬到另一個地方,比如從內(nèi)存搬到外設(shè)(比如串口或者存儲器)。傳統(tǒng)的方式是由CPU來親自操持每一個數(shù)據(jù)的傳輸,就像你親自搬運每一件家具一樣。
而DMA就像是單片機中的一支專業(yè)的搬家隊伍。你可以告訴這支隊伍從哪里搬到哪里,然后它們就可以自動完成這個任務,而不需要CPU一直牽頭指揮。這樣,CPU就可以專注于處理其他的事務,而不用為每個數(shù)據(jù)傳輸都忙碌起來。
所以,單片機中的DMA就是一種讓數(shù)據(jù)在不需要CPU持續(xù)參與的情況下,在內(nèi)存和外設(shè)之間自動傳輸?shù)募夹g(shù),使得單片機能更高效地完成一些數(shù)據(jù)搬運的任務。簡而言之,就是讓單片機變得更聰明、更省力。
比如下面這個圖,如果我們使用普通的發(fā)送RAM里面的buf,那么cpu就要一位一位的取buf,放到串口發(fā)送寄存器中,那么就非常耗費時間,那么這時DMA就出現(xiàn)了,他可以直接讓cpu把RAM里面的buf放到DMA,然后DMA自動把buf放到發(fā)送寄存器里,放到寄存器這個過程cpu是不參與的
他不僅可以發(fā)送,還可以把接收的寄存器放到DMA中,然后放到RAM中
1.2 CubeMX配置DMA
打開我們的串口,選擇DMA設(shè)置,然后添加一個DMA,其中的DMA Request就是你為了什么而使用DMA,比如為了發(fā)送,為了接收都可以設(shè)置。
模式的設(shè)置:
模式有兩種,一種是Normal,一種是circular
Normal:比如要傳輸1000字節(jié),傳輸完了就ok了,不傳輸了
circular:比如要傳輸1000字節(jié),傳輸完了,他會從開頭,再傳輸一次
注意:這里不能打勾
Memory需要打勾
1.3 DMA方式函數(shù)使用
DMA的發(fā)送
我們可以使用下面這個函數(shù)進行發(fā)送:
HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size);
他的參數(shù)為串口對象,要發(fā)送的data,要發(fā)送的大小。
比如說,我們可以這樣:
HAL_UART_Transmit_DMA(&huart1,(uint8_t *)"Hello DMA",sizeof("Hello DMA"));
那么我們可以在串口里看到打印的數(shù)據(jù):
上面這個函數(shù)的中斷如下:
__weak void HAL_UART_TxHalfCpltCallback(UART_HandleTypeDef *huart)
__weak void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
當DMA發(fā)送完一半時,調(diào)用第一個回調(diào)函數(shù)
當DMA發(fā)送完時,調(diào)用第二個回調(diào)函數(shù)
接收函數(shù)
我們可以使用下面這個函數(shù)進行接收:
HAL_StatusTypeDef HAL_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
他的參數(shù)為串口對象,要接收的buf,要接收的大小。
上面這個函數(shù)的中斷如下:
__weak void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);
__weak void HAL_UART_RxHalfCpltCallback(UART_HandleTypeDef *huart);
對于純DMA接收是沒有意義的,比如你和外設(shè)通信,你調(diào)用DMA的接收,你還要去指定你要接收多少字節(jié),可是,每次接收的都是不一樣的啊,大小根本指定不了,所以DMA接收要和下節(jié)課的IDLE中斷一起才有意義文章來源:http://www.zghlxwxcb.cn/news/detail-830743.html
總結(jié)
通過本文的介紹,我們學習了如何在STM32 CubeMX中配置串口通信并使用DMA進行數(shù)據(jù)傳輸。首先,我們利用CubeMX配置了串口通信的基本參數(shù),包括波特率、數(shù)據(jù)位數(shù)和停止位數(shù)等。然后,我們配置了DMA通道,將串口接收和發(fā)送的數(shù)據(jù)直接傳輸?shù)絻?nèi)存,而不需要CPU的干預。這樣一來,系統(tǒng)的CPU資源就可以得到釋放,提高了系統(tǒng)的性能和效率。最后,我們可以根據(jù)具體的應用場景,編寫相應的串口通信代碼,實現(xiàn)數(shù)據(jù)的接收和發(fā)送功能。通過合理地利用DMA技術(shù),我們可以在嵌入式系統(tǒng)中實現(xiàn)高效可靠的串口通信功能,為各種應用場景提供了更好的支持。文章來源地址http://www.zghlxwxcb.cn/news/detail-830743.html
到了這里,關(guān)于【STM32 CubeMX】串口編程DMA的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!