STM32定时器相关计算与应用

一、STM32 定时器时钟

时钟树

对于 SYSCLK(系统时钟)、 HCLK(由 AHB 预分频器直接输出得到)、 PCLK2(外设时钟,由 APB2 预分频器输出得到)、 PCLK1(外设时钟,由 APB1 预分频器输出得到) 这四个时钟的配置一般是: PCLK2 = HCLK= SYSCLK=PLLCLK = 72MHz, PCLK1=HCLK/2 = 36MHz。这个时钟配置也是库函数的标准配置,我们用的最多的就是这个。

APB1 总线时钟 PCLK1 由 HCLK 经过低速 APB 预分频器得到,分频因子可以是:[1,2,4,8,16],HCLK1 属于低速的总线时钟,最高为 36MHz,片上低速的外设就挂载到这条总线上,当我们设置为 2 分频时,即 PCLK1 = HCLK/2 = 36MHz。

APB2总线时钟 PCLK2由 HCLK经过高速 APB2预分频器得到,分频因子可以是:[1,2,4,8,16],HCLK2属于高速的总线时钟,最高72MHz,片上高速的外设就挂载到这条总线上。当我们设置为 1 分频时,即 PCLK2 = HCLK =72MHz。

从时钟树上我们可以看出,定时器的时钟不是直接来自APB1或APB2,而是来自于输入为APB1或APB2的一个倍频器,而这个倍频器的倍频值受APBx时钟相对AHB的分频系数控制的,分频系数为1则倍频器不起作用,其他[2,4,8,16]则 x2
定时器倍频器

APBx的预分频系数在库函数“system_stm32f10x.c”文件中设置,一般情况下不做修改,如下图:
APBx分频系数
所以,在库函数中 APB1默认预分频的系数是 2,即PCLK1=36MHz,触发倍频器x2,定时器时钟TIMxCLK=36x2=72MHz,也就是说定时器2、3、4、5、6、7的时钟源也是72MHz,当然,如果APB1的时钟分频系数不是2而是4,也就是PCLK1为18MHz的时候,此时定时器2、3、4、5、6、7的时钟应为18Mx2=36MHz。同样,如果APB2的时钟分系数4 ,也就是PCLK2为18MHz的时候,此时定时器1、8的时钟应为18MHzx2=36MHz。如果8分频:TIMxCLK=72MHz/8x2=18MHz;16分频:TIMxCLK=72MHz/16x2=9MHz。

而APB2默认预分频的系数是 1,即 PCLK2=72MHz,倍频器不起作用,则TIMxCLK频率不变,定时器时钟TIMxCLK=72MHz,也就是说定时器1、8的时钟源是72MHz,当然,如果APB2的时钟分频系数不是1而是2 ,也就是PCLK2为36MHz的时候,此时定时器1、8的时钟应为36MHzx2=72M,同样,如果APB2的时钟分频系数4,也就是PCLK2为18MHz的时候,此时定时器1、8的时钟应为18MHzx2=36MHz。如果8分频:TIMxCLK=72MHz/8x2=18MHz;16分频:TIMxCLK=72MHz/16x2=9MHz。

综上可知,APB1的时钟频率是36MHz,APB2的时钟频率是72MHz,这些是在库函数初始化的时候就已经设置了的,使用库函数一般不做修改,而如果自己操作寄存器就不一定了,即可以按自己的需求配置。

当我们明白了以上这点,我们就可以很容易的区分两个预分频的概念:设置APB预分频系数与设置定时器预分频系数。
APB预分频:AHB分频得到APBx,使用库函数的话,一般采用默认配置,不做修改,即APB1的时钟频率是36MHz,APB2的时钟频率是72MHz,但需要注意的是输入到定时器的时钟频率都是72MHz。

定时器预分频:定时器时钟源TIMxCLK经该预分频器才是定时器计数时钟CK_CNT,它设定 PSC 寄存器的值。计算公式为: 计数器时钟频率 (fCK_CNT) 等于fCK_PSC / (PSC[15:0] + 1),可实现 1 至 65536 分频。
定时器预分频系数

二、STM32定时器定时时间的计算

1.定时器溢出中断时间计算公式

	T=[(TIM_Prescaler+1)/TIMxCLK]x(TIM_Period+1)
     =[(TIM_Prescaler+1)*(TIM_Period+1)]/TIMxCLK

2.定时器频率计算公式

	f=1/T=[TIMxCLK/(TIM_Prescaler+1)]/(TIM_Period+1)
   	 =TIMxCLK/[(TIM_Prescaler+1)*(TIM_Period+1)]

其中:

T :定时器溢出中断时间
f :定时器工作频率
TIMxCLK :定时器时钟频率(若是晶振为8MHz的,一般为72MHz)
TIM_Period :定时器自动重装载值 (范围为0~65535)
TIM_Prescaler :定时器预分频系数(范围为0~65535)

TIMxCLK为时钟频率,1/TIMxCLK为时钟周期,
(TIM_Prescaler+1)/TIMxCLK为机器周期,乘以(TIM_Period+1)即可得出定时器周期。
定时器周期 = 机器周期 * 自动重新装载值:

	T=[(TIM_Prescaler+1)/TIMxCLK]x(TIM_Period+1)

例子:

TIMxCLK=72MHz,TIM_Period=1000-1,TIM_Prescaler=72-1.
则定时器中断时间为:[(72-1+1)/(72x10^6)]*(1000-1+1) =1ms

三、STM32 PWM信号周期和占空比的计算

1.PWM信号的周期计算公式

	T=[(TIM_Prescaler+1)*(TIM_Period+1)]/TIMxCLK

2.PWM信号的频率计算公式

	f=TIMxCLK/[(TIM_Prescaler+1)*(TIM_Period+1)]

3.PWM信号占空比计算公式

	P=[CCRx_Val/(TIM_Period+1)]*100%

其中:

T : PWM信号的周期
TIMxCLK :定时器时钟频率(若是晶振为8MHz的,一般为72MHz)
TIM_Period :定时器自动重装载值 (范围为0~65535)
TIM_Prescaler :定时器预分频系数(范围为0~65535)
CCRx_Val : 通道x电平跳变值
P :占空比

猜你喜欢

转载自blog.csdn.net/WalterBrien/article/details/104218860