Programando la STM32 Blue Pill con el Cube Ide. Parte 2: Código y depuración

En la primera parte de este artículo vimos como descargar e instalar el Cube Ide, iniciar un proyecto y configurar el micro y sus periféricos con el Cube MX. En esta segunda y última parte nos ocuparemos del código que debemos escribir, veremos que son las librerías LL y HAL y como grabar el micro y probarlo.

Escribiendo código

Luego de realizar las configuraciones en el Cube MX y que se genere automáticamente el código correspondiente, el aspecto del IDE será como el de la siguiente imagen:

Fig.1. Perspectiva

Esto es lo que genéricamente se conoce como perspectiva y puede cambiar según la tarea que estemos realizando, como editar el código (C/C++ perspective), depurarlo (Debug perspective) o configurar los pines y bloques con el Cube MX. Dentro de la perspectiva tenemos varios elementos, como los menúes, barras de herramientas y vistas (views). En la Fig. 1. se destacan las siguientes vistas:

Project explorer: Muestra de manera jerárquica todos los archivos y elementos del proyecto. (ubicado a la izquierda)

Editor: Donde se escribe y modifica el código (al centro)

Outline: Muestra distintos elementos del archivo que está abierto en el editor. En este ejemplo podemos ver los prototipos y las funciones definidos dentro de main.c (derecha)

Console: Muestra el resultado de distintos procesos, como los errores del código cuando se lo compila (abajo)

Build Analyzer: Muestra el consumo de memoria de nuestro programa, tanto en Flash como en RAM (abajo)

En el Project explorer podemos ver que se han generado varios archivos, tanto de cabecera (.h) como de código (.c). Estos archivos contienen las definiciones que hicimos en el primer paso cuando configuramos las distintas partes del micro con el Cube MX y distintas librerías y código de inicialización.

Si observamos el código de main notaremos que hay muchas secciones separadas por comentarios. Estas secciones delimitan las partes que contienen código generado automáticamente y las separa de las secciones donde nosotros debemos incluir nuestro código, definición de variables, includes, etc. Debemos respetar estas secciones, ya que si escribimos en la parte del código automático y en algún momento volvemos a usar CubeMX para cambiar algo, añadir pines o un bloque como el conversor ADC, al generarse nuevo código, se sobrescribirá la sección correspondiente, borrando lo que nosotros habíamos escrito allí.

Fig. 2. Las flechas indican donde debemos escribir nuestro código

Como todo programa para un microcontrolador, luego de la parte de inicialización y definiciones, el programa se encierra en un loop o bucle sin final. Dentro de este loop incluiremos nuestro código, siempre respetando las secciones destinadas al usuario.

Las librerías HAL y LL

¿Cómo prendemos y apagamos el LED?

Para acceder al pin donde está conectado el LED podríamos consultar la hoja de datos del micro, ubicar los registros asociados y escribir el código correspondiente, manipulando los bits necesarios para que el led prenda y apague. Eso no es necesario, ya que ST ha escrito ese código en un conjunto de librerías denominadas LL (Low Level) que nos ahorran ese trabajo. Las librerías LL funcionan a bajo nivel y se encargan de resolver los detalles de los registros y bits de configuración.

Sin embargo, si desarrollamos un proyecto con la Blue Pill usando las librerías LL y luego queremos pasarlo a una placa o un micro mas potente, porque necesitamos mas recursos, es muy probable que ese código no funcione, porque la nueva placa tiene un hardware diferente y una librería LL también diferente-

Para evitar esto y ahorrarnos el tiempo que implica modificar un proyecto al cambiar de micro, ST también nos ofrece otro conjunto de librerías de mas alto nivel denominadas HAL (Hardware Abstraction Layer). Las librerías HAL proveen una interfaz homogénea para los distintos micros STM32, sin necesidad de que nosotros nos ocupemos de los detalles particulares, que pueden cambiar de un modelo a otro. Las HAL aseguran la portabilidad del código, permitiéndonos llevar un programa desarrollado para un micro a otro distinto, siempre dentro de la familia STM32.

