基於STM32F0的GPIO外部中斷


背景:項目中需要使用hall傳感器檢測門鎖狀態,觸發中斷,發送門鎖狀態信息。(這兒中斷服務中只是點了led燈說明了狀況)

硬件情況:采用PB3管腳,因而使用中斷線:EXTI_Line3和中斷服務函數:EXTI2_3_IRQn。

具體過程:

1、設置中斷時鍾

 RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);

2、配置GPIO

 GPIO_InitTypeDef GPIO_InitStructure;

 RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);

 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;   //輸入
 GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;  //拉高
 GPIO_Init(GPIOB, &GPIO_InitStructure);

3、GPIO與中斷線的映射

 SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOB, EXTI_PinSource3);

4、配置EXTI

 EXTI_InitTypeDef EXTI_InitStructure

 EXTI_InitStructure.EXTI_Line = EXTI_Line3;  //中斷線3
 EXTI_InitStructure.EXTI_LineCmd = ENABLE;
 EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
 EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;  //邊沿觸發
 EXTI_Init(&EXTI_InitStructure);

5、配置NVIC

 NVIC_InitTypeDef NVIC_InitStructure;

 NVIC_InitStructure.NVIC_IRQChannel = EXTI2_3_IRQn;  //頂層頭文件重定義好的
 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
 NVIC_InitStructure.NVIC_IRQChannelPriority = 0x00;  //中斷優先級
 NVIC_Init(&NVIC_InitStructure);

6、中斷服務程序及標志位清除


void EXTI2_3_IRQHandler()  //啟動文件中定義好的
{

  if (LOCK_SENSOR == 0)
  {

    GPIO_SetBits(GPIOF, GPIO_Pin_6);

    GPIO_ResetBits(GPIOF, GPIO_Pin_7);
  }

  if (LOCK_SENSOR == 1)
  {

    GPIO_SetBits(GPIOF, GPIO_Pin_7);

    GPIO_ResetBits(GPIOF, GPIO_Pin_6);
  }

  EXTI_ClearITPendingBit(EXTI_Line3);

}

關於中斷服務函數,需要再強調一下,它主要包含2塊內容,1.中斷所要執行的內容。2.中斷標記位清零(否則會陷入中斷死循環)。

為避免中斷超時,導致死機,可以添加看門狗程序。

還有,中斷是可以進行嵌套的。低優先級中斷執行過程中,進入高優先級中斷,執行完后,返回低優先級中斷,繼續執行。 

STM32外部中斷易出錯總結(詳見鏈接)

http://blog.csdn.net/yskcg/article/details/8201505


免責聲明!

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



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