GD32 Timr定時器看起來比較復雜啊。一看GD32E10x 的SPEC:一個高級定時器,三個通用定時器,還有一個基本定時器。
項目上想用來做分時處理程序都不知道用哪個?
就用通用的定時器 timer1
一起看下時鐘樹,如下圖所示:
GD32時鐘樹部分硬件展示TIMER1的時鐘是CK_TIMER1,要提供CK_TIMER1需要TIMER1 enable并且需要提供具體的時鐘
具體的時鐘
if(APB1 prescale = 1 ) x 1 else x 2
我們的CK_SYS時鐘(系統時鐘)經過Prescaler之后最大頻率是CK_AHB(120MHz)
然后經過預分頻,APB1頻率最大到60MHz,如果預分頻系數是1的話,則提供到TIMER的頻率是x2。
也就是60*2 = 120MHz
所以TIMER1的時鐘就用基于120MHz去分頻
我想每200ms 獲取一次timer1的中斷。改怎么辦?
有兩個參數可以一起去實現這個功能。
1個事TIMER的prescale 可以先把這個120MHz分頻,比如我分頻為1MHz,那么prescale就是120,不過這里timer_initpara.prescaler不能設置為120,要設置為119.
因為具體的計算方式是120MHz/(prescaler+1)
這樣拿到了1MHz的clock.那獲取每200ms的中斷再要做什么呢?
這里有reload 參數timer_initpara.period ,官方成為“TIMER counter auto reload register”
這個reload參數意思是:當計數計到period參數的時候就做一次更新,從0開始重新計算,中斷就產生一次。
前面1MHz 意思是1s 可以計數1000 000次。也就是1ms 可以計數1000次,我需要200ms更新一次,那就說我需要計數 200 * 1000,所以reload就是200 * 1000 = 200000
timer_initpara.period 就是寫為200000
審核編輯:符乾江
-
定時器
+關注
關注
23文章
3252瀏覽量
115038 -
時鐘樹
+關注
關注
0文章
55瀏覽量
10780
發布評論請先 登錄
相關推薦
評論