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

STM32CubeMX_UART_printf_接收中斷_DMA空閑中斷_LPUART

stm32F4的ADC+DMA+Timer,實現2MHz連續采樣。1LSB分辨率,極低噪聲。

stm32的串口DMA空閑中斷接收不等長數據,stm32F1的usart1-DMA-IDLE收發

評論