STM32学习——EXTI外部中断

EXTI简介

EXTI可以实现对外部输入信号的上升沿检测和下降沿的检测。EXTI可以实现对每个中断/事件线进行单独配置,可以单独配置为中断或者事件,以及触发事件的属性。
STM32学习——EXTI外部中断_第1张图片
可以看到EXTI一共有20条信号线,即可同时检测来自20路的中断请求。
STM32学习——EXTI外部中断_第2张图片

代码实现

(1)首先配置GPIO初始化结构体
GPIO要配置为浮空输入

void Key_Config(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC,ENABLE);
	
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
	
	GPIO_Init(GPIOA,&GPIO_InitStructure);
	
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13;
	GPIO_Init(GPIOC,&GPIO_InitStructure);
}

(2)配置NVIC中断控制器

static void NVIC_Configuration(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;
  
  /* 配置NVIC为优先级组1 */
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
  
  /* 配置中断源:按键1 */
  NVIC_InitStructure.NVIC_IRQChannel =EXTI0_IRQn;
  /* 配置抢占优先级 */
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  /* 配置子优先级 */
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  /* 使能中断通道 */
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
  
  /* 配置中断源:按键2,其他使用上面相关配置 */  
  NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;
  NVIC_Init(&NVIC_InitStructure);
}

(3)配置EXTI初始化结构体
记得打开时钟!

void EXTI_Key_Config(void)
{
	EXTI_InitTypeDef EXTI_InitStructure;

											
	/* 配置 NVIC 中断*/
	NVIC_Configuration();
	Key_Config();
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);

	/* 选择EXTI的信号源 */
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0); 
	EXTI_InitStructure.EXTI_Line = EXTI_Line0;
	
	/* EXTI为中断模式 */
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
	/* 上升沿中断 */
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
    /* 使能中断 */	
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    EXTI_Init(&EXTI_InitStructure);
	

	/* 选择EXTI的信号源 */
    GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource13); 
    EXTI_InitStructure.EXTI_Line = EXTI_Line13;
	
	/* EXTI为中断模式 */
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
	/* 下降沿中断 */
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
    /* 使能中断 */	
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    EXTI_Init(&EXTI_InitStructure);
}

(4)编写中断服务函数

void EXTI0_IRQHandler(void)
{
  //确保是否产生了EXTI Line中断
	if(EXTI_GetITStatus(EXTI_Line0) != RESET) 
	{
		// LED1 取反
		if(GPIO_ReadOutputDataBit(GPIOC,GPIO_Pin_2))
			GPIO_ResetBits(GPIOC,GPIO_Pin_2);
		else
			GPIO_SetBits(GPIOC,GPIO_Pin_2);
   		 //清除中断标志位
		EXTI_ClearITPendingBit(EXTI_Line0);     
	}  
}

Reference:野火教程

你可能感兴趣的:(#,STM32学习系列)