STM32的守时器是个强壮的模块,守时器运用的频率也是很高的,守时器能够做一些根本的守时,还能够做PWM输出或许输入捕获功用。
时钟源问题:
名为TIMx的有八个,其间TIM1和TIM8挂在APB2总线上,而TIM2-TIM7则挂在
APB1总线上。其间TIM1&TIM8称为高档操控守时器(advanced control timer).他们地点的APB2总线也比APB1总线要好。APB2能够作业在72MHz下,而APB1最大是36MHz。
守时器的时钟不是直接来自APB1或APB2,而是来自于输入为APB1或APB2的一个倍频器。
下面以守时器2~7的时钟阐明这个倍频器的效果:当APB1的预分频系数为1时,这个倍频器不起效果,守时器的时钟频率等于APB1的频率;当APB1的预分频系数为其它数值(即预分频系数为2、4、8或16)时,这个倍频器起效果,守时器的时钟频率等于APB1的频率两倍。
假定AHB=36MHz,由于APB1答应的最大频率为36MHz,所以APB1的预分频系数能够取恣意数值;当预分频系数=1时,APB1=36MHz,TIM2~7的时钟频率=36MHz(倍频器不起效果);当预分频系数=2时,APB1=18MHz,在倍频器的效果下,TIM2~7的时钟频率=36MHz。
有人会问,已然需求TIM2~7的时钟频率=36MHz,为什么不直接取APB1的预分频系数=1?答案是:APB1不光要为TIM2~7供给时钟,并且还要为其它外设供给时钟;设置这个倍频器能够在确保其它外设运用较低时钟频率时,TIM2~7仍能得到较高的时钟频率。
再举个比如:当AHB=72MHz时,APB1的预分频系数有必要大于2,由于APB1的最大频率只能为36MHz。假如APB1的预分频系数=2,则由于这个倍频器,TIM2~7依然能够得到72MHz的时钟频率。能够运用更高的时钟频率,无疑提高了守时器的分辨率,这也正是规划这个倍频器的初衷。
TIM通用守时器装备过程:
1.装备TIM时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
2.守时器根本装备
void TIM2_Configuration(void)
{
}
TIM_Period设置了鄙人一个更新事情装入活动的主动重装载寄存器周期的值。它的取值有必要在0x0000和0xFFFF之间。
TIM_Prescaler设置了用来作为TIMx时钟频率除数的预分频值。它的取值有必要在0x0000和0xFFFF之间。
TIM_ClockDivision的效果是做一段延时,一般在特别场合的时分会用到,可不关怀。
TIM_CounterMode挑选了计数器形式。
TIM_CounterMode_Up
TIM向上计数模式
TIM_CounterMode_Down
TIM向下计数形式
TIM_CounterMode_CenterAligned1
TIM_CounterMode_CenterAligned2
TIM_CounterMode_CenterAligned3
单片机时钟频率72MHz,APB1 二分频36MHz,故TIM2主动2倍频至72MHz,故守时器中止频率为72000000/36000/5=400Hz
3.使能守时器中止TIM_Cmd(TIM2, ENABLE);
4.装备NVIC。
5.写中止函数
void TIM2_IRQHandler(void)
{
……//中止处理
}
STM32 |
[ 2012-3-5 7:44:00 | By: zhpg009 ]
|
STM32有8路寄存器,包含TIM1和TIM8两个高档守时器,TIM6和TIM7两个根本守时器,TIM2-TIM5四个通用守时器,守时器是彻底独立的,并且没有相互同享任何资源,它们能够一同同步操作,一切TIMx守时器在内部相连,用于守时器同步或链接。当一个守时器处于主形式时,它能够对另一个处于从形式的守时器的计数器进行复位、发动、中止或供给时钟等操作。 守时器的时钟: 计数器时钟可由下列时钟源供给: 这些时钟,详细挑选哪个能够通过TIMx_SMCR寄存器的相关位来设置。这儿的CK_INT时钟是从APB1倍频的来的,除非APB1的时钟分频数设置为1,不然通用守时器TIMx的时钟是APB1时钟的2倍,当APB1的时钟不分频的时分,通用守时器TIMx的时钟就等于APB1的时钟。这儿还要留意的便是高档守时器的时钟不是来自APB1,而是来自APB2的。 守时器的中心: 提到守时器的中心,天然少不了两个,一个是计数时钟(每隔多长时刻计一次),二是计多少次溢出,这两个就一起决议了溢出时刻。 守时器的计数时钟依据守时器的不同别离来自APB1或APB2,计数时钟说白了便是要把一秒分红许多份,但由于总线时钟一般在数十兆,通过分频的APB也在数十兆,所以要把APB再分频至更低的频率,这就需求设置预分频寄存器。例如当时APB1为36MHz,上面加黑的一段现已说过,除非APB1的时钟分频数设置为1,不然通用守时器TIMx的时钟是APB1时钟的2倍,这时的TIMx时钟为72MHz,因而分频至10KHz需求设置预分频器寄存器TIMx_PSC(如下图)为7199,为什么是7199而不是7200呢?下面寄存器介绍阐明晰这点:计数器时钟CK_CNT等于TIMx时钟/(PSC+1),所以只需设置寄存器值7199就行了。这儿10KHz的频率相当于把一秒分为10000份,即0.0001秒,守时器每隔0.0001秒涨一次。 注:由于PSC是16位寄存器,所以值规模为0-65535。 计数器主动重装载寄存器TIMx_PSC,该寄存器寄存的便是计数器要添加的次数(计多少次溢出)。 注:由于ARR也是16位寄存器,所以值规模为0-65535。 这样这两个寄存器决议了溢出时刻,接着上面的比如,假如设置ARR寄存器值为5000,那便是说守时器每隔0.0001秒涨一次,一共涨5000次,这样便是0.5秒溢出一次。 总结下来,守时器的溢出公式为:溢出时刻(秒)= 通用守时器3初始化函数: void { RCC->APB1ENR|=1<<1;//TIM3时钟使能 TIM3->PSC=psc; //这两个寄存器要一起设置才能够运用中止 TIM3->DIER|=1<<0; TIM3->DIER|=1<<6; TIM3->CR1|=0x01; } 此函数为TIM3进行初始化函数,主函数中进入死循环等候TIM3溢出中止,当TIM3_CNT的值等于TIM3_ARR的值的时分,就会发生TIM3的更新中止,然后在中止里边履行完中止程序后,TIM3_CNT再从0 TIMx_CNT寄存器:该寄存器是守时器的计数器,该寄存器存储了当时守时器现已计数的次数。 上面还用到操控寄存器1(TIMx_CR1) 当守时器溢出时会在状况寄存器(TIMx_SR) |