有人通過(guò)公眾號(hào)微信留言,詢問(wèn)是否有關(guān)于STM32 DMAMUX模塊具體的應(yīng)用示例代碼。同時(shí),個(gè)人也發(fā)現(xiàn),雖然STM32片內(nèi)的DMAMUX不是什么新模塊,似乎還是很多人并不太熟悉。這里借機(jī)聊聊這方面的內(nèi)容,重點(diǎn)演示相關(guān)功能的實(shí)現(xiàn),以供參考。
其實(shí),DMAMUX作為一個(gè)外設(shè)模塊,操作它并不需要添加太多用戶代碼,尤其是當(dāng)我們基于STM32CubeMx進(jìn)行配置時(shí)。它的主要功能就是為各種DMA請(qǐng)求做DMA傳輸通道的靈活調(diào)度與安排,并配合DMA使用,我們可以把它看成DMA控制器的前端拓展。
DMAMUX模塊大體上由DMA請(qǐng)求轉(zhuǎn)發(fā)通道和DMA請(qǐng)求發(fā)生器組成,其中每個(gè)DMA請(qǐng)求轉(zhuǎn)發(fā)通道還配有同步控制單元。DMA請(qǐng)求發(fā)生器可以基于某些事件產(chǎn)生DMA請(qǐng)求申請(qǐng)DMA傳輸。至于同步控制單元,可以簡(jiǎn)單理解為每個(gè)DMA請(qǐng)求最終是否被轉(zhuǎn)發(fā)出去的一個(gè)控制開關(guān),就像蓄勢(shì)待發(fā)的田徑選手有時(shí)還得等信號(hào)槍響一樣。
上圖是DMAMUX與DMA功能關(guān)聯(lián)示意圖,供理解參考。關(guān)于STM32 DMAMUX的基本功能及特性,可以閱讀本公眾號(hào)的另外一篇分享筆記《STM32芯片中的DMAMUX是干啥用的?》,這里就不對(duì)其功能原理及特性贅述了。
下面使用STM32G0系列Nucleo板重點(diǎn)演示其主要功能的實(shí)現(xiàn)。實(shí)驗(yàn)會(huì)用到PC13的外部中斷功能,LPTIM1的輸出功能、USART2外設(shè)和USART1外設(shè)基于DMA方式的通信功能。
我們先看看DMAMUX的路由轉(zhuǎn)發(fā)功能。
DMAMUX對(duì)DMA請(qǐng)求做路由轉(zhuǎn)發(fā)是其基本功能,應(yīng)該也是設(shè)計(jì)它的初衷。我們平常使用該功能時(shí)是沒(méi)啥明顯感覺(jué)的,就像我們通過(guò)HUB讓USB設(shè)備跟PC通信一樣,尤其是在基于STM32CubeMx進(jìn)行配置時(shí)。如果說(shuō),你之前用過(guò)其它不帶DMAMUX的STM32系列的DMA功能,再來(lái)使用帶DMAMUX的DMA功能時(shí),使用STM32CubeMx工具做DMA配置,會(huì)發(fā)現(xiàn)DMA可選通道突然變多且可隨意選擇。不妨看看下圖基于STM32F4【不帶DMAMUX】和STM32G0系列【內(nèi)置DMAMUX】對(duì)UART2接收進(jìn)行DMA配置時(shí)的情形,差別一目了然。
說(shuō)到這里,順便介紹下目前內(nèi)置DMAMUX模塊的STM32系列。我從ST官方應(yīng)用筆記AN5224截圖過(guò)來(lái),下面這些系列都內(nèi)置了DMAMUX。后面我以STM32G0芯片演示相關(guān)功能的實(shí)現(xiàn)。
我們接下來(lái)來(lái)看看DMAMUX的第2個(gè)功能---DMA請(qǐng)求生成功能。它能基于某些特定事件產(chǎn)生DMA請(qǐng)求,請(qǐng)求的個(gè)數(shù)可以從1~32之間。這里的特定事件主要是指各種外部中斷事件和少數(shù)幾個(gè)路由通道的DMA事件以及LPTIM的輸出事件。
這里使用STM32G071的PC13外部中斷功能。每次按鍵事件經(jīng)DMAMUX的DMA generator申請(qǐng)10個(gè)DMA請(qǐng)求,讓DMA將內(nèi)存字符數(shù)據(jù)傳輸?shù)経ART2的數(shù)據(jù)發(fā)送寄存器,最終在串口終端顯示字符串“Key In!”。下面是有關(guān)PC13外部中斷和DMAMUX generator的配置。【注:下面代碼都是基于HAL庫(kù)的】
使用UART2將字符串輸出到串口終端,UART2的基本配置如下:
創(chuàng)建工程,添加下面用戶代碼【基于HAL庫(kù)】后即可驗(yàn)證結(jié)果:
現(xiàn)在繼續(xù)看看DMAMUX的同步功能。針對(duì)該功能,這里再做兩個(gè)小演示。
第一個(gè)演示,用DMA傳輸完成產(chǎn)生觸發(fā)事件去觸發(fā)另一個(gè)DMA傳輸操作。具體來(lái)說(shuō),我開啟UART2的DMA方式收、發(fā)功能,從串口終端發(fā)送數(shù)據(jù)給UART2,UART2通過(guò)DMA方式收到數(shù)據(jù)后,基于DMAMUX產(chǎn)生DMA事件,觸發(fā)UART2將剛才收到的數(shù)據(jù)回顯到串口終端。從串口終端發(fā)送數(shù)據(jù)到再回顯于串口終端一氣呵成,無(wú)須CPU參與。
UART2的基本參數(shù)配置跟前面一樣,不重復(fù)貼圖了。下面是有關(guān)UART2 DMA接收的配置:
在上面UART2 DMA接收配置中,使能了DMA 事件功能。該事件將作為UART2 DMA發(fā)送的同步事件。下圖是有關(guān)UART2 DMA發(fā)送的配置,啟用了同步觸發(fā)功能。
基于上面配置創(chuàng)建工程,添加必要代碼即可驗(yàn)證結(jié)果。結(jié)果就是UART2每收到10個(gè)數(shù)據(jù)后立即通過(guò)DMA方式回顯在串口終端。見下面截圖:
最后再演示一個(gè)DMAMUX同步功能的實(shí)現(xiàn)案例。使用LPTIM的輸出產(chǎn)生周期性的觸發(fā)事件,作為UART1 DMA發(fā)送的同步事件。每次LPTIM產(chǎn)生觸發(fā)事件,UART1就通過(guò)DMA發(fā)送一串字符出去。這里使用UART1自發(fā)自收來(lái)驗(yàn)證。顯然,UART1每發(fā)送一串字符出去也同時(shí)收到同一串字符。下面是LPTIM1的參數(shù)配置,沒(méi)啥過(guò)多解釋的.
下面是有關(guān)UART1 DMA方式收發(fā)功能的配置,重點(diǎn)關(guān)注其DMA發(fā)送的配置。開啟UART1 DMA發(fā)送的同步觸發(fā),LPTIM輸出的上沿作為其同步事件。至于UART1 DMA接收功能保持常規(guī)配置即可,不做同步也不產(chǎn)生DMA輸出事件。
基于上面配置,添加幾行用戶代碼即可驗(yàn)證結(jié)果。參看下面截圖:
基于上面配置,如果我們不啟動(dòng)LPTIM1的話,可以發(fā)現(xiàn)UART1永遠(yuǎn)不會(huì)發(fā)送數(shù)據(jù),自然它也接收不到任何數(shù)據(jù)。
關(guān)于STM32 DMAMUX的應(yīng)用演示就介紹到這里。不難看出,使用DMAMUX相關(guān)功能及特性時(shí),所需應(yīng)用代碼不多也不復(fù)雜,關(guān)鍵在原理及配置。DMAMUX有時(shí)會(huì)給我們的應(yīng)用帶來(lái)一些意想不到的方便,可以善加利用。
好,就此打住,下次再聊~!
審核編輯:劉清
-
發(fā)生器
+關(guān)注
關(guān)注
4文章
1395瀏覽量
62488 -
STM32
+關(guān)注
關(guān)注
2289文章
11011瀏覽量
362271 -
外部中斷
+關(guān)注
關(guān)注
1文章
133瀏覽量
16095 -
DMA控制器
+關(guān)注
關(guān)注
1文章
43瀏覽量
12560 -
stm32cubemx
+關(guān)注
關(guān)注
5文章
286瀏覽量
15968
原文標(biāo)題:STM32 DMAMUX應(yīng)用示例
文章出處:【微信號(hào):stmcu832,微信公眾號(hào):茶話MCU】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
DMAMUX模塊的大致原理及基本框架

STM32L4R5的DMAMUX異常原因?
請(qǐng)問(wèn)STM32L4R5ZI的DMA/DMAMUX是怎么管理請(qǐng)求?
LabVIEW關(guān)于USRPRIO的示例代碼
STM32 M4 時(shí)鐘配置示例源代碼和工程文件免費(fèi)下載

關(guān)于STM32浮點(diǎn)運(yùn)算單元FPU的應(yīng)用示例

STM32多個(gè)ADC模塊同時(shí)采樣轉(zhuǎn)換的應(yīng)用示例

STM32DAC講解及代碼示例

STM32F1復(fù)習(xí)筆記一

華為游戲服務(wù)示例代碼教程案例
自己編寫函數(shù)示例代碼很難嗎?分享幾個(gè)示例!

評(píng)論