我的理解:
ARR+1:定时器寄存器是从0开始计时的,0也算做一个值,比如你定时10个定时器周期,那么你往ARR寄存器中应写入9
PSC+1:道理和上面一样,0=1分频,1=2分频,2=3分频,,,
虽然寄存器中的值是0,但实际上是1,所以计算的时候要+1
和定时器时钟关联的有总线APB1或APB2等时钟,定时器外设挂载在这个总线上使用的就是这个总线时钟,然后定时器配置时有个预分频值prescale可以设置分频,还有个时钟分割,这两个可以控制定时器计数的快慢。例如总线频率为72M,预分频值为71(自动+1,实际为72),那么现在的计数频率就是1M赫兹,也就是1微秒计一个数。假设时钟周期设置为1000,那么在1000个计数后(1ms时间)就会使溢出标志置位。
这是TIM2的初始化配置,有注释。希望能帮到你。不过这个是用了函数库中的 函数的。
工程中用函数库还是比较方便的,没见过谁做工程时,配置各种东西还直接去操作寄存器的。那不累死!
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
/* ---------------------------------------------------------------
TIM2 Configuration: Output Compare Timing Mode:
TIM2CLK = 36 MHz, Prescaler = 36000, TIM2 counter clock = 1KHz
SET TTIM2 TIME 10mS
--------------------------------------------------------------- */
TIM_TimeBaseStructure.TIM_Period = 10; //计数值。 计时时间=计数值/TIM2 counter clock
TIM_TimeBaseStructure.TIM_Prescaler = 35999; //与分频
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //定时器时钟(CK_INT)频率与数字滤波器(ETR,TIx)使用的采样频率之间的分频比例。
//TIM_CKD_DIV1 -TDTS = Tck_tim TIM_CKD_DIV1=0x0000 //TIM_CKD_DIV1 -TDTS = Tck_tim
//TIM_CKD_DIV2 -TDTS = 2Tck_tim TIM_CKD_DIV2=0x0100 //TIM_CKD_DIV1 -TDTS = Tck_tim
//TIM_CKD_DIV4 -TDTS = 4Tck_tim TIM_CKD_DIV4=0x0200
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计算是从0计数到自动加载值,向下计算是从自动加载值计数到0
//中央对齐模式是从0计数到自动加载值(溢出),再从自动加载值计数到1(溢出)在从0开始计数。。。
//所以不管选用哪种模式,溢出的时间是不变的
TIM_TimeBaseInit(TIM2, TIM_TimeBaseStructure);
TIM_ARRPreloadConfig(TIM2,ENABLE); //预装载使能
TIM_ITConfig(TIM2,TIM_FLAG_Update,ENABLE); //TIM更新中断源
TIM_Cmd(TIM2, ENABLE); //开TIM2定时器
是用来产生定时器的中断溢出时间的,计算公式是:
T=Ftosc/(TIM_Period+1)*(TIM_Prescaler+1);(Ftosc是定时器时钟)
其中T,是中断溢出时间,你的这个例子就是1Sec,TIM_Period,是计数器的计数频率,TIM_Prescaler是定时器隔多少个周期溢出,化量溢出时间的。这两个数字的组合可以产生小于(最小分频因子,最大溢出周期,所产生的时间)下的任意时间。一般是产生1S,不过定时器只是用来产生1S时间太占用CPU资源了,如果想不占用CPU,可以用一个特殊的定时间,就是滴答了。最后还有第三句的意思是就产生定时器时对系统时钟的分频因子。此例中是1分频,就是不分频。
看时钟树选择定时器时钟,周期=定时器时钟/TIM_Prescaler预分频数/(TIM_Period自动重装载寄存器周期-1)
分频值是是指你将系统时钟的频率减小,假设时钟频率是72mhz,然后分频值是7199,现在你的定时器值就是10khz,表示每计一个数,然后过了1/(10^4)秒,然后你的重装值就是你的时间了,如果值是9999,就表示定时时间为1s。
本文标签:stm32f100定时器计算