在做晶振守時等專案時經常需要生成乙個可調相位的1pps,我最近就遇到了這樣的問題。利用stm32的定時器定時1s,然後在tim_it_update中斷時輸出1pps上公升沿理論是可以的,但是移動相位很不方便,修改定時器的計數值是乙個方法,但是這會引入很大的系統誤差。
利用stm32定時器的輸出比較模式輸出1pps並達到相位可調的目的是我目前想到的最好的方法,其實這種機制的原理很簡單。stm32的定時器的眾多暫存器中有幾個是我們經常要使用到的,它們分別是:
預分頻暫存器:配置它會將定時器的輸入主頻進行分頻。假設我的系統主頻是100m,我定時器的參考頻率是apb1也就是50m,如果我給預分頻暫存器中寫入4,則將定時器的頻率分為10m。
預裝載暫存器:這個暫存器在計數暫存器溢位是會將該暫存器的值裝入計數暫存器。
計數暫存器:按照上面預分頻的例子值,該暫存器每100ns暫存器值會加一直到到達預裝載值然後產生溢位中斷。
ccrx:當配置為比較輸出時,ccrx暫存器中的值與計數暫存器中的值相等時會觸發tim_it_ccrx中斷。
gpio_inittypedef gpio_initstructure;
tim_timebaseinittypedef tim_timebasestructure;
tim_ocinittypedef tim_ocinitstructure;
nvic_inittypedef nvic_initstructure;
/*設定中斷*/
nvic_initstructure.nvic_irqchannel = tim3_irqn;
nvic_initstructure.nvic_irqchannelpreemptionpriority =
1;
nvic_initstructure.nvic_irqchannelsubpriority =
1;
nvic_initstructure.nvic_irqchannelcmd = enable;
nvic_init
(&nvic_initstructure)
;/*時鐘*/
rcc_apb1periphclockcmd
(rcc_apb1periph_tim3, enable)
;//初始化tim3
tim_timebasestructure.tim_period =
1000000-1
;//設定在下乙個更新事件裝入活動的自動重裝載暫存器週期的值
tim_timebasestructure.tim_prescaler =72-
1;//72分頻,tim3 = 1mhz
tim_timebasestructure.tim_clockdivision = tim_ckd_div1;
//1分頻
tim_timebasestructure.tim_countermode = tim_countermode_up;
//向上計數模式
tim_timebaseinit
(tim3,
&tim_timebasestructure)
;//初始化tim3 channel2 pwm模式
tim_ocinitstructure.tim_ocmode = tim_ocmode_toggle;
tim_ocinitstructure.tim_outputstate = tim_outputstate_enable;
//比較輸出使能
tim_ocinitstructure.tim_ocpolarity = tim_ocpolarity_high;
tim_ocinitstructure.tim_pulse =
1000000/2
;//tim3->ccr1初始值為500000
tim_oc1init
(tim3,
&tim_ocinitstructure)
;//根據t指定的引數初始化外設tim4 oc1
tim_itconfig
(tim3, tim_it_cc1,enable)
;tim_setcounter
(tim3,0)
;
上面的配置為定時器的計數暫存器計數值從0計數到999999,由於時鐘頻率恰好時1m,所以恰好是每1s計數值清一次零。我們設定在計數到5000000時產生比較輸出中斷。這樣迴圈往復就產生了乙個1pps。我們可以通過調節tim3->ccr1中的值來調節1pps的相位,調節步長為1us。
void
tim3_irqhandler
(void
)//tim3中斷
}
STM32的PWM輸出實驗
通過設定該暫存器 ccrx 來調整pwm輸出的占空比,如下圖所示 以通道1為例說明pwm的工作過程 首先通過設定ccr1 捕獲比較 值 暫存器 設定設定比較值。然後通過設定ccmr1 oc1m 2 0 位以及ccer cc1p位 輸入 捕獲1輸出極性 來設定高低電平的輸出模式,具體如圖所示 最後設定...
stm32定時器輸出4路頻率可調的原理分析
1標題說不清楚,簡單點說就是乙個定時器輸出4路可調節頻率的pwm。2這個功能能幹嘛?一般是用於控制多個步進電機。這樣做乙個定時器就可以控制4個電機了。先上 吧 u16 capture 0 vu16 ccr1 val 32768 vu16 ccr2 val 16384 vu16 ccr3 val 81...
STM32的中斷處理1
1 msp和psp 1 control暫存器 2 復位後預設使用msp。3 中斷為處理模式 handle 永遠是特權級 非中斷即為執行緒模式,可在中斷中指定 control 0 為特權級或使用者級。4 處理模式始終使用msp 執行緒模式可選使用psp或msp 有os時,一般使用psp 由exc re...