"Preparación de la copa del puente azul" STM32 interrupción externa void GPIO_EXTILineConfig()

¡ Cada puerto IO de STM32 se puede usar como una entrada de interrupción externa!

1. El controlador de interrupciones STM32 admite 19 solicitudes de eventos/interrupciones externas

  • Línea 0-15: Interrupción de entrada del puerto IO externo
  • Línea 16: Conectar a salida PVD
  • Línea 17: Conexión al evento de alarma RTC
  • Línea 18: Conectar al evento de activación USB

(1) Mucha gente piensa erróneamente que STM32 solo admite 16 solicitudes de eventos/interrupciones externas, porque han entendido mal que "GPIOA tiene 16 PA0~PA15 en total, por lo que solo se admiten 16 solicitudes de eventos/interrupciones externas" . De hecho, hay tres que se usan con menos frecuencia.
(2) En el programa de funciones de la biblioteca STM32, no hay un EXTI5_IRQHandler separado y, de manera similar, EXTI6, EXTI7, EXTI8... ¡nada! ,Como se muestra abajo:

EXTI0_IRQHandler
EXTI1_IRQHandler
EXTI2_IRQHandler
EXTI3_IRQHandler
EXTI4_IRQHandler
EXTI9_5_IRQHandler
EXTI15_10_IRQHandler

Además, recuerde que el nombre de la función de servicio de interrupción se ha definido, consulte startup_stm32f10x_xx.s, no puede ser definido por el usuario, ¡está relacionado con la dirección de entrada de la función de servicio de interrupción!

2. Tres métodos de activación de interrupciones

Gatillo de flanco ascendente Gatillo de
flanco descendente Gatillo de flanco
doble (tanto gatillo de flanco ascendente como gatillo de flanco descendente)

¿Pero cuál usar? , de acuerdo con el principio de análisis específico del problema específico, verifique el diagrama esquemático del hardware:
inserte la descripción de la imagen aquí
como se muestra en la figura anterior, antes de presionar el botón, K1 está en 3V3, que es un nivel alto; después de presionar el botón, GND es un nivel bajo En el modo de interrupción externa, "hacer algunas cosas después de presionar el botón" , se debe usar el método de activación de flanco descendente.

3. Plantilla de programa para interrupción externa

1初始化IO口为输入。
 
       GPIO_Init();
 
2开启IO口复用时钟。
       /* Enable AFIO clock */
       RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
 
3设置IO口与中断线的映射关系。
     /* Connect EXTIx Line to PAx pin */
       void GPIO_EXTILineConfig();
 
4初始化线上中断,设置触发条件等。
 
       EXTI_Init();
 
5配置中断分组(NVIC),并使能中断。
       NVIC_Init();
 
6编写中断服务函数。
      EXTIx_IRQHandler();
 
记得清除中断标志位 EXTI_ClearITPendingBit();

4. Procedimientos relacionados

#include "KEY.h"


void Key_Init()
{
    
    
  EXTI_InitTypeDef   EXTI_InitStructure;
  GPIO_InitTypeDef   GPIO_InitStructure;
  NVIC_InitTypeDef   NVIC_InitStructure;
	
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB, ENABLE);
	 /*PA0,PA8对应KEY1,KEY2*/
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_8;
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
 GPIO_Init(GPIOA, &GPIO_InitStructure);
	 /*PB1,PB2对应KEY3,KEY4*/
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_2;
 GPIO_Init(GPIOB, &GPIO_InitStructure);
	
	  /* Enable AFIO clock */
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);

  /* Connect EXTI0 and EXTI8 Line to PA0 and PA8 pin */
 GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);
 GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource8);
	
	  /* Configure EXTI0 和EXTI8  line */
 EXTI_InitStructure.EXTI_Line = EXTI_Line0|EXTI_Line8;
 EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
 EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;  
 EXTI_InitStructure.EXTI_LineCmd = ENABLE;
 EXTI_Init(&EXTI_InitStructure);
		
		
 NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0F;
 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0F;
 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
 NVIC_Init(&NVIC_InitStructure);
		
 NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;
 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0F;
 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0F;
 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
 NVIC_Init(&NVIC_InitStructure);				
}

void EXTI0_IRQHandler(void)
{
    
      
  if(EXTI_GetITStatus(EXTI_Line0) != RESET)
  {
    
    
    /* Clear the  EXTI line 0 pending bit */
    EXTI_ClearITPendingBit(EXTI_Line0);
    /*用户编写程序,按键按下是做什么事情?*/
	}

}

void EXTI9_5_IRQHandler(void)
{
    
     
  if(EXTI_GetITStatus(EXTI_Line8) != RESET)
  {
    
    
    EXTI_ClearITPendingBit(EXTI_Line8);
   /*用户编写程序,按键按下是做什么事情?*/
  }

}

Supongo que te gusta

Origin blog.csdn.net/Eterlove/article/details/122481632
Recomendado
Clasificación