Programación

Manual primer proyecto STM32. Parte 4: Programar un microcontrolador STM32


Resultado final

En esta última parte vamos a grabar el programa Hola mundo para STM32 que vimos en la anterior parte en el microcontrolador.

Compilar "Hola Mundo"

Lo primero que tenemos que hacer es compilar el código pulsando el botón de Build All y asegurarnos que todo ha ido correcto, deberemos de ver el mensaje de Build Finished. 0 errors. Es posible que la primera vez que compilemos nos muestre unos warning de funciones que hemos definido pero que no hemos utilizado. No pasa nada, es completamente normal.

Uso de ST-LINK

Antes de seguir con la configuración voy a hacer un pequeño inciso y explicar el uso de los programadores ST-LINK v2. Como hemos visto en la primera parte de este tutorial, en la sección de SWD en STM32, vimos que tan sólo necesitaremos 4 pines, incluyendo alimentación, para programar un microcontrolador STM32 mediante SWD. Los dos programadores que utilizamos, tanto el ST-LINK v2 de la placa stm32f0discovery como el clon de ST-LINK v2, se conectan al ordenador mediante USB y son reconocidos automáticamente, en el caso que se muestra además, es el clon que se ha detectado perfectamente como un ST-LINK v2 original. En el clon los pines a utilizar son los que se muestra en la foto y no requiere de mayor configuración salvo actualizar el firmware como veremos más adelante. Para usar el ST-LINK de la placa stm32f0discovery sí que necesitamos de unas pequeñas modificaciones.

Manual primer proyecto STM32. Parte 3: Programación

Código Base Código base recién creado

En éste paso, ya tendríamos que tener el código generado como hemos visto en IDE para STM32. El código se genera por defecto en src y Drivers de nuestro proyecto. Nuestro fichero principal es main.c que está dentro de src. Abrirlo y cambiar la perspectiva a C/C++. Veremos que en la nueva perspectiva, la interfaz ofrece un montón de ayudas y marcadores de texto que nos hará el trabajo mucho más productivo y fácil.

Antes de nada, nos tenemos que fijar en que CubeIDE nos genera a lo largo de todas las secciones, ficheros y librerías un montón de secciones encajadas entre títulos /* USER CODE BEGIN 0 */ y /* USER CODE END 0 */. Es en dichas secciones, y sólo en dichas secciones, donde programaremos. Si programamos fuera de dichas sencciones, CubeIDE no respetará nuestro código y lo borrará la próxima vez que regeneremos el código base, por ejemplo tras añadir una nueva interfaz o configurar nuevos pines. A veces, CubeIDE nos genera varias secciones seguidas de USER CODE en la misma sección y a la misma altura, es indiferente en cuál programemos, es sólo para nuestro orden. Se aconseja no borrar o modificar secciones de USER CODE independientemente de que no programemos en ellas.

Lo primero que siempre hago en todos mis programas es una serie de definiciones y añadir unas pequeñas funciones básicas que me ayudarán mucho a la hora de hacer los primeros programas y pruebas.

Manual primer proyecto STM32. Parte 2: Software

IDE STM32

En esta segunda parte, veremos el software que usaremos para un primer proyecto con microcontroladores STM32. En este punto, suponemos que ya tenemos una placa comprada o la hemos diseñado según hemos visto en diseño de un circuito electrónico con STM32.

Como comenté en la entrada Software para programar STM32, en diciembre del 2017 ST compró el IDE de programación Atollic TrueStudio que estaba basado en Eclipse y lo hizo gratuito para todos los usuarios. Ya desde ese primer momento, toda la comunidad sospechaba que ST volvería a hacer otro movimiento en su ecosistema de programación. Y así ha sido, el 2 de mayo de 2019 no habiendo pasado ni año y medio desde la compra de Atollic, ST anuncia la descontinuación del IDE de Atollic y la creación de un nuevo programa, el STM32CubeIDE. Dicho softare es la unificación de su ecosistema de programación donde se integra CubeMX, que es un generador de código base, con Atollic. A día de hoy, usar CubeIDE es como usar CubeMX y Atollic por separado pero bajo una misma interfaz. Aún así CubeIDE aún está bastante verde, pero como va a ser el camino a seguir y todo lo que se muestre es copia exacta de lo que se haría en CubeMX y Atollic, voy a hacer la documentación basándome en CubeIDE.

