Envío Gratis en compras mínimas de $1200 mxn Enviamos a toda la Republica Mexicana
Buscar

6. Interrupciones Externas

Buenvenidos al tutorial numero 6 de Ophyra, donde utilizaremos una de las muchas interrupciones que tiene este microcontrolador, las Interrupciones Externas.

Proyecto a realizar: Utilizar un push button para que cambie el estado del LED RGB cuando se detecte un cambio de alto a bajo por ese pin.

 

Configurando el hardware

Una vez ya creado nuestro proyecto (véase el tutorial preliminar de Crear un Proyecto para Ophyra), el siguiente paso es activar los recursos a utilizar.

Paso 1. Para nuestro botón, utilizaremos el SW0, que está ubicado en el pin PC2. Sin embargo, en lugar de activarlo como GPIO_Input, lo activaremos como GPIO_EXTl2.

Imagen 1. Pin PC2 como GPIO_EXTI2

 

Paso 2. Activamos el LED Azul de nuestro LED RGB. El pin que le corresponde es el PE2 y lo activamos como GPIO_Output. También le cambiamos la etiqueta a “Led Azul” para poderlo identificar más facilmente en nuestro código.

Imagen 2. Activamos el LED Azul como salida.

 

Paso 3. Pasamos a la configuración de nuestros GPIO. Para ello, en las categorías de la izquierda, entramos a System Core → GPIO.

Para el caso de nuestro LED, lo configuraremos igual a como se ha configurado desde el tutorial 1. Puertos GPIO.

Imagen 3. Configuración del pin PE2

Para el caso de nuestro push button en PC2, podemos ver que tenemos un parámetro con opciones diferentes a que cuando lo teníamos configurado como entrada. Ahora, en el GPIO_mode, podemos seleccionar la forma en que deseamos que el microcontrolador entrará a las interrupciones como flaco de subida, flanco de bajada o ambos. La difernecia entre una interrupción externa y una interrupción por evento es básicamente que el evento puede ser generado por una bandera sobre algún otro recurso, mientras que la interrupción externa es detectada por el GPIO seleccionado. Para este tutorial, seleccionaremos la opción External Interrupt Mode with Falling edge trigger detection, ya que nuestro push button está conectado en forma Pull-up, es decir, el estado en el que se encuentra normalmente es Alto y al presionarlo pasa a Bajo y es precisamente ese cambio de Alto a Bajo lo que deseamos detectar.

Imagen 4. Configuración del pin PC2.

 

 

Paso 4. Algunos de los microcontroladores ARM cuentan con un bloque llamado NVIC que se encarga de administrar las interrupciones. Para poder ver la lista completa de interrupciones, entramos en la categoría System Core → NVIC en el lado izquierdo de la interfaz. Dentro de esta ventana tenemos opciones ya habilitadas por el software que además no pueden ser modificados debido a que es configuración propia del microcontrolador.

Imagen 5. Menú de configuración del NVIC.

 

Las interrupciones que nosotros podríamos modificar y activar son:

  • PVD interrupt through EXTl line 16: Interrupciones a través de la línea 16.
  • Flash global interrupt: Interrupciones por acceso en la escritura a la memoria Flash.
  • RCC global interrupt: Interrupciones por cristal externo.
  • EXTl line2 interrupt: Interrupciones de la línea 2.
  • FPU global interrupt: Interrupciones del microcontrolador.

Las interrupciones ocasionadas por la línea 2 han sido agregadas a la lista automáticamente por el software ya que durante la activación del pin PC2 lo seleccionamos como EXTl2. De no seleccionarse el modo EXTl para cualquier GPIO, este tipo de opciones en la NVIC no se mostrarán.


Nota

Es importante tener en cuenta que a pesar de que Ophyra cuenta con sus pines de expansión CN1 y CN2, no es posible conectar dos pines a la misma línea para generar interrupciones, es decir, si se han activado las interrupciones de la línea dos con el GPIO PC2, ya no es posible utilizar ningún otro pin de la línea 2 para interrupciones externas, tales como los GPIO A2, B2, E2, etc.


 

