一、定時器的種類和時鐘
stm一共有8個定時器,其中tim1和tim8為高級定時器。tim2~tim7為通用定時器。
高級定時器的時鐘源掛載在apb2上(apb2=AHB),通用定時器掛載在apb1上(apb1=1/2AHB)。
下面給出一張時鐘樹的圖:
從圖中可以看出,如果apb1 prescaler=1,則tim2~tim7的時鐘為定時器時鐘等于apb1的時鐘,而在stm32時鐘的默認(rèn)配置中,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 );//復(fù)位
TIM_InternalClockConfig(TIM2);//使用內(nèi)部時鐘
TIM_TimeBaseStructure.TIM_Period =2000-1;//計數(shù)周期
TIM_TimeBaseStructure .TIM_Prescaler =36000-1;//預(yù)分頻
TIM_TimeBaseStructure .TIM_ClockDivision =TIM_CKD_DIV1 ;//設(shè)置時鐘分割
TIM_TimeBaseStructure .TIM_CounterMode =TIM_CounterMode_Up ;//向上計數(shù)
TIM_TimeBaseInit (TIM2 ,&TIM_TimeBaseStructure );
TIM_ClearFlag(TIM2,TIM_FLAG_Update );//清除溢出中斷標(biāo)志
TIM_ARRPreloadConfig (TIM2,DISABLE );//
TIM_ITConfig (TIM2,TIM_IT_Update ,ENABLE );//開啟tim2中斷
TIM_Cmd(TIM2,ENABLE);//使能定時器
}
TIM_Period設(shè)置了在下一個更新事件裝入活動的自動重裝載寄存器周期的值。它的取值必須在0x0000和0xFFFF之間。
TIM_Prescaler設(shè)置了用來作為TIMx時鐘頻率除數(shù)的預(yù)分頻值。它的取值必須在0x0000和0xFFFF之間。
TIM_ClockDivision的作用是做一段延時,一般在特殊場合的時候會用到,可不關(guān)心。
TIM_CounterMode選擇了計數(shù)器模式。
TIM_CounterMode_Up TIM向上計數(shù)模式 TIM_CounterMode_Down TIM向下計數(shù)模式 TIM_CounterMode_CenterAligned1 TIM中央對齊模式1計數(shù)模式 TIM_CounterMode_CenterAligned2 TIM中央對齊模式2計數(shù)模式 TIM_CounterMode_CenterAligned3 TIM中央對齊模式3計數(shù)模式
單片機(jī)時鐘頻率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、添加中斷處理函數(shù)
void TIM2_IRQHandler(void)
{
if(TIM_GetITStatus (TIM2 ,TIM_IT_Update )!=RESET )
{
TIM_ClearITPendingBit (TIM2 ,TIM_IT_Update );
GPIO_Reverse();
}
}