您的位置 首页 设计

STM32 通用定时器 介绍

STM32的定时器是个强大的模块,定时器使用的频率也是很高的,定时器可以做一些基本的定时,还可以做PWM输出或者输入捕获功能。时钟源问题:

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_TimeBaseInitTypeDef TIM_TimeBaseStructure;
// TIM_OCInitTypeDef TIM_OCInitStructure ;
TIM_DeInit(TIM2); //复位TIM2守时器


TIM_TimeBaseStructure.TIM_Period = 5; // 2.5ms
TIM_TimeBaseStructure.TIM_Prescaler = 36000; // 分频36000
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; // 时钟分频
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //计数方向向上计数
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);


TIM_ClearFlag(TIM2, TIM_FLAG_Update);


TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);


TIM_Cmd(TIM2, ENABLE);
}

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中心对齐形式1计数形式
    TIM_CounterMode_CenterAligned2 TIM中心对齐形式2计数形式
    TIM_CounterMode_CenterAligned3 TIM中心对齐形式3计数形式

单片机时钟频率72MHz,APB1 二分频36MHz,故TIM2主动2倍频至72MHz,故守时器中止频率为72000000/36000/5=400Hz

3.使能守时器中止TIM_Cmd(TIM2, ENABLE);

4.装备NVIC

NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 4;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);

5.写中止函数

void TIM2_IRQHandler(void)

{

……//中止处理

}

STM32通用守时器.
[ 2012-3-5 7:44:00 | By: zhpg009 ]

STM32有8路寄存器,包含TIM1和TIM8两个高档守时器,TIM6和TIM7两个根本守时器,TIM2-TIM5四个通用守时器,守时器是彻底独立的,并且没有相互同享任何资源,它们能够一同同步操作,一切TIMx守时器在内部相连,用于守时器同步或链接。当一个守时器处于主形式时,它能够对另一个处于从形式的守时器的计数器进行复位、发动、中止或供给时钟等操作。

守时器的时钟:

计数器时钟可由下列时钟源供给:

1:内部时钟(CK_INT)

2:外部时钟形式1:外部输入脚(TIx)

3:外部时钟形式2:外部触发输入(ETR)

4:内部触发输入(ITRx):运用一个守时器作为另一个守时器的预分频器,如能够装备一个守时器Timer1而作为另一个守时器Timer2的预分频器。

这些时钟,详细挑选哪个能够通过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秒溢出一次。

总结下来,守时器的溢出公式为:溢出时刻(秒)=(ARR*(PSC+1))/TIMx时钟CK_PSC(MHz)

通用守时器3初始化函数:

voidTimerx_Init(u16arr,u16psc)

{

RCC->APB1ENR|=1<<1;//TIM3时钟使能

TIM3->ARR=arr;//设定计数器主动重装值

TIM3->PSC=psc;//预分频器,得到计数时钟

//这两个寄存器要一起设置才能够运用中止

TIM3->DIER|=1<<0;//答应更新中止

TIM3->DIER|=1<<6;//答应触发中止

TIM3->CR1|=0x01;//使能守时器3

MY_NV%&&&&&%_Init(1,3,TIM3_IRQChannel,2);//抢占1,子优先级3,组2

}

此函数为TIM3进行初始化函数,主函数中进入死循环等候TIM3溢出中止,当TIM3_CNT的值等于TIM3_ARR的值的时分,就会发生TIM3的更新中止,然后在中止里边履行完中止程序后,TIM3_CNT再从0开端计数。

TIMx_CNT寄存器:该寄存器是守时器的计数器,该寄存器存储了当时守时器现已计数的次数。

上面还用到操控寄存器1(TIMx_CR1)位0:

当守时器溢出时会在状况寄存器(TIMx_SR)中的0方位一作为中止标志,当履行完中止程序后应由软件置零。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/ziliao/sheji/260849.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部