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);     
	}  
}

 

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