Software para programar 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.
Instalación de nuestro IDE, CubeIDE
Como he mencionado, vamos a usar CubeIDE como nuestro IDE para STM32 ya que es el IDE que el propio fabricante nos da de manera gratuita con todas las herramientas necesarias. Existen bastantes alternativas para programar STM32, tanto gratuitas como de pago, pero personalmente recomiendo usar CubeIDE a nuevos usuarios, pero si ya estabas usando CubeMX y Atollic no recomiendo aún hacer el cambio a CubeIDE, al menos a Julio del 2019 que está en la versión 1.0.1 (durante la creación del artículo, ST liberó la versión 1.0.2). CubeIDE está disponible para Windows, Mac y Linux.
CubeIDE se puede descargar desde la propia web de CubeIDE de ST. Tan sólo nos pide registrarnos para poder descargar el programa.
La primera en la frente
Ya he comentado muchas veces que la calidad de ST en sus programas es bastante escaso. Si al instalar nos da un error de NSIS, es porque el instalador lo tenemos en algún directorio con acentos o algún carácter latino. Sí, en pleno 2019 y aún seguimos con semejantes errores de falta de calidad 😒. Copiar el instalador directamente en C:\ y ya podríamos instalarlo con normalidad.
Una vez instalado, te ofrece la posibilidad de importar tus proyectos de Atollic a CubeIDE, bajo ningún concepto lo hagas, y si lo vas a hacer, asegúrate de tener antes un backup hecho de todo. En vez de importar, te aconsejo crear un proyecto nuevo desde cero como veremos y luego ya copiar las partes de código personal. Serán sólo 10 minutos y te evitará muchos sustos y perder todo tu código. Avisado quedas.
Creación de nuestro primer proyecto en CubeIDE
Para poder seguir los pasos a realizar, he creado varias galerías de fotos que iré siguiendo.
Seleccionar el microcontrolador
Creación de un nuevo proyecto
Una vez instalado CubeIDE ya podemos crear nuestro primer proyecto. Es necesario que estemos conectados a Internet ya que CubeIDE descargará en próximos pasos paquetes de software. Para crear un nuevo proyecto en CubeIDE, ir a File→New→STM32 Project. Lo primero que hará CubeIDE será descargarse una lista actualizada de todos los microcontroladores de ST.
En la siguiente pantalla tendremos un buscador en el que podremos seleccionar nuestro microcontrolador en función de diferentes parámetros, desde el tamaño de la Flash, de la RAM, frecuencia de funcionamiento, encapsulado... En nuestro caso ya teníamos elegido el microntrolador a utilizar, así que buscamos directamente por STM32F302K8 y lo seleccionamos.
Introducimos el nombre de nuestro proyecto, en nuestro caso TestLed y dejamos el resto de opciones por defecto. Para finalizar, nos muestra un mensaje sobre el cambio de perspectiva. Pinchar en Aceptar. Una perpectiva lo que hace es abrir y cerrar columnas y "cagetines" en la interfaz para poder trabajar correctamente en lo que estemos haciendo. En CubeIDE usaremos tres perspectivas:
- la de CubeMX para la configuración hardware
- La de C/C++ para cuando estemos programando
- La de Debug, para cuando programemos/grabemos nuestro microcontrolador y queramos depurar el código en nuestro microcontrolador, que con nuestro ST-Link es algo sencillo, extraordinariamente útil y muy potente. Hablaremos de ello más adelante
Configurar pines
Configuración Interfaces/Pines CubeIDE
Tras la creación del proyecto, deberíamos de estar en la perspectiva de CubeMX y listos para empezar a configurar el hardware. En Pinout & Configuration configuraremos los pines de nuestro microcontrolador. En nuestro ejemplo, primero configuraremos qué reloj usamos. En System Core→RCC si hemos usado un oscilador externo seleccionaremos BYPASS Clock Source, si hemos usado un cristal externo entonces seleccionaremos Crystal/Ceramic Resonator. Después, configuraremos el método con el que vamos a programar el microcontrolador. En System Core→SYS seleccionaremos Serial Wire como método de programación y depuración.
Por último, deberemos de configurar el resto de pines que vayamos a usar; de entrada, de salida, puertos serie, PWM... En nuestro ejemplo, tan sólo usaremos tres pines digitales para controlar de manera sencilla un LED RGB. Pinchando con el botón derecho de nuestro ratón directamente sobre el pin que tenemos el LED, seleccionamos GPIO_Output. En la foto se puede apreciar la cantidad de posibilidades que tenemos sólo para ese pin; entrada analógica, puerto serie, salida de diferentes Timers (PWM), interrupción externa, entrada o salida digital... Con esto, ya tendríamos la configuración de los pines hecha.
Configurar el reloj
Configuración de la señal de reloj en STM32
Una de las cosas que puede ser más engorrosas es la configuración de la señal de reloj. Como hemos comentado, usaremos un oscilador externo a 8MHz, pero esa señal hay que "multiplicarla" para llegar a 72MHz, que es la frecuencia máxima de funcionamiento de nuestro microcontrolador. Por otro lado, dicha señal tiene que propagarse a distintas frecuencias a las diferentes interfaces, pines, puertos serie, timers... Por suerte, con CubeMX eso "se solucionó" y en un "mapa" bastante autoexplicativo vamos configurando todo lo referente a la señal de reloj. En la imagen están marcados los parámetros configurados para que nuestro microcontrolador funcione con la señal de reloj de nuestro oscilador externo. Cada vez que habilitemos alguna nueva interfaz desde la configuración de pines, deberemos revisar que la señal de reloj a dicha nueva interfaz sea la adecuada.
Generar el código base
Últimas opciones y generar el código base
En Project Manager configuraremos diferentes opciones a la hora de cómo nos generará el código base. En Project Manager, en Project seleccionamos para qué IDE vamos a generar nuestro código base. En CubeIDE ésta opción está en gris y no se puede cambiar, pero si estamos usando por CubeMX con Atollic, entonces tendremos que seleccionar TrueStudio como opción.
En Code Generator nos cercioraremos que tengamos la opción Keep User Code when re-generating seleccionada. Es la opción que nos permitirá programar sobre los ficheros que nos genere CubeMX y si hacemos algún cambio hardware y re-generemos el código base, respete nuestro código. Además seleccionaremos la opción Add necesary library files as reference... para que nos añada las librerías necesarias a nuestro proyecto.
En Advance Settings veremos qué drivers/librerías va a añadirnos a nuestro proyecto, a parte de las mínimas e imprescindibles de núcleo de nuestro microcontrolador STM32F3xxx. En la imagen vemos que nos añadirá GPIO, para el manejo/configuración de los pines del LED, y RCC para la configuración del reloj.
ST nos "ofrece" dos tipos de librerías; HAL, Hardware Abstraction Layer, y LL, Low Layer Library. Las librerías HAL son librerías que añaden una capa extra de abstracción para que en teoría podamos cambiar de microcontrolador y no tengamos que modificar nuestro código, sólo regenerar el código base, además de darnos librerías para uso de protocolos, como podría ser el USB, que requieran de un alto uso de software para su funcionamiento. Suelen ser librerías más pesadas y algo más lentas. Personalmente me gustan librerías ligeras en las que además es más fácil y directo ver qué realizan, qué registros modifican por ejemplo, sin tener todo el código abstraído. Por eso, yo siempre cambio las librerías a LL como mejor opción. Pero como para gustos los colores, dejo un "pequeño" documento, Description of STM32F4 HAL and LL drivers, donde se explican en detenimientos estas librerías.
Una vez configurado todo lo referente a la creación de código, ya podemos generar nuestro código de configuración base. Arriba a la derecha, está el icono de Device Configuration Tool Code Generation. Pinchar en él y automáticament os generará el código base de tu microcontrolador. La primera vez que le demos, para poder generar el código CubeIDE se deberá de bajar el Firmware del microcontrolador de manera automática, con lo que deberemos de estar conectados a Internet. Todo debería de ser transparente y sencillo para el usuario, pero de nuevo, maravillas de ST, es posible que tengamos un mensaje con el siguiente mensaje de error Code generation could not be done because the necessary firmware package is missing... . Para solucionarlo, tan sólo tenemos que cerrar nuestro proyecto después de guardar los último cambios, e ir a Window→Preferences, y dentro de las preferencias STM32Cube→Firmware Updater. Pulsar en Check Connection para comprobar que tienes acceso a Internet y a Apply and Close. Ahora sí, ya podríamos abrir nuestro proyecto y generar el código. Nuestro fichero principal será main.c en la carpeta Src de nuestro proyecto.
En la tercera parte, ya veremos cómo programar Hola Mundo en STM32