STM32 --- Interrupción externa

Tabla de contenido

 

1. Descripción de la interrupción externa

2. Diagrama de bloques de interrupciones externas

Resumen: Después de analizar el diagrama de bloques, se pueden generar interrupciones de software e interrupciones de eventos El propósito de las interrupciones de software es ingresar a la función de servicio de interrupciones. La interrupción de eventos es generar una señal de pulso a los periféricos en el chip, que pertenece al nivel de hardware.

3. Correspondencia portuaria

4. Ideas de programación

SALIDA

NVIC

EXTI1_IRQHandler EXTI9_5_IRQHandler EXTI15_10_IRQHandler

5. Código


1. Descripción de la interrupción externa

Actuando en el puerto GPIO, haciendo referencia a la interrupción externa del chip como fuente de interrupción.

Los productos generales tienen 19 interrupciones externas y los productos interconectados tienen 20 interrupciones externas. Solo hay 16 interrupciones externas (0-15) en el verdadero sentido.

Los cuatro restantes:

La línea EXTI 16 está conectada a la salida PVD

La línea EXTI 17 está conectada al evento de alarma RTC

La línea EXTI 18 está conectada al evento de activación USB

La línea EXTI 19 está conectada al evento de activación de Ethernet (solo aplicable a productos interconectados)

Nota: Cada fuente de interrupción de EXIT0-EXIT4 corresponde a una dirección de entrada de interrupción. EXIT5-EXIT9 comparten una dirección de entrada de interrupción. . EXIT10-EXIT15 comparten una dirección de entrada de interrupción

2. Diagrama de bloques de interrupciones externas

Proceso de trabajo:

1. La señal de entrada del pin GPio externo pasa a través del circuito de detección de bordes, y cuando se detecta un borde específico, emite la señal 1.

2. El software establece si se debe generar una interrupción de evento (interrupción de hardware) cuando la línea pasa a través de la puerta OR .

             Función de registro de eventos de interrupción de software (EXTI_SWIER): cada bit controla 1 línea de interrupción externa, este registro es válido escribiendo "1" y escribiendo "0" no es válido. Genere manualmente una solicitud de evento / interrupción externa

Nota: Este registro no se puede borrar directamente (el bit correspondiente del registro no se puede borrar directamente), solo se puede borrar a través del bit correspondiente del "registro de suspensión registro de suspensión (EXTI_PR) " para borrar el bit correspondiente del registro.

3. Si necesita generar una interrupción de evento, debe escribir "1" en el bit correspondiente en el registro de máscara de evento (EXTI_EMR) , y en este momento se emitirá una señal de pulso.

4. Escriba "1" en el bit correspondiente del registro de máscara de interrupción (EXTI_IMR) para habilitar la habilitación de interrupciones de la línea de interrupción correspondiente y escriba "0" para desactivar la interrupción.

5. Cuando el circuito de detección de borde detecta la señal de borde esperada, el hardware establecerá automáticamente el bit correspondiente del registro de suspensión para generar una bandera para solicitar una interrupción.

Nota: Este registro solo puede borrar el bit de bandera correspondiente escribiendo "1" en el bit correspondiente (escriba 1 para borrar), o cambiando la condición de detección de borde de la línea de interrupción para borrar el bit de bandera.

Resumen: Después de analizar el diagrama de bloques, se pueden generar interrupciones de software e interrupciones de eventos El propósito de las interrupciones de software es ingresar a la función de servicio de interrupciones. La interrupción de eventos es generar una señal de pulso a los periféricos en el chip, que pertenece al nivel de hardware.

3. Correspondencia portuaria

La interrupción externa 0 ~ 15 se asigna a cualquier grupo de puertos GPIO con el mismo nombre (interrupción externa 0, asignada al puerto GPIO con el número de puerto 0), y una entrada de interrupción externa solo se puede asignar a un puerto GPIO

4. Ideas de programación

  1. Definir la estructura NVIC y EXIT
  2.  Encienda el reloj multiplexado ---- RCC_APB2PeriphClockCmd

SALIDA

  1. Configure la línea de interrupción externa correspondiente al puerto GPIO. GPIO_EXTILineConfig (GPIO_PortSourceGPIOA, GPIO_PinSource0)
  2. Seleccione la línea de interrupción externa correspondiente a GPIO. 0-15 
  3. Seleccionar interrupción externa o interrupción de evento
  4. Seleccionar disparador de flanco ascendente o de flanco descendente
  5. Habilitar línea de interrupción
  6. Inicializar la estructura de interrupción externa

NVIC

  1. Configurar la fuente de interrupción NVIC
  2. Establecer prioridad de preferencia y prioridad de respuesta
  3. Habilitación de canal de interrupción
  4. Inicializar la estructura de interrupciones

EXTI1_IRQHandler EXTI9_5_IRQHandler EXTI15_10_IRQHandler

  1. Función de servicio de interrupción de escritura

5. Código

void KEY_Exit_Init(void)
{
	NVIC_InitTypeDef  NVIC_InitStructure;
	EXTI_InitTypeDef  EXTI_InitStructure;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
	
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource3);
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource4);
	
	EXTI_InitStructure.EXTI_Line = EXTI_Line3;
	EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;  //软件中断
	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;//下降沿触发---key默认高电平
	EXTI_InitStructure.EXTI_LineCmd = ENABLE;
	EXTI_Init(&EXTI_InitStructure);
	
	EXTI_InitStructure.EXTI_Line = EXTI_Line4;
	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 = EXTI3_IRQn; //key2
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 4;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStructure);
	
	NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn;//key1
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStructure);
	
}

void EXTI3_IRQHandler(void)
{
	if(EXTI_GetITStatus(EXTI_Line3) == SET) //挂起寄存器
	{
		EXTI_ClearITPendingBit(EXTI_Line3);//
		//
		
	}
}

 

 

Supongo que te gusta

Origin blog.csdn.net/qq_45604814/article/details/114017832
Recomendado
Clasificación