l 使能定時器時鐘。函數
RCC_APB1PeriphClockCmd();spa
l 初始化定時器,配置ARR,PSC。code
TIM_TimeBaseInit();blog
l 開啓定時器中斷,配置NVIC。ip
void TIM_ITConfig();it
NVIC_Init();io
l 使能定時器。class
TIM_Cmd();配置
l 編寫中斷服務函數。date
TIMx_IRQHandler();
l 源代碼:
1 //Tout(溢出時間)=(ARR+1)(PSC+1)/Tclk 2 //500ms -> (4999+1)( 7199+1)/72000000 = 0.5s = 500ms 3 void TIM3_Int_Init(u16 arr,u16 psc) 4 { 5 TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; 6 NVIC_InitTypeDef NVIC_InitStructure; 7 8 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //時鐘使能 9 10 //定時器TIM3初始化 11 TIM_TimeBaseStructure.TIM_Period = arr; //設置更新裝載值 12 TIM_TimeBaseStructure.TIM_Prescaler =psc;//設置預分頻值 13 TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //設置時鐘分割 14 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上計數模式 15 TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); 16 17 TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //容許更新中斷 18 19 //中斷優先級NVIC設置 20 NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //TIM3中斷 21 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //0搶佔優先級 22 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //響應優先級 23 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道勢能 24 NVIC_Init(&NVIC_InitStructure); //初始化NVIC寄存器 25 26 27 TIM_Cmd(TIM3, ENABLE); //使能TIM 28 } 29 //定時器3中斷服務程序 30 void TIM3_IRQHandler(void) 31 { 32 if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //檢查是否更新中斷 33 { 34 TIM_ClearITPendingBit(TIM3, TIM_IT_Update ); //清楚更新中斷 35 LED1=!LED1; 36 } 37 } 38 int main(void) 39 { 40 delay_init(); 41 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//搶佔和響應優先級的範圍0~3 42 uart_init(115200); 43 LED_Init(); 44 TIM3_Int_Init(4999,7199); 45 while(1) 46 { 47 LED0=!LED0; 48 delay_ms(200); 49 } 50 }