1. 程式人生 > >[STM32F103]定時器中斷

[STM32F103]定時器中斷

l 使能定時器時鐘。

  RCC_APB1PeriphClockCmd();

l 初始化定時器,配置ARR,PSC。

  TIM_TimeBaseInit();

l 開啟定時器中斷,配置NVIC。

  void TIM_ITConfig();

  NVIC_Init();

l 使能定時器。

  TIM_Cmd();

l 編寫中斷服務函式。

  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 }