有小伙伴反饋GD32 Timer定時(shí)器的周期時(shí)間不知如何計(jì)算,今天就來安排。
我們分成兩個(gè)系列來講解——GD32F30x和GD32F4xx系列。
一、GD32F30x系列
要想計(jì)算Timer的周期時(shí)間,首先要知道Timer的時(shí)鐘頻率,看時(shí)鐘頻率當(dāng)然就要看時(shí)鐘樹啦,在時(shí)鐘樹的右下方就標(biāo)注了Timer的時(shí)鐘頻率。

我們把圖放大,可以看到Timer1,2,3,4,5,6,11,12,13的時(shí)鐘源來自于CK_APB1,Timer0,7,8,9,10來自于CK_APB2。而CK_APB1和CK_APB2最高的頻率為60M和120M,那這兩類Timer的時(shí)鐘頻率是不是就是60M和120M呢?

答案是否定的。我們來看下圖方框中的提示,方框1中寫到,如果APB1的分頻系數(shù)為1的話,這些Timer的頻率就等于CK_APB1,如果APB1的分配系數(shù)不為1,則Timer的頻率等于CK_APB1*2。方框2中的內(nèi)容和方框1中相同,就不再贅述。

那么APB1和APB2的分頻系數(shù)在哪里設(shè)置的呢,答案就是——在系統(tǒng)時(shí)鐘配置中,也就是SystemInit函數(shù)中調(diào)用的system_clock_config函數(shù)。通常我們?cè)O(shè)置系統(tǒng)時(shí)鐘和AHB時(shí)鐘為120M,設(shè)置APB1分頻系數(shù)為2,即APB1時(shí)鐘為AHB時(shí)鐘的二分之一60M;設(shè)置APB2分頻系數(shù)為1,即APB2時(shí)鐘等于AHB時(shí)鐘120M。

好了,知道以上知識(shí)點(diǎn)我們就可以算出Timer的時(shí)鐘頻率了。舉個(gè)例子,我們?cè)O(shè)置AHB時(shí)鐘為120M,APB1分頻系數(shù)為2,我們來算下Timer1的頻率。首先,算出CK_APB1=AHB時(shí)鐘/2 = 60M,其次,由于APB1分頻系數(shù)不等于1,所以CK_Timer1=CK_APB1*2 = 60M*2 = 120M。

算出Timer的時(shí)鐘頻率后,我們看下Timer最基礎(chǔ)的配置代碼:

有兩個(gè)和周期時(shí)間相關(guān)的參數(shù):
其一為prescaler,即Timer的分頻系數(shù),該分頻系數(shù)將Timer頻率進(jìn)行分頻后給到計(jì)數(shù)器時(shí)鐘,計(jì)算公式為:計(jì)數(shù)器時(shí)鐘頻率 = CK_TIMER/(prescaler+1),故圖中計(jì)數(shù)器時(shí)鐘頻率為120M/12000 = 10KHz,即每100us,計(jì)時(shí)器進(jìn)行一次計(jì)數(shù)。
其二為period,即周期值,也叫作重載值,在邊沿計(jì)數(shù)模式下,計(jì)數(shù)器計(jì)重載值個(gè)數(shù)所用的時(shí)間,稱為一個(gè)周期時(shí)間,計(jì)算公式為:周期時(shí)間 = (period+1)/計(jì)數(shù)器時(shí)鐘頻率;而在中央計(jì)數(shù)模式下,計(jì)數(shù)器計(jì)數(shù)重載值*2個(gè)數(shù)所用的時(shí)間,稱為一個(gè)周期時(shí)間,計(jì)算公式為:周期時(shí)間 = (period+1)*2/計(jì)數(shù)器時(shí)鐘頻率。故圖中周期時(shí)間為160/10K = 16ms。
上面講的是計(jì)算過程和原理,下面給出周期時(shí)間計(jì)算總公式:
1、邊沿計(jì)數(shù)模式下的計(jì)算公式:
(prescaler+1)*(period+1)/CK_TIMER,其中CK_TIMER根據(jù)APB1和APB2的分頻系數(shù)決定
2、中央計(jì)數(shù)模式下的計(jì)數(shù)公式:
(prescaler+1)*(period+1)*2/CK_TIMER,其中CK_TIMER根據(jù)APB1和APB2的分頻系數(shù)決定
二、GD32F4xx系列
實(shí)際上GD32F4xx系列的周期時(shí)間計(jì)算公式和GD32F30x的相同,不同的點(diǎn)在于CK_TIMER的計(jì)算公式,照例看下GD32F4xx的時(shí)鐘樹:

可以看到CK_TIMER可以是APB時(shí)鐘乘以1、乘以2或乘以4,那具體是乘以幾呢?這個(gè)是根據(jù)時(shí)鐘配置寄存器 1(RCU_CFG1) 中的第24位TIMERSEL來決定的:
GD32F4xx用戶手冊(cè)中對(duì)這一位描述的非常清晰,這里就不再贅述了。
好了,通過本期講解,相信小伙伴們就可以輕松計(jì)算出Timer的周期時(shí)間啦。