STM32F103的IO中斷

目錄

1、中斷向量表配置

2、中斷引腳配置

3、中斷處理函數


EXTI0 至 EXTI15 用於 GPIO,通過編程控制可以實現任意一個 GPIO作爲 EXTI的輸入源。由表 18-1 可知, EXTI0 可以通過 AFIO 的外部中斷配置寄存器 1(AFIO_EXTICR1)的EXTI0[3:0]位選擇配置爲 PA0、 PB0、 PC0、 PD0、 PE0、 PF0、 PG0、 PH0 或者 PI0。
 

  XTI9_5_IRQn即5-9線都連接到一箇中斷源上去了,那麼可以有多個外部中斷共同使用這個中斷源,多個外部中斷佔用一箇中斷源的。可以同時配置中斷,且中斷觸發方式不同。只不過他們發生中斷進入的是同一個中斷函數,需要在函數裏面判斷是哪個中斷。至於他們是那種邊緣中斷,各設置各的。

void EXTI9_5_IRQHandler(void)
{
          if(EXTI_GetITStatus(EXTI_Line7) != RESET)
        {        

        }
       
        if(EXTI_GetITStatus(EXTI_Line9) != RESET)          
        {          


                EXTI_ClearITPendingBit(EXTI_Line9);
        }

}
中斷/事件線 輸入源
EXTI0 PX0(X 可爲 A,B,C,D,E,F,G,H,I)
EXTI1 PX1(X 可爲 A,B,C,D,E,F,G,H,I)
EXTI2 PX2(X 可爲 A,B,C,D,E,F,G,H,I)
EXTI3 PX3(X 可爲 A,B,C,D,E,F,G,H,I)
EXTI4 PX4(X 可爲 A,B,C,D,E,F,G,H,I)
EXTI5 PX5(X 可爲 A,B,C,D,E,F,G,H,I)
EXTI6 PX6(X 可爲 A,B,C,D,E,F,G,H,I)
EXTI7 PX7(X 可爲 A,B,C,D,E,F,G,H,I)
EXTI8 PX8(X 可爲 A,B,C,D,E,F,G,H,I)
EXTI9 PX9(X 可爲 A,B,C,D,E,F,G,H,I)
EXTI10 PX10(X 可爲 A,B,C,D,E,F,G,H,I)
EXTI11 PX11(X 可爲 A,B,C,D,E,F,G,H,I)
EXTI12 PX12(X 可爲 A,B,C,D,E,F,G,H,I)
EXTI13 PX13(X 可爲 A,B,C,D,E,F,G,H,I)
EXTI14 PX14(X 可爲 A,B,C,D,E,F,G,H,I)
EXTI15 PX15(X 可爲 A,B,C,D,E,F,G,H,I)
EXTI16 PVD 輸出
EXTI17 RTC 鬧鐘事件
EXTI18 USB 喚醒事件
EXTI19 以太網喚醒事件(只適用互聯型)

 

 

1、中斷向量表配置

使用GPIOC,PIN5,中斷EXTI9_5_IRQn

/**
  * @brief  配置嵌套向量中斷控制器NVIC
  * @param  無
  * @retval 無
  */
static void NVIC_Configuration(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;
  
  /* 配置NVIC爲優先級組1 */
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
  
  /* 配置中斷源:按鍵1 */
  NVIC_InitStructure.NVIC_IRQChannel =  EXTI9_5_IRQn;
  /* 配置搶佔優先級 */
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  /* 配置子優先級 */
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  /* 使能中斷通道 */
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
  

}

2、中斷引腳配置

1、浮空輸入;2、輸入中斷模式;3、信號源的選擇;4、上升沿下降沿進入中斷

 /**
  * @brief  配置 IO爲EXTI中斷口,並設置中斷優先級
  * @param  無
  * @retval 無
  */
void EXTI_Config(void)
{
          GPIO_InitTypeDef GPIO_InitStructure; 
          EXTI_InitTypeDef EXTI_InitStructure;

          /*開啓按鍵GPIO口的時鐘*/
          RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO,ENABLE);
                                                                                              
          /* 配置 NVIC 中斷*/
          NVIC_Configuration();

          /*--------------------------配置引腳-----------------------------*/
          /* 選擇按鍵用到的GPIO */	
          GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_5;
          /* 配置爲浮空輸入 */	
          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING ;

          //GPIO_Initstructure.GPIO_Speed = GPIO_Speed_2MHz;

          GPIO_Init( GPIOC, &GPIO_InitStructure);



          /* -------------選擇EXTI的信號源 -------------*/
          GPIO_EXTILineConfig( GPIO_PortSourceGPIOC,  GPIO_PinSource5); 
          EXTI_InitStructure.EXTI_Line =  EXTI_Line5;

          /* EXTI爲中斷模式 */
          EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
          /* 上升沿中斷 */
          EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;//EXTI_Trigger_Rising;//EXTI_Trigger_Rising_Falling
          /* 使能中斷 */
          EXTI_InitStructure.EXTI_LineCmd = ENABLE;
          EXTI_Init(&EXTI_InitStructure);

	

}

3、中斷處理函數

中斷函數在哪裏都沒問題????? 我一般卸載stm32f10x_it.c

void EXTI9_5_IRQHandler(void)
{
	if(EXTI_GetITStatus(INT_EXTI_LINE) != RESET) 
	{
          
           if(GPIO_ReadInputDataBit(INT_GPIO_PORT,  INT_GPIO_PIN) )
          {
                      GPIO_ResetBits(OUT7_GPIO_PORT, OUT7_GPIO_PIN);
          }
          else
          {
                      GPIO_SetBits(OUT7_GPIO_PORT, OUT7_GPIO_PIN);
          
          }

         

          EXTI_ClearITPendingBit(INT_EXTI_LINE);     
	}  
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章