這里使用STM32G4系列Nucleo開發(fā)板演示如下需求的實(shí)現(xiàn)過程。
TIMER2使用3個(gè)通道的PWM輸出,占空比可能被不時(shí)修改。修改的數(shù)據(jù)通過UART傳輸過來,UART接收的數(shù)據(jù)通過DMA傳輸?shù)絻?nèi)存。新的數(shù)據(jù)接收后,基于TIMER更新事件觸發(fā)DMA,利用TIMER的更新事件觸發(fā)DMA Burst 而一次性用新數(shù)據(jù)修改3個(gè)通道的CCR值以調(diào)整PWM輸出。每次新數(shù)據(jù)的接收允許以產(chǎn)生按鍵動(dòng)作為準(zhǔn),即每次按鍵動(dòng)作允許一次數(shù)據(jù)更新。

這里有兩點(diǎn)要注意,TIM2是32位定時(shí)器,3個(gè)CCR數(shù)據(jù)使用32位格式。另外,3個(gè)數(shù)據(jù)的修改基于更新事件一次性修改,不能出現(xiàn)混亂,即不可以某一個(gè)時(shí)刻3個(gè)CCR寄存器的數(shù)據(jù)不是來自同一批的。為了避免數(shù)據(jù)混亂這種情況,我這里平常禁止TIMER2的更新事件的產(chǎn)生,只有每次收到新數(shù)據(jù)后才臨時(shí)允許更新事件的產(chǎn)生,并在TIMER觸發(fā)的DMA完成中斷里再次禁止更新事件的產(chǎn)生。
使用LPUART從外部接收新數(shù)據(jù),選用LPUART主要原因是它的TX/RX剛好跟G4Nucleo開發(fā)板的虛擬串口接在一起的,并無其它特別原因。至于按鍵就選用板載按鍵PC13,并開啟了對(duì)應(yīng)的外部中斷。
大致的數(shù)據(jù)傳輸流程如下圖所示:

關(guān)于定時(shí)器更新事件的能否產(chǎn)生的控制由TIMER的控制寄存器里的UDIS位決定:

我在代碼里對(duì)該位的操作,寫成宏的方式,便于閱讀。

該位默認(rèn)為0。若該位被軟件置1,定時(shí)器的更新事件將不能產(chǎn)生,意味著開啟預(yù)裝功能時(shí),影子寄存器內(nèi)容不能被更新,同時(shí)也不能因溢出操作、計(jì)數(shù)器復(fù)位操作而觸發(fā)相應(yīng)中斷或DMA請(qǐng)求 。
測(cè)試代碼的里幾個(gè)主要的基本操作:
一、響應(yīng)按鍵事件,啟動(dòng)UART的DMA接收。
HAL_UART_Receive_DMA(&hlpuart1,(uint8_t*)CCR_rx, 12);
二、基于UART事件的DMA接收完成中斷,允許TIMER更新事件的產(chǎn)生,并啟動(dòng)基于TIMER更新事件的DMA Burst 傳輸。
Permit_UpdateEvt; //Updated event permitted
HAL_TIM_DMABurst_MultiWriteStart(&htim2,TIM_DMABASE_CCR1,TIM_DMA_UPDATE,(uint32_t*)CCR_rx,TIM_DMABURSTLENGTH_3TRANSFERS,3);
三、基于TIMER事件的DMA完成中斷,禁止更新事件的產(chǎn)生,并基于串口通信提示可以接受下次數(shù)據(jù)更新。
__HAL_TIM_CLEAR_FLAG(&htim2,TIM_FLAG_UPDATE);
Forbid_UpdateEvt;//update event forbidden
Indicating_CCR_Updated();
再看看基本的CubeMx配置,配置比較簡(jiǎn)單。下面是LPUART的配置貼圖。


我開啟LPUART 的DMA接收,其發(fā)送功能使用查詢阻塞模式,主要用來輸出一些提示信息。
下面是TIM2的一些基本配置截圖。開啟3個(gè)通道的PWM輸出和基于TIMER更新事件的DMA傳輸。


最后,我們來簡(jiǎn)單驗(yàn)證下。下面截圖就是通過串口助手鍵入新數(shù)據(jù)后TIMER的輸出結(jié)果。

整體上,操作流程就是每次按鍵操作提示可以修改占空比了;串口終端鍵入新的3個(gè)字的數(shù)據(jù),基于UART接收事件的DMA傳輸完成后提示數(shù)據(jù)收到;基于TIMER事件的DMA完成完成后提示數(shù)據(jù)更新結(jié)束,提示等待下次按鍵動(dòng)作。
好,今天的分享就到這里,下次再聊。如果有人想要完整的測(cè)試工程代碼的話,可以私下留言,只要時(shí)間不是過去太久且我這邊有保存的話,都可以分享供參考。
-
內(nèi)存
+關(guān)注
關(guān)注
8文章
3163瀏覽量
76027 -
STM32
+關(guān)注
關(guān)注
2302文章
11111瀏覽量
370388 -
uart
+關(guān)注
關(guān)注
22文章
1295瀏覽量
105925 -
dma
+關(guān)注
關(guān)注
3文章
577瀏覽量
105128 -
開發(fā)板
+關(guān)注
關(guān)注
25文章
6063瀏覽量
111538
原文標(biāo)題:STM32G4 UART+TIMER+DMA應(yīng)用示例
文章出處:【微信號(hào):stmcu832,微信公眾號(hào):茶話MCU】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
如何使用STM32CubeMX HAL通過DMA + DAC生成STM32G474信號(hào)?
基于STM32G4芯片的DAC應(yīng)用示例分享
通過STM32 UART及DMA修改TIMER占空比示例
AN5310_使用STM32F3系列與STM32G4系列設(shè)備的模擬特性指南
UM2492_從STM32G4系列的STM32CubeG4開始的用戶手冊(cè)
STM32G4電機(jī)驅(qū)動(dòng)實(shí)例
基于STM32G4的電機(jī)控制項(xiàng)目開發(fā)
STM32G4 Advanced Timer Break功能詳解
STM32G4市場(chǎng)和特性篇

STM32G4 UART+TIMER+DMA應(yīng)用示例
評(píng)論