在自己小板子上移植pwm時候又重新學習了一下,加入兩點:1,對各種輸出比較模式的學習;2,輸出模式時加入中斷
先寫出函式:
1tim4_ch4_pb9_pwm_init//tim4 pwm部分初始化 2//
pwm輸出初始化3//
period:輸出週期:khz4//
duty:占空比 0-1005//
mode: 是否開啟tim4中斷溢位中斷與cc4中斷67
8void tim4_ch4_pb9_pwm_init(unsigned short
int period,char duty,char
mode)959
60 }
其中:tim_ocinitstructure.tim_pulse=(10*duty/period);
這句就是set ccr4比較/捕獲暫存器的值。
tim_ocinitstructure.tim_ocmode = tim_ocmode_pwm1; //選擇定時器輸出比較
tim_ocmode_timing 輸出比較時間模式 (輸出引腳凍結無效)
tim_ocmode_active 輸出比較主動模式 (匹配時設定輸出引腳為有效電平,當計數值為比較/捕獲暫存器值相同時,強制輸出為高電平
tim_ocmode_inactive 輸出比較非主動模式 (匹配時設定輸出引腳為無效電平,當計數值為比較/捕獲暫存器值相同時,強制輸出為低電平)
tim_ocmode_toggle 輸出比較翻轉觸發模式(當計數值與比較/捕獲暫存器值相同時,翻轉輸出引腳的電平)
tim_ocmode_pwm1 向上計數時,當timx_cnt < timx_ccr*時,輸出電平有效,否則為無效
向下計數時,當timx_cnt > timx_ccr*時,輸出電平無效,否則為有效
tim_ocmode_pwm2 與pwm1模式相反
pwm模式就不說了,通過函式設定頻率與占空比。
其餘幾個所說的「當計數值為比較/捕獲暫存器值相同時」 即ccrx=cnt;這時候會觸發後面所說的事件,而tim_ocmode_active與tim_ocmode_inactive 僅觸發一次,所以之後就會出現一直為高電平或者低電平。tim_ocmode_toggle會每次都翻轉,所以也形成乙個pwm,而占空比只會是百分之五十,週期為引數period的兩倍,頻率為1/2,因為乙個period只翻轉一次!翻轉是在ccrx=cnt時翻轉,並不是cnt=arr(arr=tim_timebasestructure.tim_period)。
輸出比較時候可以出發本身的比較/捕獲中斷與溢位中斷,我用的ch4,開啟了tim_it_cc4 | tim_it_update,中斷函式中可以看到何時觸發中斷,什麼時候進行翻轉。
1tim4_irqhandlervoid tim4_irqhandler(void)2
10if(tim_getitstatus(tim4,tim_it_cc4)!=reset)
11
1617
18 }
stm32 timer 的三個函式
再說一下tim timebasestructure.tim prescaler 0的問題,這個很簡單,程式後面如果呼叫了函式tim prescalerconfig tim2,35999,tim pscreloadmode immediate 這個函式可以把之前的值給修改了,tim prescaler...
STM32輸出比較模式和PWM模式
1.兩者關係 其實完全可以理解為pwm模式為輸出比較模式的特殊形式,pwm模式在對應定時器上的四個通道產生的頻率是同步的 即相同的 而輸出比較模式在四個通道可以產生的頻率不同。2.pwm很多是週期固定改變占空比來應用的,當然也有改變頻率的,改變占空比修改的是ccr1暫存器,而改變頻率則是arr分頻器...
STM32使用TIM閃爍LED 輸出比較方式
stm32定時器輸出比較器可以直接操作對應的gpio,在計數器值等於比較暫存器的值時,對應的gpio可以有以下四種動作 無動作啟用 取消啟用 翻轉啟用電平由輸出極性暫存器決定 將led置於定時器輸出比較對應的gpio上,對它的操作將非常方便,完全由硬體完成,不消耗cpu時間,無需中斷,每個定時器都對...