有小伙伴反馈GD32 Timer定时器的周期时间不知如何计算,今天就来安排。
我们分成两个系列来讲解——GD32F30x和GD32F4xx系列。
一、GD32F30x系列
要想计算Timer的周期时间,首先要知道Timer的时钟频率,看时钟频率当然就要看时钟树啦,在时钟树的右下方就标注了Timer的时钟频率。
我们把图放大,可以看到Timer1,2,3,4,5,6,11,12,13的时钟源来自于CK_APB1,Timer0,7,8,9,10来自于CK_APB2。而CK_APB1和CK_APB2最高的频率为60M和120M,那这两类Timer的时钟频率是不是就是60M和120M呢?
答案是否定的。我们来看下图方框中的提示,方框1中写到,如果APB1的分频系数为1的话,这些Timer的频率就等于CK_APB1,如果APB1的分配系数不为1,则Timer的频率等于CK_APB1*2。方框2中的内容和方框1中相同,就不再赘述。
那么APB1和APB2的分频系数在哪里设置的呢,答案就是——在系统时钟配置中,也就是SystemInit函数中调用的system_clock_config函数。通常我们设置系统时钟和AHB时钟为120M,设置APB1分频系数为2,即APB1时钟为AHB时钟的二分之一60M;设置APB2分频系数为1,即APB2时钟等于AHB时钟120M。
好了,知道以上知识点我们就可以算出Timer的时钟频率了。举个例子,我们设置AHB时钟为120M,APB1分频系数为2,我们来算下Timer1的频率。首先,算出CK_APB1=AHB时钟/2 = 60M,其次,由于APB1分频系数不等于1,所以CK_Timer1=CK_APB1*2 = 60M*2 = 120M。
算出Timer的时钟频率后,我们看下Timer最基础的配置代码:
有两个和周期时间相关的参数:
其一为prescaler,即Timer的分频系数,该分频系数将Timer频率进行分频后给到计数器时钟,计算公式为:计数器时钟频率 = CK_TIMER/(prescaler+1),故图中计数器时钟频率为120M/12000 = 10KHz,即每100us,计时器进行一次计数。
其二为period,即周期值,也叫作重载值,在边沿计数模式下,计数器计重载值个数所用的时间,称为一个周期时间,计算公式为:周期时间 = (period+1)/计数器时钟频率;而在中央计数模式下,计数器计数重载值*2个数所用的时间,称为一个周期时间,计算公式为:周期时间 = (period+1)*2/计数器时钟频率。故图中周期时间为160/10K = 16ms。
上面讲的是计算过程和原理,下面给出周期时间计算总公式:
1、边沿计数模式下的计算公式:
(prescaler+1)*(period+1)/CK_TIMER,其中CK_TIMER根据APB1和APB2的分频系数决定
2、中央计数模式下的计数公式:
(prescaler+1)*(period+1)*2/CK_TIMER,其中CK_TIMER根据APB1和APB2的分频系数决定
二、GD32F4xx系列
实际上GD32F4xx系列的周期时间计算公式和GD32F30x的相同,不同的点在于CK_TIMER的计算公式,照例看下GD32F4xx的时钟树:
可以看到CK_TIMER可以是APB时钟乘以1、乘以2或乘以4,那具体是乘以几呢?这个是根据时钟配置寄存器 1(RCU_CFG1) 中的第24位TIMERSEL来决定的:
GD32F4xx用户手册中对这一位描述的非常清晰,这里就不再赘述了。
好了,通过本期讲解,相信小伙伴们就可以轻松计算出Timer的周期时间啦。


点赞(0)

评论列表 共有 0 条评论

暂无评论