当前位置:首页 > 单片机 > 单片机
[导读]一、定时器的种类和时钟stm一共有8个定时器,其中tim1和tim8为高级定时器。tim2~tim7为通用定时器。高级定时器的时钟源挂载在apb2上(apb2=AHB),通用定时器挂载在apb1上(apb1=1/2AHB)。下面给出一张时钟树的图:从

一、定时器的种类和时钟

stm一共有8个定时器,其中tim1和tim8为高级定时器。tim2~tim7为通用定时器。

高级定时器的时钟源挂载在apb2上(apb2=AHB),通用定时器挂载在apb1上(apb1=1/2AHB)。

下面给出一张时钟树的图:

从图中可以看出,如果apb1 prescaler=1,则tim2~tim7的时钟为定时器时钟等于apb1的时钟,而在stm32时钟的默认配置中,apb1=1/2 AHB,所以,这里定时器时钟频率是apb1的两倍,即72M。而tim1和TIM7的频率也是72M。

二、stm32通用定时器配置步骤:

1、初始化时钟

RCC_APB1PeriphClockCmd (RCC_APB1Periph_TIM2 ,ENABLE );

2、定时器基本配置。

void Timer2_Configuration(void )

{

TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

TIM_DeInit (TIM2 );//复位

TIM_InternalClockConfig(TIM2);//使用内部时钟

TIM_TimeBaseStructure.TIM_Period =2000-1;//计数周期

TIM_TimeBaseStructure .TIM_Prescaler =36000-1;//预分频

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_ARRPreloadConfig (TIM2,DISABLE );//

TIM_ITConfig (TIM2,TIM_IT_Update ,ENABLE );//开启tim2中断

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/2000=1Hz


3、配置NVIC中断向量表

void NVIC_Configuration(void)

{

NVIC_InitTypeDef NVIC_InitStructure;

NVIC_PriorityGroupConfig (NVIC_PriorityGroup_1);

NVIC_InitStructure .NVIC_IRQChannel =TIM2_IRQn ;

NVIC_InitStructure .NVIC_IRQChannelPreemptionPriority =0;

NVIC_InitStructure .NVIC_IRQChannelSubPriority =0;

NVIC_InitStructure .NVIC_IRQChannelCmd =ENABLE ;

NVIC_Init(&NVIC_InitStructure );

}

4、添加中断处理函数

void TIM2_IRQHandler(void)

{

if(TIM_GetITStatus (TIM2 ,TIM_IT_Update )!=RESET )

{

TIM_ClearITPendingBit (TIM2 ,TIM_IT_Update );

GPIO_Reverse();

}

}


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除( 邮箱:macysun@21ic.com )。
换一批
延伸阅读
关闭