En nuestro programa Blink utilizaremos dos funciones de las librerías HAL: HAL_GPIO_TogglePin y HAL_Delay. La primera cambia el valor del pin especificado y la segunda hace un retardo de tiempo en milisegundos.

La sintaxis de estas funciones es la siguiente:

HAL_GPIO_TogglePin (Port, Pin)

Port: Puerto GPIO al que pertenece el pin (de A hasta K)

Pin: Numero o identificador de pin a cambiar

HAL_Delay (tiempo)

tiempo: Retardo en milisegundos

Las agregamos al código generado automáticamente siempre respetando la zona reservada para el código del usuario:

Fig. 3. Código de Blink

Para compilar el programa hacemos click sobre el ícono del martillo, Build “Debug”

Fig. 4. Compilando el proyecto

Podemos ver los resultados de la compilación en la vista Console. Si no hay errores, terminará con el mensaje “Build Finished. 0 errors, 0 warnings“.

Fig. 5. Resultados de la compilación

Grabación y prueba

Lo único que queda es probar si el programa realmente funciona. Para ello debemos descargarlo al micro, para lo que usaremos un ST-Link “alternativo” en formato USB-dongle

Fig. 6. ST-Link original a la izquierda, versión alternativa a la derecha

Durante la instalación del Cube Ide también se instalan los drivers necesarios para que el ST-Link funcione, así que al conectarlo, debería ser reconocido por el sistema operativo. El ST-Link no genera un VCP (Virtual COM Port) y el driver lo controla de manera directa.

Para comprobar que el driver funcione correctamente (al menos en Windows) debemos conectarlo y acceder al Administrador de dispositivos:

Fig. 7. Driver del ST-Link en Windows

La conexión del ST-Link a la Blue Pill es muy sencilla, ya que son solo 4 pines los que se deben cablear: SWCLK, SWDIO, 3.3V y GND. Hay que prestar especial atención a la distribución de los pines, ya que puede cambiar de un ST-Link a otro.

Conexiones ST-Link

Revisar siempre el conexionado de los pines en la serigrafía impresa sobre el ST-Link, porque puede variar de uno a otro

Fig. 8. Conexiones del ST-Link

En la siguiente imagen puede verse el ST-Link cableado a la Blue Pill

Fig. 9. El ST-Link conectado

Para grabar nuestro programa en la Blue Pill y probarlo usaremos otro software incluido en el IDE, el debugger o depurador. Para hacerlo funcionar debemos hacer click en el botón Debug de la barra de herramientas:

Fig. 10. Botón DEBUG

Cuando lo hagamos, la consola nos mostrará el avance del proceso de conexión con el ST-Link y la transferencia del programa a la Blue Pill.

Fig. 11. Resultado de la grabación

Como se puede ver en la imagen de mas arriba, el ST-Link reconoce los 128 KB de la placa (que oficialmente tiene sólo 64 KB) y el tamaño del programa grabado es de 4708 bytes.

Al terminar la grabación, se carga el Debugger y cambia la perspectiva, viéndose algo parecido a la siguiente imagen:

Fig. 12. Perspectiva del Debugger

El programa esta detenido y la primer instrucción o función a ejecutar está marcada en verde.

Depurando el código

Sin la intención de analizar el debugger a fondo, veamos las acciones mas comunes que podemos emplear:

Fig. 13. Acciones mas comunes del debugger

Resume: Hacer correr el programa sin interrupciones.

Suspend: Detiene (pausa) la ejecución del programa.

Terminate: Finaliza la depuración y vuelve a la edición.

Step into: Ejecuta el código paso a paso, introduciendose en cada función.

Step over: Ejecuta el código paso a paso sin entrar en cada función.

Step return: Ejecuta el código de una función hasta salir de la misma.

Si hacemos click sobre Resume (o pulsamos F8) nuestro programa empezará a correr y veremos el led que parpadea.

Posición de los jumpers

