STM32家族中的很多系列,比如STM32G0/STM32G4/STM32L4+/STM32H7等都內置了DMAMUX模塊。有了它一方面使得DMA請求與DMA控制器之間的映射關系更為靈活方便,同時也大大拓展了DMA請求事件,不再局限于外設事件,比方可以基于GPIO的外部中斷事件、或者DMA事件本身來觸發DMA傳輸。另外,DMA傳輸的實現還可以基于其它觸發事件來同步其操作,即DMA傳輸的實現需要借助其它同步事件來真正啟動。
本文就基于STM32G4芯片簡單介紹下該話題,這里要實現的功能大致是這樣的:片內低功耗定時器LPTIM1的定時輸出作為DMAMUX的DMA同步輸入事件,該同步事件觸發UART的DMA傳輸,通過UART輸出一段字符。
本演示例程基于STM32G4系列的Nucleo板進行。低功耗定時器LPTIM工作在PWM輸出模式,DMAMUX基于LPTIM每次的定時輸出事件為UART2申請一定數目的DMA請求,然后DMA將數據從內存送到UART的數據寄存器并最終將內容顯示在PC串口終端。
下面就直接使用STM32CubeMx進入配置過程。
通過CubeMx神器做基本的初始化配置【RCC配置此處就省略了】。
LPTIM1的參考配置如下,具體應用時請結合實際情況來定,這里只需能產生周期性定時輸出即可。
UART2外設沒有什么特別要提醒的,這里就不貼截圖了。我們重點看看有關UART TX的DMA傳輸的相關配置。
上圖中藍色圈里的勾選框對于本應用演示不是必須勾選的,勾選了也沒關系,不會對本演示產生影響。DMA請求數設置為21,表示每檢測到1個同步事件后DMAMUX為UART傳輸申請21個DMA請求,以批量傳輸21個字符“STM32 DMA SYNCDEMO ”。
完成圖形化配置后,生成初始化代碼并添加必要的用戶代碼。
#definePeriodValue (1000)
#define PulseValue (500)
#define Size (21)
uint8_tpData[Size]={‘S’,‘T’,‘M’,‘3’,‘2’,‘ ’,‘D’,‘M’,‘A’,‘ ’,
‘S’,‘Y’,‘N’,‘C’,‘’,‘D’,‘E’,‘M’,‘O’,‘ ’,‘ ’};
HAL_LPTIM_PWM_Start(&hlptim1, PeriodValue, PulseValue) ;
HAL_UART_Transmit_DMA(&huart2, pData, Size);
編譯運行,驗證結果。
代碼運行后,可以通過示波器看到LPTIM的周期性PWM輸出,同時PC端也可以看到如上面截圖所示的周期性呈現的字符串。
OK,本次基于DMAMUX同步事件的應用演示就介紹到這里,供君參考,更多細節還請閱讀STM32相關技術手冊。
編輯:jq
-
示波器
+關注
關注
113文章
6194瀏覽量
184526 -
PWM
+關注
關注
114文章
5147瀏覽量
213413 -
PC
+關注
關注
9文章
2066瀏覽量
154031 -
代碼
+關注
關注
30文章
4751瀏覽量
68358
原文標題:基于STM32 DMAMUX DMA同步事件的應用示例
文章出處:【微信號:aidanpianji,微信公眾號:單片機】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論