stm32通用定时器的使用
扫描二维码
随时随地手机看文章
一、定时器的种类和时钟
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();
}
}