Tutorial 1. Puertos GPIO en Microcontroladores de la serie STM32F4.

Bienvenidos, el objetivo de este primer tutorial será mostrar como se configuran los pines de entradas y salidas de la tarjeta de desarrollo Ophyra, por lo que realizaremos un pequeño ejemplo utilizando los recursos propios de Ophyra para mostrarles como se configuran. Nuestro ejemplo consistirá en lo siguiente: al presionar un botón, el color azul en el LED RGB de Ophyra se encenderá por un segundo.

Configurar Hardware usando STM32CubeMX

Lo primero que crearemos será nuestro proyecto en STM32CubeMX, por lo tanto nos dirigimos al icono del software en nuestro escritorio y damos doble click para abrirlo. Una vez abierto, seleccionamos “New Project”

Imagen1. Nuevo Proyecto en STM32CubeMX

Posteriormente se elige el Micontrolador que usaremos. Ophyra cuenta con un Microcontrolador ARM de la familia STM32F407, por lo que en el STM32CubeMX seleccionamos el marcado en la imagen 2, y posteriormente pulsamos “OK” y como se puede apreciar, nos muestra el integrado de nuestro ARM con sus respectivos pines en la pestaña llamada “Pinout”, así que lo primero que debemos hacer ahora será configurar los pines que vamos a utilizar dentro de esta misma pestaña.

Imagen 2. Elección del microcontrolador en Ophyra

Como ya mencionamos al principio, en este tutorial se usarán los recursos con los que cuenta Ophyra, es decir, usaremos el LED RGB y uno de los 4 Push Button, así que para conocer que pines corresponden a estos nos dirigimos a las especificaciones de Ophyra (ver Imagen 3 e Imagen 4), en donde es posible visualizar a que pin corresponde el LED RGB y cada botón.

Imagen 3. Puertos en LED RGB

Imagen 4. Puertos de Push Button

En este tutorial vamos a hacer uso del boton SW0 y del color azul del LED RGB, por lo que los pines que tendremos que configurar serán:

  • SW0 → PC2
  • LED AZUL → PE2

Una vez que se conocen los pines correspondientes se procede a configurarlos en el software STM32CubeMX:

Primero buscamos el pin correspondiente al PC2, hacemos clic sobre este y seleccionamos la opción “GPIO_Input” (Imagen 5) debido a que este pin es el correspondiente a nuestro botón, siendo éste una entrada. Posteriormente , para poder ubicarlo con facilidad, le colocamos la etiqueta “Boton_SW0”, dando clic derecho sobre el pin y seleccionando “Enter User Label” (Imagen 6), a continuación se desplegará el espacio donde se escribe el nombre “Boton_SW0” (Imagen 7) y damos clic en “Enter” y se habrá colocado el nombre en nuestro pin, tal como se muestra en la Imagen 8.

Imagen 5. Configuración de puerto PC2 para SW0

Imagen 6. Etiquetar puerto PC2

Imagen 7. Introduce etiqueta

Imagen 8. Puerto etiquetado y configurado como entrada

Ya que hemos seleccionado nuestro botón, pasamos a elegir nuestro pin digital de salida: el color azul del LED RGB integrado en la tarjeta Ophyra.

Buscamos el pin PE2, damos clic sobre éste y se elige la opción “GPIO_Output” (Imagen 9) y agregamos la etiqueta “Led_Azul”, tal como se realizó con la etiqueta para el botón, como se observa en la Imagen 10.

Imagen 9. Configuración del puerto correspondiente al LED azul

Imagen 10. Puerto etiquetado como Led_Azul

Una vez elegidos los pines correspondientes como entradas y salidas, pasamos a la pestaña de “Configuration” (Configuracion, ver Imagen 11) en donde se realizará la configuración adecuada para cada uno de los pines a utilizar, es decir podremos habilitar las resistencias Pull-up o Pull-down, podremos definir su estado inicial, entre otras cosas.

Imagen 11. Pestaña “Configuration”