Los jumpers incluidos en la Blue Pill indican desde donde arranca el micro luego de un RESET, lo cual es fundamental cuando grabamos la placa a través del puerto serie y no cuando usamos el ST-Link. Sin embargo, según mi experiencia, aunque el Cube Ide no muestre mensajes de error cualquiera sea la posición, hay inconvenientes si los dejamos a los dos en la posición marcada “1”. Si tu placa tiene los pines en esa posición, cambia uno o los dos a “0”, aprieta el pulsador RESET y graba en esa condición

Conclusión

En este artículo vimos paso a paso como crear un proyecto en la Blue Pill, desde la instalación del Cube Ide hasta la grabación y prueba del micro. Vimos como realizar la configuración inicial con el Cube MX, el código generado de manera automática, el uso de las librerías LL y HAL, la conexión del ST-Link y la grabación y depuración del programa.

Como pueden apreciar el procedimiento es mas complejo que cuando usamos el Arduino IDE, pero las posibilidades que tenemos a nuestra disposición son mas numerosas, podemos aprovechar mejor las capacidades de la Blue Pill y otros micros STM32, podemos depurar el programa en busca de errores y otras ventajas que hacen que el esfuerzo de aprender a utilizar esta herramienta valga la pena.

Como siempre, espero que este tutorial les haya sido de utilidad para seguir avanzando en el fascinante mundo de los microcontroladores ARM y los STM32 en particular. Cualquier duda o sugerencia pueden dejarla en la sección de comentarios.

Navegación de la serie<< Programando la STM32 Blue Pill con el Cube Ide. Parte 1: Instalación y configuración

9 comentarios en «Programando la STM32 Blue Pill con el Cube Ide. Parte 2: Código y depuración»

  1. Excelente trabajo profe! … pregunta, cuando usamos el programador ST-Link, tenemos que poner los jumpers de BOOT en alguna posicion especifica?

    Gracias!!!

    Responder
    • Hola Matías (Matías de la escuela?) Aunque en teoría no importa la posición de los jumpers, yo personalmente tuve problemas en una oportunidad que quedaron los dos en 1. Puntualmente no se producían interrupciones del Systick y no funcionaba HAL_Delay ()

      Responder
      • Si profe! genial su blog !!! lo felicito!!…. Mi pregunta surge por que quiero meter el STM32F103 en una placa propia y quiero dejar fijas algunas cosas (entre otras, quiero volar los jumpers y dejar los pines de boot conectados a un valor fijo). Muchas gracias!!

        Responder
        • Gracias Matias! Un abrazo! (una idea: puede que algún día necesites los jumpers si vas a hacer una actualización de firmware por puerto serie..)

          Responder
  2. Buenos artículos sobre la blue pill, bien concretos, me vinieron muy bien. Comento que en la hoja de datos del micro dice 64KB o 128KB. Depende de si es STM32F103C8 es de 64 y si es STM32F103CB es de 128. Dejo el link
    https://www.google.com/url?sa=t&source=web&rct=j&url=https://www.st.com/resource/en/datasheet/stm32f103c8.pdf&ved=2ahUKEwitsPTIg4fxAhUnqpUCHVd9DP8QFjACegQIHxAC&usg=AOvVaw0rd6I_7fuhTLdZOoycvGV5&cshid=1623121152277

    Saludos!

    Responder
  3. Hola profe muy buena su explicación, pero tengo una consulta, qué pasa si el
    Microcontrolador se me quema por un corto circuito como lo puedo remplazar, me puede orientar, gracias.

    Responder
    • Hola Francisco! No tengo el precio del microcontrolador suelto, pero no me extrañaría que sea muy parecido al de la placa completa. Y si necesitas pagar para que lo desuelden y vuelvan a soldar probablemente gastes todavia mas. Muy probablemente te convenga comprar una placa nueva.

      Responder
  4. Excelente.

    Ya lo habia usado bajo el IDE de Arduino. Pero queria usar STM32CubeIDE para poder aprender mejor.

    Se me presentaron unos inconvenientes al tratar de cargarlo y hacer DEBUG, y fue que en la cofiguracion ->debugger->Mode Setup -> Reset Mode debe estar en Software System Reset

    Responder

Responder a Lisandro Cancelar la respuesta

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

Habilitar notificaciones OK No, gracias