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