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