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.
Las interrupciones externas son aquellas asociadas a un cambio de estado del pin del microcontrolador.
Estas pueden ser de 16 diferentes fuentes y se configuran solamente desde un pin numerado. Por ejemplo, si se activa la interrupción en el pin PB0, no puede haber una interrupción en el pin PA0 o PC0.
Eventos del microcontrolador que atiende a través de funciones particulares: Transición de 1 a 0 → Flanco de Bajada Transición de 0 a 1 → Flanco de Subida
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
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
RCC → APB2ENR |= (1UL<<14);
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
}
}
}
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)