現(xiàn)在有人談到這樣一個需求,他使用STM32F429芯片做開發(fā),其中用到TIM2做3路PWM輸出。另外有個上位機跟STM32的UART接口相連,上位機可能不定期地需要通過UART接口給STM32發(fā)送新的占空比參數(shù),而且每次都發(fā)送3個輸出通道的比較參數(shù)。如何快捷地實現(xiàn)這個功能呢?要求收到數(shù)據(jù)后盡快修改3個比較通道的參數(shù)。
STM32F429的TIM2是32位定時器,3個通道的CCR寄存器也是32位的。那么上位機每次發(fā)3個通道的參數(shù)對應(yīng)12字節(jié)的數(shù)據(jù)。
顯然,整體上功能不算復(fù)雜。我們可以先通過UART收到12字節(jié)數(shù)據(jù),稍加整理后手動將數(shù)據(jù)逐字寫到3個CCR寄存器來改變PWM輸出。說實在的,這個方案的實現(xiàn)過程還是很清晰的,相信也是很多人的選擇。或許有人覺得操作起來稍顯瑣碎,有沒有比這個操作更方便快捷的呢?
既然這樣,我們可以調(diào)整下做法。因為STM32的高級定時器和大部分通用定時器都支持基于定時器事件的DMABurst傳輸。即先通過UART收到12字節(jié)數(shù)據(jù),稍加整理后借助于定時器事件的DMA Burst 傳輸 一次性地將3個字【12字節(jié)】的數(shù)據(jù)傳輸?shù)紺CR1CCR2CCR3三個寄存器,從而實現(xiàn)3個通道PWM的占空比的調(diào)整。實際上就是將上面第一種方案的手動逐個修改變?yōu)镈MA批量修改。
毫無疑問,這個第2種方案也是可行、挺方便的。但使用該方案就得研究下基于定時器事件的DMABurst傳輸?shù)膬?nèi)容,數(shù)據(jù)的修改需借助定時器事件。當然,所用定時器還得支持TIMERBurst DMA傳輸功能。說實在的,數(shù)據(jù)修改是變快捷了,但貌似難度提升了、代碼方面相比第一種方案變得復(fù)雜了。【為何說貌似,畢竟難易因人而異。】那有沒有一種更為通用的常規(guī)做法來實現(xiàn)上述功能呢?
我們不妨看看第3種方案。因為這里所選芯片STM32F429的DMA是帶4字FIFO的,我們可以通過UART按字節(jié)接收數(shù)據(jù),然后經(jīng)過FIFO打包成字,再通過DMA直接將數(shù)據(jù)送到3個輸出通道的CCR寄存器。這樣操作的話就非常簡單快捷,DMA的傳輸不涉及定時器事件,也不再要求定時器支持基于定時器事件的DMA Burst傳輸功能,自然也就無須使用者花精力研究這塊內(nèi)容。相比前兩種方案,代碼方面也更為簡單。
那么,我這里就專門選擇第3種方案,來簡單演示下它的實現(xiàn)過程。
下面我用UART自發(fā)自收來模擬來自上位機的修改CCR參數(shù)的數(shù)據(jù)信號。
TIM2使用3個通道做PWM輸出,參考配置如下:
我這里選用USART1外設(shè),開啟其TX/RX事件的DMA傳輸功能。參考配置如下:
我用32位TxData【3】數(shù)組存放待傳輸?shù)?個CCR值。
uint32_t TxData[]={2000,4000,8000};//3個初始值我隨便定的。
使用CubeMx配置完成后,添加相關(guān)用戶代碼。【基于HAL庫組織代碼】
上面三行代碼的功能一目了然,即開啟TIM2定時器3個通道的PWM輸出功能。
下面循環(huán)體代碼,就是修改CCR的值、通過UART 發(fā)、收,利用DMA修改3個通道的值,進而調(diào)整PWM輸出占空比。這樣循環(huán)進行,我們通過示波器查看輸出結(jié)果。
稍作編譯調(diào)試,即可通過示波器可以看到預(yù)期的結(jié)果。下面三副截圖代表不同時刻三個通道的輸出情況。
從上面截圖不難看出,3個輸出通道的PWM占空比在動態(tài)改變。當然,我們也可以通過IDE的寄存器觀察窗口查看CCR值的改變,如下圖所示:
上面重點針對第3種方案的實現(xiàn)過程做了簡單的演示。基本配置、實現(xiàn)代碼都是3種方案中最簡捷的,也是較為常規(guī)的通用做法。其中的關(guān)鍵配置和實現(xiàn)代碼我都清晰地貼出來了,以便有需要的人士參考。其實,只要我們對STM32的DMA功能把握得比較好,吃透原理、把握細節(jié),實現(xiàn)起來也不算難。
最后順便用一個與本文內(nèi)容相關(guān)的小細節(jié)提醒來結(jié)尾。關(guān)于STM32的定時器的各個寄存器在地址空間中的地址安排,其中TIMx_CCR1,TIMx_CCR2, TIMx_CCR3,TIMx_CCR4這幾個寄存器的地址總是依次順序擺放的,了解這點對閱讀上面?zhèn)€別函數(shù)調(diào)用有幫助。
-
寄存器
+關(guān)注
關(guān)注
31文章
5424瀏覽量
123487 -
STM32
+關(guān)注
關(guān)注
2290文章
11017瀏覽量
362632 -
uart
+關(guān)注
關(guān)注
22文章
1269瀏覽量
103342
原文標題:通過STM32 UART及DMA修改TIMER占空比示例
文章出處:【微信號:stmcu832,微信公眾號:茶話MCU】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
STM32U5系列TIMER+DMA+DAC應(yīng)用演示

教你一手 基于STM32Cube庫的Timer捕獲應(yīng)用
使用DMA(和更多)的UART傳輸示例代碼
stm32 uart1如何通過DMA方式發(fā)送和接收數(shù)據(jù)?
STM32U575 Nucleo UART_TwoBoards DMA示例不會從終端接收怎么辦
IO_SOFT_UART_USE_TIMER
STM32---UART使用DMA數(shù)據(jù)傳輸

STM32CubeMX_UART_printf_接收中斷_DMA空閑中斷_LPUART

stm32F4的ADC+DMA+Timer,實現(xiàn)2MHz連續(xù)采樣。1LSB分辨率,極低噪聲。

stm32的串口DMA空閑中斷接收不等長數(shù)據(jù),stm32F1的usart1-DMA-IDLE收發(fā)

評論