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