stm32通用定時(shí)器的使用
一、定時(shí)器的種類和時(shí)鐘
stm一共有8個(gè)定時(shí)器,其中tim1和tim8為高級(jí)定時(shí)器。tim2~tim7為通用定時(shí)器。
高級(jí)定時(shí)器的時(shí)鐘源掛載在apb2上(apb2=AHB),通用定時(shí)器掛載在apb1上(apb1=1/2AHB)。
下面給出一張時(shí)鐘樹(shù)的圖:
從圖中可以看出,如果apb1 prescaler=1,則tim2~tim7的時(shí)鐘為定時(shí)器時(shí)鐘等于apb1的時(shí)鐘,而在stm32時(shí)鐘的默認(rèn)配置中,apb1=1/2 AHB,所以,這里定時(shí)器時(shí)鐘頻率是apb1的兩倍,即72M。而tim1和TIM7的頻率也是72M。
二、stm32通用定時(shí)器配置步驟:
1、初始化時(shí)鐘
RCC_APB1PeriphClockCmd (RCC_APB1Periph_TIM2 ,ENABLE );
2、定時(shí)器基本配置。
void Timer2_Configuration(void )
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_DeInit (TIM2 );//復(fù)位
TIM_InternalClockConfig(TIM2);//使用內(nèi)部時(shí)鐘
TIM_TimeBaseStructure.TIM_Period =2000-1;//計(jì)數(shù)周期
TIM_TimeBaseStructure .TIM_Prescaler =36000-1;//預(yù)分頻
TIM_TimeBaseStructure .TIM_ClockDivision =TIM_CKD_DIV1 ;//設(shè)置時(shí)鐘分割
TIM_TimeBaseStructure .TIM_CounterMode =TIM_CounterMode_Up ;//向上計(jì)數(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 );//開(kāi)啟tim2中斷
TIM_Cmd(TIM2,ENABLE);//使能定時(shí)器
}
TIM_Period設(shè)置了在下一個(gè)更新事件裝入活動(dòng)的自動(dòng)重裝載寄存器周期的值。它的取值必須在0x0000和0xFFFF之間。
TIM_Prescaler設(shè)置了用來(lái)作為T(mén)IMx時(shí)鐘頻率除數(shù)的預(yù)分頻值。它的取值必須在0x0000和0xFFFF之間。
TIM_ClockDivision的作用是做一段延時(shí),一般在特殊場(chǎng)合的時(shí)候會(huì)用到,可不關(guān)心。
TIM_CounterMode選擇了計(jì)數(shù)器模式。
TIM_CounterMode_Up TIM向上計(jì)數(shù)模式 TIM_CounterMode_Down TIM向下計(jì)數(shù)模式 TIM_CounterMode_CenterAligned1 TIM中央對(duì)齊模式1計(jì)數(shù)模式 TIM_CounterMode_CenterAligned2 TIM中央對(duì)齊模式2計(jì)數(shù)模式 TIM_CounterMode_CenterAligned3 TIM中央對(duì)齊模式3計(jì)數(shù)模式
單片機(jī)時(shí)鐘頻率72MHz,APB1 二分頻36MHz,故TIM2自動(dòng)2倍頻至72MHz,故定時(shí)器中斷頻率為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();
}
}