STM32學習筆記之EXTI(外部中斷)


參考資料:STM32數據手冊、網絡資料

=========================================切割線=========================================

      外部中斷/事件控制器由19個產生事件/中斷要求的邊沿檢測器組成。每一個輸入線能夠獨立地配置

輸入類型(脈沖或掛起)和相應的觸發事件(上升沿或下降沿或者雙邊沿都觸發)。每一個輸入線都能夠被獨

立的屏蔽。掛起寄存器保持着狀態線的中斷要求。

=========================================切割線=========================================

19個中斷例如以下:

未命名

17——EXTI線16連接到PVD輸出

18——EXTI線17連接到RTC鬧鍾事件

19——EXTI線18連接到USB喚醒事件

 

注:有上圖可知EXTI0連接的引腳為PA0、PB0、PC0、PD0、PE0、PF0、PG0,其它外部中斷EXTI1——

EXTI15類似。所以在使用時盡量將須要的外部中斷配置在不同的EXTIx上。

     比如須要3個外部中斷,我們能夠配置到PA0、PB4、PG3上。此時每一個中斷都有自己的中斷處理程

    序段。假設配置到PA0、PB0、PC1。則PA0和PB0將公用一個中斷程序段。

當然假設特殊須要,也

    能夠這樣設計。

=========================================切割線=========================================

配置用法:

  1. 初始化對應的GPIO管腳
  2. 配置外部中斷源並進行中斷源和GPIO的連接
  3. 編寫對應中斷源的中斷處理程序

=========================================切割線=========================================

程序代碼

  • 初始化對應的GPIO管腳

GPIO_InitTypeDef GPIO_InitStructure;


RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);           
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);


GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed =GPIO_Speed_50MHz;   
GPIO_Init(GPIOE, &GPIO_InitStructure);


GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed =GPIO_Speed_50MHz;   
GPIO_Init(GPIOB, &GPIO_InitStructure);

注:GPIO的復用功能必須打開,如紅字部分

  • 配置外部中斷源並進行中斷源和GPIO的連接


GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource0);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource1);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource8);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource9);

 
EXTI_InitStructure.EXTI_Line =EXTI_Line0|EXTI_Line1|EXTI_Line8|EXTI_Line9;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);

  • 編寫對應中斷源的中斷處理程序


void EXTI0_IRQHandler(void)
{
  if(Sys_Status > MIN_STATUS)
  {
    Sys_Status--;
  }
  EXTI_ClearITPendingBit(EXTI_Line0);
}


void EXTI1_IRQHandler(void)
{
  PEout(2) = ~PEout(2);
  EXTI_ClearITPendingBit(EXTI_Line1);
}


#define Exti_From_Pin8 0x00000100
#define Exti_From_Pin9 0x00000200

void EXTI9_5_IRQHandler(void)
{

  u32 Temp = 0x00; 

  PEout(2) = ~PEout(2);
  Temp =EXTI->PR;      //取讀是那個引腳的中斷
  switch(Temp)
  {
    caseExti_From_Pin8:
     EXTI_ClearITPendingBit(EXTI_Line8);
     break;
    caseExti_From_Pin9:
     if(Sys_Status < MAX_STATUS)
     {
       Sys_Status ++;
     }
     EXTI_ClearITPendingBit(EXTI_Line9);
     break;
   default:break;
  }
}

=========================================切割線=========================================

中斷處理程序說明。因為外部中斷EXTI5——EXTI9公用了一個中斷(EXTI10——EXTI15類似)所以要

區分不同的中斷源須要進行對應的推斷。

如上EXTI9_5_IRQHandler中,通過取讀EXTI->PR寄存器來判

斷中斷的來源。

轉自http://blog.sina.com.cn/s/blog_6623834301018woa.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM