Documentos de Académico
Documentos de Profesional
Documentos de Cultura
MANEJO DE INTERRUPCIONES
Una interrupción es un evento asíncrono que
provoca detener la ejecución del código actual
en base a una prioridad (cuanto más importante
es la interrupción, mayor será su prioridad, lo
que hará que una interrupción de menor
prioridad se suspenda).
• interrupciones de hardware
• interrupciones por el software (por
ejemplo, un acceso a una ubicación de
memoria no válida).
Px0 están conectados a EXTI0, todos los pines Px1, Px2, Px3 y Px4 están
conectados a EXTI1, EXTI2, EXTI3 y EXTI4 respectivamente, mientras que
los pines Px5, Px6, Px7, Px8, Px9 están asociados a la misma línea
EXTI9_5 de la misma manera los pines Px10, Px11, Px12, Px13, Px14,
Px15 están en la EXTI15_10
Esto significa que:
• Sólo un pin PxY puede ser fuente de interrupción. Por ejemplo, no podemos definir PA0 y PB0 como pines de
interrupción de entrada.
• Para las líneas EXTI que comparten el mismo IRQ dentro del controlador NVIC, tenemos que codificar el ISR
correspondiente para que debamos ser capaces de discriminar qué líneas generaron la interrupción. Por ejemplo, si
definimos PA10 y PA15, necesitamos leer los dos pines para identificar cual genero el evento de interrupción.
MANEJO DE INTERRUPCIONES
HABILITACION DE INTERRUPCIONES
Para habilitar y deshabilitar la interrupciones, la librería HAL
proporciona las siguientes funciones:
La imagen muestra un ejemplo de interrupciones de diferentes prioridades. La letra A representa un IRQ con una
prioridad baja (0x20) que se dispara en el tiempo t0. El ISR inicia la ejecución de A-ISR, pero el B-IRQ que tiene
una prioridad más alta (0x10), se dispara en el instante t1. Entonces la ejecución de A-ISR se detiene y comienza
la ejecución de B-ISR. Después en un tiempo t3 se dispara C-IRQ (prioridad 0x00), la ejecución de B-ISR se
detiene y se inicia la ejecución de C-ISR. Cuando la ejecución de C-ISR termina, se reanuda la ejecución de B-ISR
hasta que termina. Finalmente se reanuda la ejecución de A-ISR hasta el final. A este proceso de control de
interrupciones se le llama: “anidado”. El mecanismo inducido por prioridades de interrupción conduce al nombre
del controlador NVIC o Controlador de Interrupción Vectorial Anidado.
MANEJO DE INTERRUPCIONES
MANEJO DE INTERRUPCIONES
MANEJO DE INTERRUPCIONES
MANEJO DE INTERRUPCIONES
Cuando se llama a la función ISR EXTIx_IRQHandler(), se transfiere el
control a la función HAL_GPIO_EXTI_IRQHandler().
Esta función realiza todas las actividades relacionadas con la interrupción y
llama a la rutina HAL_GPIO_EXTI_Callback(), pasando como parámetro
el GPIO que generó el IRQ.
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if(GPIO_Pin == GPIO_PIN_4)
HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_11); //Toggle LED
else if(GPIO_Pin == GPIO_PIN_10)
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_11, RESET);
}
MANEJO DE INTERRUPCIONES
En caso de tener varios pines de interrupción en una ISR
combinada, CubeMX genera el código para diferenciar entre los
pines.
void EXTI4_IRQHandler(void)
{
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_4);
}
void EXTI15_10_IRQHandler(void)
{
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_10);
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_12);
}
CONFIGURACIÓN DE INTERRUPCIONES
EJEMPLO 1:
Escribir un programa en el cual un led se prenda o se apague
cada vez que se presione un pulsador configurado como fuente
de interrupción externa.
CONFIGURACIÓN DE INTERRUPCIONES
#include "main.h"
#include "stm32f1xx_hal.h"
EJEMPLO 1:
Configuración de los pines: Se usaran /* Private function prototypes--*/
los puertos C y B. El pin13 de puerto C void SystemClock_Config(void);
static void MX_GPIO_Init(void);
será configurado como entrada con
pull-up y habilitado como interrupción int main(void)
externa con detección de flanco de {
bajada. El pin 10 del puerto B será
configurado como salida para HAL_Init();
conectar el led. SystemClock_Config();
GPIO_Init();
HAL_NVIC_EnableIRQ(EXTI15_10_IRQn);
while (1);
}
CONFIGURACIÓN DE INTERRUPCIONES
static void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
EJEMPLO 1:
Configuración de los pines: Se usaran __HAL_RCC_GPIOC_CLK_ENABLE();
los puertos C y B. El pin13 de puerto C __HAL_RCC_GPIOB_CLK_ENABLE();
será configurado como entrada con
pull-up y habilitado como interrupción GPIO_InitStruct.Pin = GPIO_PIN_13;
externa con detección de flanco de GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
bajada. El pin 10 del puerto B será GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
configurado como salida para
conectar el led. GPIO_InitStruct.Pin = GPIO_PIN_10;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
EJEMPLO 2:
Escribir un programa en el cual dos leds conectados a dos
pines intercambian el parpadeo. Si se presiona un pulsador
conectado a otro pin configurado como interrupción externa
el parpadeo aumentara de velocidad. Si se vuelve a
presionar el pulsador el parpadeo volverá a su velocidad
inicial.
CONFIGURACIÓN DE INTERRUPCIONES
Configuración de los pines: Se usara #include "main.h"
el puerto C y B. El pin13 de puerto C #include "stm32f1xx_hal.h"
como entrada con pull-up habilitado
configurado como interrupción externa int valor=0;
con detección de flanco de bajada, y void SystemClock_Config(void);
los pines 13 y 14 del puerto B como static void MX_GPIO_Init(void);
salidas para conectar los leds. void EXTI15_10_IRQHandler(void);
CONFIGURACIÓN DE INTERRUPCIONES
Configuración de los pines: Se usara
int main(void)
el puerto C y B. El pin13 de puerto C
{
como entrada con pull-up habilitado
HAL_Init();
configurado como interrupción externa
con detección de flanco de bajada, y
SystemClock_Config();
los pines 13 y 14 del puerto B como
salidas para conectar los leds.
GPIO_Init();
HAL_NVIC_EnableIRQ(EXTI15_10_IRQn);
while (1)
CONFIGURACIÓN DE INTERRUPCIONES
while (1)
{
if(valor==1) {
Configuración de los pines: Se usara HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, GPIO_PIN_SET);
el puerto C y B. El pin13 de puerto C HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_RESET);
como entrada con pull-up habilitado HAL_Delay(100);
configurado como interrupción externa HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_SET);
con detección de flanco de bajada, y HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, GPIO_PIN_RESET);
los pines 13 y 14 del puerto B como HAL_Delay(100);
salidas para conectar los leds. }
else if (valor==0){
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_RESET);
HAL_Delay(500);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, GPIO_PIN_RESET);
HAL_Delay(500);
}
}
CONFIGURACIÓN DE INTERRUPCIONES
static void GPIO_Init(void)
{
Configuración de los pines: Se usara GPIO_InitTypeDef GPIO_InitStruct;
el puerto C y B. El pin13 de puerto C
como entrada con pull-up habilitado __HAL_RCC_GPIOC_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
configurado como interrupción externa
con detección de flanco de bajada, y HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14|GPIO_PIN_15, GPIO_PIN_RESET);
los pines 13 y 14 del puerto B como
salidas para conectar los leds. GPIO_InitStruct.Pin = GPIO_PIN_13;
GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_14|GPIO_PIN_15;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}
CONFIGURACIÓN DE INTERRUPCIONES
void EXTI15_10_IRQHandler(void)
Configuración de los pines: Se usara
{
el puerto C y B. El pin13 de puerto C
__HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_13);
como entrada con pull-up habilitado
if(valor==0) {
configurado como interrupción externa
valor=1;
con detección de flanco de bajada, y
}
los pines 13 y 14 del puerto B como
else if (valor==1){
salidas para conectar los leds.
valor=0;
}
}
CONFIGURACIÓN DE INTERRUPCIONES
void EXTI15_10_IRQHandler(void)
{
Configuración de los pines: Se usara HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_13);
el puerto C y B. El pin13 de puerto C }
como entrada con pull-up habilitado
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
configurado como interrupción externa
{
con detección de flanco de bajada, y
if(GPIO_Pin == GPIO_PIN_13)
los pines 13 y 14 del puerto B como
{
salidas para conectar los leds.
if(valor==0) {
valor=1;
}
else if (valor==1){
valor=0;
}
}
}