1. 程式人生 > >STM32學習之:外部中斷

STM32學習之:外部中斷

一、STM32中斷分組:

  STM32 的每一個GPIO都能配置成一個外部中斷觸發源,這點也是 STM32 的強大之處。STM32 通過根據引腳的序號不同將眾多中斷觸發源分成不同的組,比如:PA0,PB0,PC0,PD0,PE0,PF0,PG0為第一組,那麼依此類推,我們能得出一共有16 組,STM32 規定,每一組中同時只能有一箇中斷觸發源工作,那麼,最多工作的也就是16個外部中斷。STM32F103 的中斷控制器支援 19 個外部中斷/事件請求。每個中斷設有狀態位,每個中斷/事件都有獨立的觸發和遮蔽設定。STM32F103 的19 個外部中斷為:

線 0~15:對應外部 IO 口的輸入中斷。

GPIO引腳中斷標誌位中斷處理函式
PA0~PG0EXTI0EXTI0_IRQHandler
PA1~PG1EXTI1EXTI1_IRQHandler
PA2~PG2EXTI2EXTI2_IRQHandler
PA3~PG3EXTI3EXTI3_IRQHandler
PA4~PG4EXTI4EXTI4_IRQHandler
PA5~PG5EXTI5EXTI9_5_IRQHandler
PA6~PG6EXTI6
PA7~PG7EXTI7
PA8~PG8EXTI8
PA9~PG9EXTI9
PA10~PG10EXTI10EXTI15_10_IRQHandler
PA11~PG11EXTI11
PA12~PG12EXTI12
PA13~PG13EXTI13
PA14~PG14EXTI14
PA15~PG15EXTI15

線 16:連線到 PVD 輸出。

線 17:連線到 RTC 鬧鐘事件。

線 18:連線到 USB 喚醒事件。

二:外部中斷的配置過程:

  1、配置觸發源GPIO口:

  因為GPIO口作為觸發源使用,所以將GPIO口配置成輸入模式,觸發模式有以下幾種:

  a.GPIO_Mode_AIN ,模擬輸入(ADC模擬輸入,或者低功耗下省電)

  b.GPIO_Mode_IN_FLOATING ,浮空輸入

  c.GPIO_Mode_IPD ,帶下拉輸入

  d.GPIO_Mode_IPU ,帶上拉輸入

複製程式碼
  GPIO_InitTypeDef GPIO_InitStructure;//定義結構體
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);//使能時鐘   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;//選擇IO口 PE2   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//設定成上拉輸入   GPIO_Init(GPIOE, &GPIO_InitStructure);//使用結構體資訊進行初始化IO口
複製程式碼

  2、使能AFIO複用時鐘功能:

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);

  3、將GPIO口與中斷線對映起來:

  GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource2);

  4、中斷線上進行中斷初始化:

複製程式碼
  EXTI_InitTypeDef EXTI_InitStructure;//定義初始化結構體

  EXTI_InitStructure.EXTI_Line=EXTI_Line2; //中斷線的標號 取值範圍為EXTI_Line0~EXTI_Line15

  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//中斷模式,可選值為中斷 EXTI_Mode_Interrupt 和事件 EXTI_Mode_Event。

  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;//觸發方式,可以是下降沿觸發 EXTI_Trigger_Falling,上升沿觸發 EXTI_Trigger_Rising,或者任意電平(上升沿和下降沿)觸發EXTI_Trigger_Rising_Falling

  EXTI_InitStructure.EXTI_LineCmd = ENABLE;

  EXTI_Init(&EXTI_InitStructure);//根據結構體資訊進行初始化
複製程式碼

  5、中斷優先順序配置:

複製程式碼
  NVIC_InitTypeDef NVIC_InitStructure;//定義結構體

  NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn; //使能外部中斷所在的通道

  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //搶佔優先順序 2, 

  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02; //子優先順序 2

  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中斷通道 

  NVIC_Init(&NVIC_InitStructure); //根據結構體資訊進行優先順序初始化 
複製程式碼

  6、外部中斷服務函式的編寫:

  外部中斷函式分別為:

  EXPORT   EXTI0_IRQHandler          

  EXPORT   EXTI1_IRQHandler       

  EXPOR T   EXTI2_IRQHandler         

  EXPORT   EXTI3_IRQHandler        

  EXPORT   EXTI4_IRQHandler          

  EXPORT   EXTI9_5_IRQHandler        

  EXPORT   EXTI15_10_IRQHandler

  中斷線 0-4 每個中斷線對應一箇中斷函式,中斷線 5-9 共用中斷函式 EXTI9_5_IRQHandler,中斷線 10-15 共用中斷函式 EXTI15_10_IRQHandler。  

複製程式碼
  void EXTI2_IRQHandler(void)
  {
    if(EXTI_GetITStatus(EXTI_Line2)!=RESET)//判斷某個線上的中斷是否發生 

    {
      中斷邏輯…
      EXTI_ClearITPendingBit(EXTI_Line2);   //清除 LINE 上的中斷標誌位
    }     
  }
複製程式碼

三、關於使用GPIO口接按鍵進行外部中斷的配置說明:

  使用按鍵進行外部中斷的時候,一般都需要進行按鍵延時消抖以及鬆手檢測的相關處理,中斷函式可以參看以下程式碼:

複製程式碼
  void EXTI2_IRQHandler(void)
  {
    delay_ms(10);//延時消抖
    if(KEY2==0)    //按鍵真的被按下
      {
        LED0=!LED0;
      }
    while(KEY2!=0);//等待鬆手
    EXTI_ClearITPendingBit(EXTI_Line2); //清楚中斷標誌位 
  }
複製程式碼

  當然,如果你的按鍵是允許長按功能的,那麼就進行別的邏輯操作,這裡不作研究。