Son eventos programados que hacen que el programa en el microcontrolador se detenga momentáneamente y se ejecute otra fracción del código deseada. Existen diversos tipos de interrupciones como las Externas, usart, timer, adc, etc La interrupción se activará si está activa y sus banderas de limpian adecuadamente.

Interrupción Externa (EXTI)

Las interrupciones externas son aquellas asociadas a un cambio de estado del pin del microcontrolador.

Vectores de Interrupción externa

Para configurar un pin para una interrupción, se deben colocar los vectores que pertenecen a ciertos pines específicos:

EXTI0 → Activa los pines 0 de los puertos A,B,C EXTI1 → Activa los pines 1 de los puertos A,B,C EXTI2 → Activa los pines 2 de los puertos A,B,C EXTI3 → Activa los pines 3 de los puertos A,B,C EXTI4 → Activa los pines 4 de los puertos A,B,C EXTI9_5 → Activa los pines del 9 al 5 de los puertos A,B,C EXTI15_10 → Activa los pines del 15 al 10 de los puertos A,B,C

Registros Para configurar el puerto de Interrupción Externa

EXTI_IMR : Activa las interrupciones de la 0 a la 15, se coloca un ‘1’ en la interrupción deseada EXTI_RTSR: Activa la interrupción por flanco de subida, se coloca un ‘1’ en la interrupción deseada EXTI_FTSR: Activa la interrupción por flanco de bajada, se coloca un ‘1’ en la interrupción deseada EXTI_PR: Son las banderas de cada una de las interrupciones, deben ser limpiadas después de ser llamadas por el vector. SYSCFG_EXTICR[0]/[1]/[2]/[3] : Permite configurar el puerto de cada interrupción, codificado en orden alfabético:

Puerto A 0000
Puerto B 0001
Puerto C 0010

SYSCFG_EXTICR[0] → Para los pines del 3 al 0 SYSCFG_EXTICR[1] → Para los pines del 7 al 4 SYSCFG_EXTICR[2] → Para los pines del 11 al 8 SYSCFG_EXTICR[3] → Para los pines del 15 al 12

Reloj de las Interrupciones Externas

RCC → APB2ENR |= (1UL<<14);

Función de Interrupciones Externas

Para poder realizar la interrupción se debe configurar una función en donde se colocará el código que se ejecutará cada vez que la interrupción sea activada. Esta, debe estar dentro de la función extern “C”{}.

extern "C"{
	void EXTIx_IRQHandler(void){
		EXTI->PR | = OX... //Apaga las banderas
		//... Resto del código
	}
}

Si se usa una interrupción de vector compartido, se debe colocar un condicional para establecer el código a ejecutar.

extern "C"{
	void EXTIx_y_IRQHandler(void){
		if(EXTI->PR & EXTI_PR_PRn){
			EXTI->PR | = OX... //Apaga las banderas
			//... Resto del código
		}
	}
}

Ejemplo 1

Se requiere activar la interrupción por flanco de subida del pin PA4, para conmutar un LED ubicado en el Pin PA5 (LED de usuario)