Ya que queremos activar las interrupciones de nuestro push button, habilitaremos la opción EXTl line2 interrupt.

Imagen 6. Activación de la interrupción externa.

 

Al final de este menú tenemos las opciones para poder poner la prioridad a dichas interrupciones (ver Imagen 6). Esto se hace cuando tenemos múltiples datos a enviar y recibir y se requiere que un dato sea procesado primero. Por el momento, únicamente se activarán las interrupciones sin modificar prioridades.

 

Paso 5. Ahora es momento de generar nuestro código.


ADVERTENCIA

Si durante la creación de tu proyecto no llegaste a configurar el reloj de la tarjeta o a configurar los detalles del proyecto respecto a la generación del código, aún estás a tiempo.

Para sabér cómo hacer esas configuraciones, dirígase al tutorial preliminar de Crear un Proyecto para Ophyra y siga los pasos en Anexo 1: Configurar el reloj de la OphyraAnexo 2: Configurar los detalles el proyecto.


 

Para generar el código, basta con hacer clic en el botón de Guardar que se encuentra en la barra de herramientas en la parte superior. La interfaz cambiará y comenzará a cargar el código, así como se muestra en la siguiente imagen.

Imagen 7. Generando código.

 

Realizando el Programa

Ya que la función MX_GPIO_Init(); que tenemos en los inicios de nuestro código ya se encarga de inicializar los GPIO que hemos seleccionado previamente, no tenemos que hacer ninguna inicialización más para trabajar con ellos, por lo que nos permite entrar directamente a la función de interrupciones para tomar una acción al ser llamada dicha función.

Entramos al archivo stm32f4xx_it.c que se encuentra dentro de las carpetas Core → Src de nuestro proyecto. Casi hasta abajo en el código, podremos encontrar la sección que se encarga de manejar nuestra interrupción de la línea 2.

/******************************************************************************/
/* STM32F4xx Peripheral Interrupt Handlers                                    */
/* Add here the Interrupt Handlers for the used peripherals.                  */
/* For the available peripheral interrupt handler names,                      */
/* please refer to the startup file (startup_stm32f4xx.s).                    */
/******************************************************************************/

/**
  * @brief This function handles EXTI line2 interrupt.
  */
void EXTI2_IRQHandler(void)
{
  /* USER CODE BEGIN EXTI2_IRQn 0 */

  /* USER CODE END EXTI2_IRQn 0 */
  HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_2);
  /* USER CODE BEGIN EXTI2_IRQn 1 */

  /* USER CODE END EXTI2_IRQn 1 */
}

 

Cada que presionemos el pulsador SW0 que se encuentra en el pin PC2, el microcontrolador entrará a este método. Es aquí entonces donde colocaremos el cambio de nuestro LED Azul del LED RGB.

void EXTI2_IRQHandler(void)
{
  /* USER CODE BEGIN EXTI2_IRQn 0 */

  /* USER CODE END EXTI2_IRQn 0 */
  HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_2);
  /* USER CODE BEGIN EXTI2_IRQn 1 */
  HAL_GPIO_TogglePin(Led_Azul_GPIO_Port, Led_Azul_Pin);
  /* USER CODE END EXTI2_IRQn 1 */
}

 

Paso final – Cargar el programa a la Ophyra

Ahora, falta programar nuestro código a la tarjeta Ophyra. Las instrucciones se encuentran en el tutorial del Paso final – Cargar el programa a la Ophyra.

 

Resultados

Podemos observar en el siguiente GIF que cada que se presiona el botón cambia el estado del LED Azul de nuestro LED RGB. Sin importar que dejáramos presionado el botón, lo único que acciona el cambio de estado del LED es el momento de presionar el botón.

 

Conclusiones

Hemos configurado y programado en Ophyra el control de un GPIO en modo de interrupciones externas. Ahora puedes seguir con proyectos como la activación y desactivación de un motor por medio de la pulsación del botón.

Para seguir aprendiendo más sobre los recursos básicos de la Ophyra, te recomendamos seguir con el siguiente tutorial: 7. Comunicación RS232.