問題**:
void
timer_pwm_init
(tim_typedef *timx, uint32_t tim_ch)
;timer_clk_irq_config
(timx,0)
; tim_initstruct.prescaler =71;
tim_initstruct.countermode = ll_tim_countermode_up;
tim_initstruct.autoreload =
999;
tim_initstruct.clockdivision = ll_tim_clockdivision_div1;
ll_tim_init
(timx,
&tim_initstruct)
;ll_tim_disablearrpreload
(timx)
;ll_tim_oc_enablepreload
(timx, tim_ch)
; tim_oc_initstruct.ocmode = ll_tim_ocmode_pwm1;
tim_oc_initstruct.ocstate = ll_tim_ocstate_disable;
tim_oc_initstruct.ocnstate = ll_tim_ocstate_disable;
tim_oc_initstruct.comparevalue =
500;
tim_oc_initstruct.ocpolarity = ll_tim_ocpolarity_high;
ll_tim_oc_init
(timx, tim_ch,
&tim_oc_initstruct)
;ll_tim_oc_disablefast
(timx, tim_ch)
;ll_tim_settriggeroutput
(timx, ll_tim_trgo_reset)
;ll_tim_disablemastersl**emode
(timx)
;timer_io_init()
;}void
timer_pwm_freq_set
(tim_typedef *timx, uint32_t tim_ch, uint16_t freq)
問題現象:
呼叫:timer_pwm_freq_set(tim3, ll_tim_channel_ch4, 1000)
pwm沒問題,1khz,占空比50%
但是,呼叫:timer_pwm_freq_set(tim3,ll_tim_channel_ch4,100)
出問題了,pwm一直是高定平。
問題分析:
因為初始化pwm的頻率為1k,計數週期為500,占空比為50%
但是在後面修改頻率後並未修改計數週期,也就是頻率為100hz,計數週期還是500,計數週期大於頻率了,於是就出現一直高電平的現象。(個人分析的,不知正確與否,應該是這樣的。。。。)
解決方法:
修改頻率的同時也要修改計數週期,要保證計數週期小於頻率,不然占空比比週期還長,自然就一直高定平或者低電平了
**修改:
/**
* @brief 設定pwm輸出頻率
* @param fre取值範圍(1-10000)hz
* @retval 設定完成頻率之後不啟動定時器
*/void
timer_pwm_freq_set
(tim_typedef *timx, uint32_t tim_ch, uint16_t freq)
stm32關定時器 STM32定時器TIM3程式
include led.h include delay.h include key.h include sys.h include usart.h include timer.h stm32開發板實驗8 定時器中斷實驗 int main void delay init 延時函式初始化 nvic co...
stm32的外設初始化步驟,以定時器為例。
我這個程式的目的在於讓定時器開啟更新中斷,實現定時器1s中斷一次然後在中斷函式中led電平翻轉一次。1.首先先開啟這個外設的時鐘 rcc apb2periphclockcmd rcc apb2periph tim1,enable 開啟定時器1 的時鐘apb2 2.定義這個外設的初始化結構體 tim ...
stm32埠初始化
今天上課,點亮數碼管,gpio初始化後,數碼管上有一段亂碼。要讓這亂碼消失掉,需要改變gpio初始化的順序。在gpio埠使能後,要加odr 埠暫存器 控制 gpio inittypedef gpio initstructure 定義乙個結構體 rcc apb2periphclockcmd rcc a...