現(xiàn)在有人有這樣一個(gè)需求,他使用STM32F429芯片做開(kāi)發(fā),其中用到32位的TIM2實(shí)現(xiàn)3路PWM輸出。
另外有上位機(jī)跟STM32的UART接口相連,上位機(jī)可能不定期地需要通過(guò)UART接口給STM32發(fā)送新的占空比參數(shù),而且每次都發(fā)送3個(gè)比較輸出通道的參數(shù)【12個(gè)字節(jié)】。
如何快捷地實(shí)現(xiàn)這個(gè)功能呢?要求收到數(shù)據(jù)后盡快修改3個(gè)比較通道的參數(shù)。
前一篇重點(diǎn)介紹了利用DMAFIFO和UART接收事件觸發(fā)DMA傳輸實(shí)現(xiàn)了3個(gè)CCR寄存器的批量修改。
我們不妨就該話題稍作拓展,不再局限于某個(gè)STM32系列,而是從整個(gè)STM32的資源上考慮當(dāng)前需求。上次提到3種實(shí)現(xiàn)方案,我想借此機(jī)會(huì)再給大家介紹另外一種實(shí)現(xiàn)方案,以拓寬未來(lái)解決類似問(wèn)題的思路。
STM32 家族里有些系列是內(nèi)置DMAMUX模塊的,即DMA路由器,利用DMAMUX可以實(shí)現(xiàn)DMA請(qǐng)求與DMA傳輸通道的靈活配置;可以將一些通常不能直接產(chǎn)生DMA請(qǐng)求的事件通過(guò)它后而可以產(chǎn)生DMA請(qǐng)求;或者基于部分DMA完成事件產(chǎn)生新的DMA請(qǐng)求發(fā)起新的傳輸。目前,STM32家族中內(nèi)置DMAMUX模塊的系列有下面這些:
那么 我這里就利用DMAMUX的其中一個(gè)特性,即通過(guò)它可以讓部分DMA完成事件產(chǎn)生新的DMA請(qǐng)求從而發(fā)起新的DMA傳輸。具體到這里,我們讓UART 的DMA接收完成事件映射到DMAMUX的DMA generator,再申請(qǐng)新的DMA請(qǐng)求,讓DMA將UART 接收到的數(shù)據(jù)從內(nèi)存搬運(yùn)到定時(shí)器的3個(gè)CCR寄存器,形成一個(gè)級(jí)聯(lián)模式。大致流程是:
上位機(jī)數(shù)據(jù) 經(jīng)UARTRX+DMA 接收到內(nèi)存, 然后DMA 接收完成事件 經(jīng)DMAMUX申請(qǐng)的新的DMA請(qǐng)求和 DMA通道,再將內(nèi)存數(shù)據(jù)寫(xiě)到定時(shí)器的3個(gè)比較寄存器控制占空比。
下面我使用STM32G4系列芯片重點(diǎn)演示下實(shí)現(xiàn)過(guò)程,配置是關(guān)鍵。至于原理細(xì)節(jié)還請(qǐng)閱讀相關(guān)手冊(cè)。
我還是用UART1自發(fā)自收來(lái)模擬上位機(jī)發(fā)送新的CCR數(shù)據(jù)。
TIM2使用3個(gè)通道做PWM輸出,使用CubeMx工具的參考配置如下:
我同樣開(kāi)啟USART1的TX/RX事件的DMA傳輸功能。參考配置如下【注意UART RX DMA的配置與前一篇的差別】:
注意上圖中的事件使能及DMA請(qǐng)求配置。接著看看下面關(guān)于DMA generator的相關(guān)配置:
請(qǐng)關(guān)注上圖中所有配置。其中,DMAMUX生成的DMA請(qǐng)求由DMA2_CH2響應(yīng),工作在Circular模式。
我依然使用32位TxData【3】數(shù)組存放待傳輸?shù)?個(gè)CCR值,用RxData[3]存放接收的數(shù)據(jù)。使用CubeMx配置完成后,添加相關(guān)用戶代碼。【基于HAL庫(kù)組織代碼】
我在UARTDMA接收完成中斷的回調(diào)函數(shù)里對(duì)接收到新數(shù)據(jù)事件做標(biāo)志更新。
為了便于演示,我依然在主程序里循環(huán)模擬遠(yuǎn)程命令,動(dòng)態(tài)修改CCR寄存器的值。參考代碼如下截圖:
稍作調(diào)試我們就可以查看輸出結(jié)果【借助斷點(diǎn)實(shí)時(shí)查看內(nèi)存和寄存器的數(shù)據(jù)】:
從上面貼圖不難看出,從UART的發(fā)送數(shù)據(jù)、接收到的內(nèi)存數(shù)據(jù)、寄存器的數(shù)據(jù)都在保持同步更新。
在上面演示過(guò)程中,我是將DMAMUX生成的新DMA請(qǐng)求申請(qǐng)的 DMA通道配置為Circular模式來(lái)著手測(cè)試的,如果配置為Normal模式也應(yīng)該是可以的,只是需將Generator生成的新的DMA配置以及用戶代碼稍微做些調(diào)整,有興趣的話可以自行測(cè)試驗(yàn)證。
-
STM32
+關(guān)注
關(guān)注
2266文章
10876瀏覽量
354926 -
占空比
+關(guān)注
關(guān)注
0文章
97瀏覽量
29051 -
uart
+關(guān)注
關(guān)注
22文章
1228瀏覽量
101198
原文標(biāo)題:遠(yuǎn)程修改STM32 TIMER占空比的方案續(xù)1
文章出處:【微信號(hào):stmcu832,微信公眾號(hào):茶話MCU】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論