Una vez en la pestaña de configuración, seleccionamos “GPIO” (Imagen 12), que se refiere precisamente a la configuración correspondiente a las entradas y salidas del microcontrolador:

Imagen 12. Recursos de Hardware en uso

Una vez seleccionado se desplegará la ventana correspondiente a la configuración de los pines, en donde configuraremos nuestros pines de la siguiente manera:

  • Para el PIN PC2, puerto correspondiente al Botón SW0 (ver Imagen 13):
    • En “GPIO mode” seleccionamos “Input mode”, debido a que el botón funcionará como entrada.
    • En “GPIO Pull-up/Pull-down” seleccionamos “Pull-up”, esto quiere decir que estaremos habilitando la resistencia Pull-up del microcontrolador (resistencias conectadas del pin a Vcc), debido a que los botones son conectados a GND cuando son presionados y cuando no están presionados, estos en realidad sólo se quedan en un estado flotante.
    • En cuanto al apartado de “User Label”, éste se genera automáticamente debido a que desde la pestaña de Pinout les agregamos las etiquetas a los pines.

Imagen 13. Configuración de puerto PC2

  • Para el PIN PE2, puerto correspondiente al LED Azul (ver Imagen 14):

    • En “GPIO output level” seleccionamos “HIGH”, debido a que cada color del LED RGB se encuentra conectado como ánodo común, por lo tanto en estado “HIGH” los estaríamos apagando  mientras que en  “LOW” los estariamos encendiendo. Por lo tanto, estamos configurando para que nuestro LED esté apagado hasta el momento que sea presionado el botón.
    • En “GPIO mode” seleccionamos “Output Open Drain”.
    • En “GPIO Pull-up/Pull-down” seleccionamos “No Pull-up and no pull-down”, debido a que no es necesario habilitar ninguna de estas resistencias del micocontrolador, pues el pin solo se usará como salida.
    • En cuanto al apartado de “User Label”, se genera automáticamente, debido a que desde la pestaña de Pinout les agregamos las etiquetas a los pines.

Imagen 14. Configuración de puerto PE2

Una vez configurados ambos pines, damos clic en “Apply” y posteriormente en “OK”.

Se prosigue a generar el código, yéndonos a Project -> Generate Code, donde se desplegará la ventana de la imagen 15:

Imagen 15. Configuración del proyecto

Dentro de la pestaña “Project”, configuraremos los siguientes campos:

  • “Project Name”, se coloca un nombre para el proyecto, que en nuestro caso será “Entradas_Salidas_Digitales”
  • Project Location”, en este campo debes asegurarte que se encuentre la dirección donde se ubica tu Workspace para Atollic TrueSTUDIO, en nuestro ejemplo el Wokspace se encuentra en C:\Users\Lupita\Atollic\TrueSTUDIO\ARM_workspace_7.1. Una vez seleccionada la ubicación, se llenará automáticamente la sección “Toolchain Folder Location”
  • Toolchain / IDE”, aquí debemos seleccionar el IDE que utilizaremos para programar. Nosotros usaremos el IDE gratuito Atollic TrueSTUDIO y por lo tanto seleccionamos TrueSTUDIO

Atollic permite 2 tipos de generación de drivers para cada recurso de Hardware:

  • Genera archivos .c y .h para cada recurso de Hardware
  • Crea las rutinas de dentro del archivo main.c

Para este tutorial, generaremos toda las configuraciones iniciales en el archivos main.c. En otros tutoriales, generaremos los archivos .c y .h para que puedas trabajar con ambas opciones y posteriormente cuando realices aplicaciones mas complicadas puedas decidir cual te acomoda mejor. Entonces, nos dirigimos a la pestaña “Code Generator” y la vamos a dejar tal como está, es decir sin seleccionar la opción de “Generate peripheral initialization as a pair of ‘.c/.h’ files per peripheral”

Finalmente damos clic en “OK” provocando que STM32CubeMX genere el código del proyecto. Al finalizar se mostrará la ventana de la Imagen 16, en la cual vamos a dar clic en“Open Project”.

SI NO TE DIERA LA OPCIÓN “OPEN PROJECT”, QUIERE DECIR QUE LA VERSIÓN DE STM32CUBEMX INSTALADA EN TU COMPTUADORA NO ESTÁ ACTUALIZADA.

Imagen 16. Proyecto generado

Realizar programa en Atollic TrueSTUDIO

Como podemos notar al haber seleccionado “Open Project”, automáticamente nuestro proyecto se importa y se abre en TrueSTUDIO, abriéndose nuestro archivo “main.c” automáticamente (Imagen 17):

Imagen 17. Ubicación de archivo main.c

Si has usado el IDE Eclipse, seguro te será muy familiar el IDE de Atollic: en la parte izquierda están los proyectos que ya hemos creado, mientras que en la parte derecha tendremos nuestro espacio de trabajo y en la inferior un área con diferentes ventanas de notificación, incluyendo consola, terminal, advertencias, etc.

Es conveniente que mientras estemos trabajando en un nuevo proyecto nos aseguremos que los demás se encuentran cerrados para que no llegue a suceder que estamos compilando un proyecto diferente al que queremos. Para hacer esto nos colocamos sobre el proyecto en el que estamos trabajando, hacemos clic derecho y elegimos la opción CLOSE UNRELATED PROJECTS.

Ahora podemos concentrarnos en nuestro entorno de trabajo, donde podemos visualizar lo siguiente: al principio, en comentarios, encontraremos una pequeña descripción acerca de información que nos proporciona Atollic sobre el uso de este software; en la linea 34 tenemos el inicio de los archivos cabecera con las bibliotecas para nuestro microcontrolador (Imagen 18):

Imagen 18. Bibliotecas y prototipos de función

A partir de la linea 48 encontramos las funciones declaradas automáticamente de acuerdo a las configuraciones realizadas anteriormente en el software STM32CubeMX, donde:

  • void SystemClock_Config(void) es una función que contiene las configuraciones respectivas del reloj con el que se trabajará.
  • void Error_Handler(void) es una función que se manda a llamar cuando surge algún error.
  • static void MX_GPIO_Init(void) es la función que contendrá las configuraciones realizadas anteriormente a los pines de entrada y salida de nuestro microcontrolador. Estas configuraciones aparecen como función debido a que no se seleccionó anteriormente en STM32CubeMX la opción de “Generate peripheral initialization as a pair of ‘.c/.h’ files per peripheral”

Posteriormente podemos encontrar en la línea 62 nuestra función principal, donde comenzaremos a generar nuestro código. Dentro de la función main podemos observar que se llaman a las funciones de inicialización (Imagen 19):

  • HAL_Init() esta función resetea e inicializa la interfaz Flash.
  • SystemClock_Config() inicia las configuraciones del reloj.
  • MX_GPIO_Init() configura los pines de entrada-salida.

Imagen 19. Configuración inicial

En la linea 85 encontramos un “While infinito”, que como sabemos todo lo que escribamos dentro será ejecutado todo el tiempo, ver imagen 20. El código correspondiente a nuestra aplicación será escrito dentro de este while infinito de la siguiente manera:

En la linea 90 definimos una variable entera llamada m, a la cual le vamos a asignar el valor del pin de entrada, es decir el valor de nuestro estado del botón, para lo cual haremos uso de la función:

HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)

la cual se encarga de leer el estado del pin indicado, devolviendo un 1 si se encuentra en “HIGH” o “SET” y devuelve un 0 si el estado del pin es “LOW” o “RESET”.

Dentro de los parámetros que se deben indicar se encuentra el puerto en el que se encuentra el pin de entrada ( GPIO_TypeDef* GPIOx) , y enseguida se escribe el pin configurado como entrada ( uint16_t GPIO_Pin), que en nuestro ejemplo es el pin llamado SW0_Pin, por lo tanto nuestra función quedaría de la siguiente manera:

HAL_GPIO_ReadPin(SW0_GPIO_Port, SW0_Pin);

Escribir nuestro código dentro del while infinito significa que todo el tiempo estará leyendo el estado del pin de entrada, por lo tanto agregaremos un if, el cual cuando el estado del botón sea “RESET” o bien cuando el botón sea pulsado el LED azul se encenderá por un segundo, para esto vamos a condicionar que si nuestra variable m es igual a 0, es decir el botón se encuentra pulsado, entonces nuestro pin de salida (Led_azul) se enciende, es decir nuestro pin de salida lo pondremos en un estado de “RESET”, por 1 segundo y posteriormente se apaga

Para poder colocar un estado a un pin de salida, se hará uso de la función:

HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)

con la cual es posible indicarle un estado “SET” o “RESET” a nuestros pines de salida digitales, es decir podemos indicarle un estado “ALTO” o “BAJO”, “ENCENDIDO” o “APAGADO”.

Los parámetros necesarios para el uso de esta función son:

  • GPIO_TypeDef* GPIOx, que se refiere al puerto donde se encuentra el pin declarado como salida
  • uint16_t GPIO_Pin, el número o nombre del pin declarado como salida digital
  • GPIO_PinState PinState, el estado que se requiere para ese pin

Por lo tanto para encender el pin definiremos nuestra función de la siguiente manera:

HAL_GPIO_WritePin(GPIOE, Azul_Pin, GPIO_PIN_RESET);

Para poder indicarle el tiempo que éste permanecerá encendido se usa la función: HAL_Delay(), la cual es un retardo en milisegundos, por lo tanto para que nuestro LED permanezca encendido por un segundo colocaremos nuestra función de retraso de la siguiente manera: HAL_Delay(1000)

y posteriormente apagaremos nuestro LED cambiando su estado, de la siguiente manera:

HAL_GPIO_WritePin(GPIOE, Azul_Pin, GPIO_PIN_SET);

La imagen 20 muestra el código completo.

Imagen 20. Código completo

Si seguimos bajando podremos encontrar que a partir de la linea 104 se encuentra la función que contiene la configuración del reloj, la cual termina hasta la linea 151 y a partir de la linea 160 encontraremos la configuración de nuestros pines de entrada y salida configurados anteriormente utilizando STM32CubeMX.

Imagen 21. Configuración en software de puertos

En la linea 196 podemos encontrar la función que se manda a llamar si hay algún error.

Sin embargo en estas funciones no se realizará ningún cambio debido a que ya se han configurado anteriormente desde el software STM32CubeMX.

Finalmente nos dirigimos al icono del martillo, el cual se refiere a la opción “Build Debug for project Entradas_Salidas_Digitales”, y al no haber errores ni advertencias podemos proceder a cargar nuestro programa a nuestra tarjeta Ophyra.

Cargar programa a nuestra tarjeta de Desarrollo Ophyra

El último paso es programar tu tarjeta Ophyra. Si nunca lo has hecho, sigue esta GUÍA.

Conclusiones

Hemos configurado y programado los recursos básicos de Ophyra: LED y Boton. Además, al seguir el tutorial, te podrás dar cuenta de la estrategia de diseño en Ophyra:

  1. Crear la configuración inicial de los recursos usando STM32CubeMX
  2. Crear tu aplicación embebida en TrueSTUDIO
  3. Programar Ophyra
  4. Observar el resultado y regresar a paso 2 (o 1 en caso de ser necesario)

Te sugerimos hacer ejercicios con estos recursos para que adquieras experiencia explorando otras configuraciones y creando nuevas aplicaciones. Además, puedes revisar nuestra sección de prácticas, donde podrás encontrar algunos ejercicios y sus códigos.

Si tienes alguna consulta o duda sobre este tutorial o referente a cualquier otro tema de Ophyra, contactanos a nuestro Foro.

Menú