¿Qué es un IDE de programación?

Un IDE de programación no es más que un entorno de programación donde se ha unificado un editor de código, un compilador y un depurador (debug) todo ello bajo una misma interfaz gráfica.

"Magic Smoke" en LibreServo ¡Otra vez!

Estaba muy contento con el blanco del led Asmb-mtb0-0A3a2 y empecé a configurar el puerto serie.

El puerto serie debido a la altísima velocidad que puede alcanzar (9Mbps) hay que configurarlo mediante DMA, en otras palabras, que el envío y recepción de datos se haga en background sin usar ciclos de reloj de nuestro microcontrolador. El envío es fácil, pero la recepción requiere que se sepa de antemano el número de bytes a recibir... lo cual no sabemos. Habrá que darle alguna vuelta a la programación, pero tengo alguna idea.

Sea como fuere, primero empecé a configurar el puerto serie de transmisión, TX. Y tras unas pruebas... fumata blanca.

TX de LibreServo v1.c funcionando
TX de LibreServo v1.c funcionando

Control led RGB usando TIM17

Una de las primeras versiones que hice de LibreServo, sólo en esquemas y mirando posibles configuraciones con CubeMX, el led RGB se hubiera controlado mediante el timer 2, TIM2, directamente con sus salidas PWM. Es la forma más sencilla y directa de hacerlo. Pero más adelante y por petición de varias personas, decidí añadir cierta compatibilidad con un posible futuro encóder magnético. Eso me forzaba a reservar TIM2 para una posible lectura del encóder y por tanto dejaba al led RGB sin la salida directa de TIM2. Finalmente lo tuve que instalar en salidas digitales "normales" y dejar recaer en un futuro software el control del led RGB con un sólo timer, en éste caso, el timer 17.

La idea de este programa es además de configurar y usar el timer 17, controlar el led RGB mediante interrupciones del timer 17. Es un sencillo programa que nos obligará a utilizar y configurar más características de nuestro LibreServo de cara a futuras características.

Control led RGB mediante interrupciones con el TIM17

Hola mundo con LED

Siguiendo lo dicho en software para programar LibreServo he utilizado CubeMX para toda la configuración inicial con el que he generado el proyecto base para TrueStudio.

El primer ejemplo a realizar es el más básico, un led parpadeando. En nuestro caso, LibreServo usa el led RGB Asmb-mtb0-0A3a2, así que haremos que cambie de color alternativamente. Es un ejemplo básico pero esencial para poder seguir avanzando.

El código que enseñe intentaré siempre poner las zonas donde se programan, delimitadas por entradas que pone CubeMX para luego respetar nuestro código a la hora de realizar una actualización de las librerías. Para realizar la espera, usaremos el propio Systick.

Hola mundo con led RGB básico

Software para programar STM32

Recuerdo como si fuera ayer que cuando empecé a programar para microcontroladores ARM (casi siempre de ST), el tortazo que me pequé fue como poco curioso y eso que tenía un buen trasfondo de conocimientos en AVR. No fue hasta que me aconsejaron CooCox hasta que empecé a avanzar. Aún así, la configuración de los periféricos del microncontrolador, o incluso, ser capaz de arrancar el microcontrolador y simplemente hacer parpadear un led era ya todo un logro. No debería de ser el único "torpe", porque ST decidió sacar en Febrero del 2014 la herramienta CubeMX. En su lanzamiento tenía más bugs que funcionalidades y como yo ya me manejaba perfectamente con ARM lo instalé y lo dejé olvidado en un rincón de mi disco duro.

Configuración de LibreServo en CubeMX
Configuración de LibreServo en STM32CubeMX