stm32 pwm輸出異常及解決過程

2021-08-02 17:55:10 字數 2436 閱讀 7415

pwm輸出是stm32最常用的外設之一,我比較習慣使用庫函式配置,我通常移植做過的工程中的程式的配置**,然後改一改相應的引數,配置方法也十分簡單,即使很簡單,但對於初學者有時候還是很容易出錯。有時候會一點波形沒有輸出,在找不到其他原因的情況下,這個時候以自己以前的經驗來說,配置**裡面有一句gpio_pinafconfig(gpiob,gpio_pinsource1, gpio_af_tim3);   (以stm32f4 time3 ch4為例)比較容易出錯同時被忽略,其中的gpio_pinsource1很容易稍不注意會寫成gpio_pin_1這樣子會導致引腳復用沒有成功,同時輸入捕獲的配置的時候也有可能導致配置沒有成功的情況,然後其中乙個比較可能的原因也是這個引數的巨集寫錯,因為這兩個巨集有點像,以上是我之前遇到的配置pwm或輸入捕獲的時候由於自己的粗心出現的問題,當時也查了比較久的時間,所以記錄下來。

但前陣子在寫乙個程式是出現了乙個更加奇怪的現象,出現了類似積分電路的波形。改工程程式的描述如下

該工程中需要配置一些外部中斷和pwm輸出於是寫了這兩個一下兩個函式

limitswitchinit();	

pwm3_configuration();//tim3ch4

兩個函式的具體定義如下:

void limitswitchinit()

void pwm3_configuration(void)	//tim3

執行程式之後的波形:

發現波形輸出不是標準的方波,有點像是積分的波形,於是開始找原因,然後無意之間調換了limitswitchinit(); 

pwm3_configuration();//tim3ch4這兩個配置函式的位置即:

pwm3_configuration();//tim3ch4

limitswitchinit();

結果輸出波形就變得很正常:

於是很自然變想到了是第乙個配置的外部中斷影響到了正常的pwm輸出,於是在這個方向上找了好久的原因,但是始終找不到外部中斷有什麼問題,同時外部中斷的功能也很正常,而且還有乙個很奇怪的問題,就是如果外部中斷的配置影響了pwm的外設,那麼應該是外部中斷放在pwm後面才會出現問題,因為放在後面的pwm配置應該會覆蓋原來的配置,但是實際情況剛好相反,pwm放在後面的時候便會出錯,放在前面反而正常。

最後把void pwm3_configuration(void)//tim3這個函式的定義裡面,配置gpio的gpio這個結構體放到了函式外面,變成乙個全域性變數,然後再次執行程式然後發現無論兩個函式的配置位置是如何的都pwm輸出都非常正常,到這裡時問題就變得比較清晰了,我們應該知道區域性變數和全域性變數的區別,首先這兩種型別的變數的作用域和生存期不同,區域性變數作用域是該函式,生存期時這個函式的執行的時間,即函式返回,記憶體被**利用,而全域性變數的作用域是整個檔案,生存期就是整個程式的執行時間內長期存在,記憶體不會被**,其次他們還有另外乙個問題就是,當定義乙個全域性變數的時候,分配的記憶體會全部清零,即所有的變數的初始值會是0,而當定義乙個區域性變數時,記憶體將不會清零。分配到的記憶體裡面是什麼資料,便是什麼資料,也就說,區域性變數不初始化的話,變數的值是很隨機的。

回到之前的程式,由於我定義了乙個區域性變數gpio_inittypedef  gpio;這個結構體,然後這個結構體的資料便是原先記憶體的資料,裡面成員的值是比較隨機的,通過打斷點觀察成員的資料得到

當limitswitchinit(); 

pwm3_configuration();//tim3ch4這個順序時gpio_inittypedef  gpio裡面的成員資料如左圖,調換順序之後變成右圖:

可以發現後面的兩個成員的資料改變了,檢視原來void pwm3_configuration(void)//tim3函式的定義可以知道裡面對這個結構體的賦值只有前三個成員而少了後兩個成員,然後導致調換程式效果不同的原因是當前乙個函式改變了某些記憶體,然後定義後面函式的區域性變數的時候導致**的記憶體裡面的資料殘留,造成了效果不同,至於是哪個變數不同呢,測試得到當補充配置gpio.gpio_otype = gpio_otype_pp;(推挽輸出)時程式就沒問題,噹噹配置為gpio.gpio_otype = gpio_otype_od;(開漏輸出)時便會出現那種異常波形。

以上得到的教訓就是在定義了區域性變數時,一定要把所有成員初始化一遍,不然會導致很多奇怪而又難以發現的問題,如以上遇到的問題。

STM32 PWM輸出設定

計數器暫存器 timx cnt 預分頻器暫存器 timx psc 自動裝載暫存器 timx arr 重複次數暫存器 timx rcr 當timx cnt如果timx ccrx中的比較值大於自動重裝載值 timx arr 則ocxref保持為 1 如果比較值為0,則ocxref保持為 0 自動裝載暫存...

STM32 PWM輸出相關配置介紹

2018 4 21 stm32 1.pwm 脈衝寬度調製 通過數字輸出對模擬量進行控制 2.tim x 定時器,在stm32中存在8個 3.tim oc 實現輸出比較功能 4.pwmval 占空比 2.具體配置流程 1,介紹 作為pwm除了基本定時器沒有通道,通用暫存器有4道,高階暫存器有7道 2....

STM32 PWM原理總結

pwm的工作原理 假如我們要讓乙個led燈由暗到亮,就需要不斷的改變ccrx的值,也就是改變占空比。如果我們改變led燈由暗到亮的速度,我們就需要改變arr的值。pwm配置相關暫存器 使用通用定時器的pwm功能,除了配置一般定時器的方式之外,還需要三種暫存器來控制 捕獲 比較暫存器 timx ccr...