在学习hal库的时候遇到定时器配置的问题,现将定时器配置的方法以及相关公式进行总结
本文主要完成的功能:配置TIM外设以使用相应的中断请求生成一秒的时基
通用定时器TIM2-TIM5,TIM9-TIM14挂在于APB1总线,下面基于STM32F407zg的TIM3为例进行说明
STM32F407zg的时钟树如下图所示
APB1的预分频系数(APB1 Prescaler)为 4(不为1),则APB1总线上的定时器(TIM3也在其中)时钟为
TIM3CLK = 2 * APB1 clock (PCLK1) = 2 * ( 168 / 4 ) = 84MHz
要使TIM3计数器时钟(TIM3 counter clock)为10 KHz(这个频率是按需求自定义的),预分频器计算如下:
Prescaler = (TIM3CLK / TIM3 counter clock) - 1 = ( 84,000,000 / 10,000 ) - 1 = 8,400 -1
TIM3 ARR寄存器 ( TIM3 AutoReload Register )值等于 10,000 - 1,(这个值是根据上面的10KHz来的)
计数器周期 Counter Period (AutoReload Register - 32 bits value ) = 10,000 -1
Update rate = TIM3 counter clock / (Period + 1) = 1 Hz
因此TIM3每1秒产生一次中断。
在STM32CubeMx中TIM3的配置如下图
值得注意的是,如果要使用定时器的输入捕获(Input Capture)配置按键消抖的话,需要对Internal Clock Division需要做相应修改,如下图所示。
名词解释:Internal Clock Division(CKD)
CKD是TIMx_CR1寄存器中的Bit 9:8,该位字段表示定时器时钟(CK_INT)频率与数字滤波器(ETR,TIx)使用的采样时钟之间的分频比(可选1,2,4)。
本文中的STM32F407的TIM3的时钟频率为84MHz,即上图中的tCK_INT = 1 / 84us。
选择CKD = 2,则tDTS = 2 * tCK_INT = 2 / 84us,fDTS = 42MHz,即数字滤波器采样时钟频率为42M。在CubeMx的TIM3配置中,我们设置了Input Filter (4 bit ) = 15。
对应下图中fSAMPLING = fDTS / 32, N = 8,fSAMPLING = 42 / 32 = 1.3125MHz。则频率高于1.3 / 8 = 0.164MHz的被采样信号将被滤波器滤除,按键抖动信号在此列当中,因此可以很好地完成硬件按键消抖。
参考资料: