定时器的基本框图:
不管是做PWM输出、定时中断还是输入捕获都肯定要搞清楚CK_INT 从哪里来,频率是多少?才能正确使用定时器。时钟肯定是来自时钟树,那我们就要去Reference manual里找找:
时钟源确实可以找到,但注意时钟存在翻倍可能性!if APBx PRESC= 1 x1 else x2 : 直接理解是如果APBx PRESC 预分频 设置成1 timer时钟等于APBx 不然 timer时钟为2倍APBx 。可是还是没有找到时钟源和timer时钟具体数值关系,这个就要去Datasheet里找了,找MCU系统框图:
我们发现有2个APB(Advanced Peripheral Bus) ,最大主频还还不一样,分别挂了多个定时器。到这里我们总算找到了timer的具体关联的时钟源了。如何计算频率呢?
举例1:假设使用的是timer2 AHB1=168MHz
// Timer2 On APB1 42MHz(MAX) ==> 可设 APB1 PRESC =4 APB1 =42MHz。
// if APBx PRESC = 1x1 else x2 ==> Timer2_CLK = 42MHz*2 = 84MHz 。
举例2:假设使用的是timer1、timer2 AHB1= 84 MHz
// Timer2 On APB1 42MHz(MAX) ==> 可设 APB1 PRESC =2 APB1 =42MHz。
// if APBx PRESC = 1x1 else x2 ==> Timer2_CLK = 42MHz*2 = 84MHz 。
// Timer1 On APB2 84MHz(MAX) ==> 可设 APB2 PRESC =1 APB2 =84MHz。
// if APBx PRESC = 1x1 else x2 ==> Timer1_CLK = 84MHz*1 = 84MHz 。
参考:
stm32定时器的理解