En esta ocasión os traigo una guía sobre STM32F103 (Bootloader), y su programación. Este microcontrolador tiene la ventaja de tener más capacidad en todos los aspectos frente a un Arduino (ATMega328p), teniendo más SRAM, memoria de programa, resolución de los ADC y DAC… por un poco más de dinero. Mas información en el datasheet.

Por comparar dos similares, el Arduino Nano cuesta en torno a 1.5€, frente a los poco más de 2€ que cuesta el STM32F103, el cual tiene más potencia, más memoria, más pines…

CaracterísticaATMega328PSTM32F103
CPU16Mhz72Mhz
Flash Memory32k64k/128k
SRAM4k20k
EEPROM1k
Voltaje de funcionamiento2.7v – 5.5v2.0v – 3.6v
Pines14 Digitales y 6 Analógicos32 pines, 10 usables como analógicos
Analog Digital Converter (ADC)10 bits, 8 canales12 bits, 16 canales
PWMdos de 8 bits y uno de 16 bits, 6 canales *1tres de 16 bits, 12 canales
Interfaces1 I2C
1 USART
1 SPI
2 I2C
3 USART
2 SPI
CAN
USBSólo programaciónAcceso completo
*1: La resolución PWM se puede programar modificando los timers. Por norma es de 8 bits, pero modificando la frecuencia del PWM de algunos pines se puede subir a 16 bits. También se puede hacer lo contrario y aumentar la frecuencia de dichos pines.

Bueno, dejando de lado las cosas que ofrece, en este post me centraré en enseñaros cómo quemar el bootloader y programarlo ya sea usando el USB integrado al estilo Arduino, o usando un programador UART externo.

Modos de arranque

Antes de ponernos manos a la obra, es importante que conozcas un poco por encima los modos de arranque del STM32F103. El microcontrolador tiene tres modos de arranque básicos:

BOOT0BOOT1Modo
00Flash del usuario (modo por defecto)
10Memoria del sistema (bootloader)
11Memoria SRAM

Dichos modos de arranque se controlan con los dos jumpers que hay en la placa, los cuales están marcados como BOOT0 y BOOT1. Dependiendo de cuál activemos, el microcontrolador arrancará en un modo u otro y nos permitirá programarlo o no.

Flash del usuario

Este es el modo por defecto, y en el que arranca el microcontrolador cuando los dos jumpers BOOT están en 0. En este modo se carga el programa que haya sido programado en el microcontrolador y en el caso de no haberlo, procederá a cargar el bootloader interno.

Memoria del sistema

El segundo modo es el de arranque usando la memoria del sistema. En este modo, el microcontrolador arrancará como si no tuviera ningún programa cargado, y por lo tanto cargará el bootloader interno. Este área de memoria es de sólo lectura, pero este modo nos permitirá programar el área de memoria Flash de usuario a través de UART. Para entrar en este modo tendremos que cambiar el jumper BOOT0 a 1 tal y como se muestra en la imagen siguiente.

Memoria SRAM

Este modo permitirá cargar un programa desde la memoria SRAM previamente cargado. Para acceder a este modo pondremos ambos jumpers BOOT a 1.

STM32F103 Bootloader

Lo primero que debes saber es qué es el bootloader. El Bootloader no es más que un código que ejecuta el microcontrolador al arrancar y que le da unas funcionalidades básicas. Entre esas funcionalidades, está la que nos permite programarlo sin tener que usar programadores externos.

Arduino viene con un programador UART incorporado en la placa, y es por eso que se puede programar directamente por USB. Esto es gracias a que el bootloader de Arduino se encarga de proporcionar la funcionalidad básica de programación por UART.

En el caso del STM32 ocurre lo mismo, pero con la diferencia de que este microcontrolador no dispone de programador UART incorporado. Esto es a su vez una ventaja y una desventaja, ya que no permite su programación directa por USB, pero a cambio el acceso al USB es directo y nos permite simular otros dispositivos, como por ejemplo un mando de juegos.

Gracias a esta ventaja, se han creado bootloaders que la aprovechan para simular programadores UART, y permitir programar el microcontrolador como si de un Arduino se tratara. Obviamente, el funcionamiento no es exactamente el de un UART, pero es para que os hagáis una idea. Teniendo en cuenta que el bootloader del microcontrolador está en un área de memoria de sólo lectura, este tipo de bootloader personalizado se grabará en la memoria Flash de usuario, por lo que ocuparán parte del espacio disponible.

En este post te hablaré de los dos principales bootloaders que añaden dicha funcionalidad, los cuales son el STM32duino y el STM32 HID.

Descargar el bootloader

Lo primero que tenemos que hacer es descargar el fichero de Bootloader. En el caso de SMT32duino los podemos encontrar en la carpeta binaries, y en el caso de SMT32 HID, lo podemos descargar del apartado releases.

Para saber qué fichero nos debemos descargar, nos fijaremos en el pin en el que está el led que está incorporado en la placa.

Si te fijas en la imagen de arriba, verás que el led está en el pin PC13, por lo que esa será la clave a la hora de descargar el bootloader correcto. En ambos veremos que hay multitud de ficheros, pero al menos uno de ellos finalizará en pc13, por lo que ese será el que tendremos que usar.

Una vez descargado, ya podremos proceder a quemarlo en el STM32.

Nota: El bootloader Maple necesita de instalar un driver para poder programar el microcontrolador, al contrario que el STM32 HID, el cual no necesita de ningún driver extra.

Quemar el bootloader

Para quemar el bootloader es necesario que instalemos un programa que nos permitirá programar el microcontrolador, además de un programador USB->UART. Este programa además necesita de Java, por lo que lo primero que haremos será descargar e instalar la última versión si no la tenemos ya:

https://www.java.com/es/download/

Una vez descargado e instalado, procederemos a descargar el programa que nos servirá para quemar el bootloader. Este programa es el STM32Cube, y lo podemos descargar del siguiente enlace:

https://www.st.com/en/development-tools/stm32cubeprog.html#get-software

La descarga solicitará una dirección de Email, a la cual enviarán un enlace de descarga. Una vez descargado e instalado el programa, ya podremos proceder a quemar el bootloader.

Empezaremos por conectar el STM32 tal y como se muestra en la siguiente imagen.

STM32F103 Bootloader burn

Es muy importante que la configuración de los jumpers estén como en la imagen, estando BOOT0 a 1, y BOOT1 a 0, ya que de otro modo el microcontrolador no será detectado. Una vez configurado como en la imagen, conectaremos el programador UART al PC a través del USB, y abriremos el programa STM32CubeProgrammer (el instalador habrá creado un icono en el escritorio).

Una vez abierto, nos fijaremos en que el programador aparece en el listado de puertos COM, y le daremos a connect. Esto detectará la tarjeta y la conectará al programa, permitiéndonos subir un programa (en este caso el bootloader).

Si nos diese error, verificaremos las conexiones, que el jumper de Boot esté exactamente como el de la imagen, y que el puerto sea correcto. Una vez se haya conectado, tendremos que pulsar en el icono de «descarga» que hay en la barra lateral izquierda.

Esto nos llevará a una nueva pantalla, en la que podremos pulsar al botón «browse» para seleccionar el fichero del bootloader que queremos quemar.

Una vez seleccionado el fichero a quemar, simplemente daremos a «Start Programming».

La barra de progreso de abajo se moverá para indicarnos el estado, y tras unos segundos nos saldrá un mensaje indicando que el proceso ha terminado correctamente.

Por último volvemos a colocar los jumpers de Boot a 0 los dos para que cargue el nuevo bootloader, y ¡listo!, ya tenemos nuestro STM32F103 con el bootloader programado y listo para ser programado con el Arduino IDE.

Programar microcontrolador

Para programar nuestro STM32F103 con el bootloader ya subido, lo primero que tendremos que hacer es descargarnos la configuración de las tarjetas en el IDE. Para ello vamos a Archivo > Preferencias.

En la nueva pantalla que aparecerá, pulsamos sobre el botón que hay a la derecha del apartado «Gestión de URL’s Adicionales de Tarjetas».

Añadimos la siguiente URL a la lista.

https://github.com/stm32duino/BoardManagerFiles/raw/master/package_stmicroelectronics_index.json

Y por último cerramos ambas ventanas dando a OK en las dos. Ahora procederemos a instalar la placa, para lo cual tendremos que ir a Herramientas > Placa > Gestión de tarjetas

Y en la ventana nueva que se abrirá buscamos STM32. En el resultado que nos saldrá bajamos hacia abajo, ya que el botón de instalar está oculto por el texto tan largo, y pulsamos sobre él para proceder a instalarlo.

Este proceso tardará un poco, por lo que esperamos y cuando termine simplemente cerramos la ventana.

Una vez finalizado, ya tendremos todo lo necesario para programar nuestro microcontrolador, procederemos a conectarlo al ordenador. Para ello nos asegurarnos de que ambos jumpers de Boot están a 0 si elegimos el bootloader de Maple.

Configuración de jumpers para STM32 Maple

o por el contrario pondremos el jumper BOOT1 a 1 si elegimos el bootloader HID.

Configuración de jumpers para STM32 HID

Una vez configurados los jumpers, procedemos a conectar la placa al PC directamente (sin el programador usado arriba para quemar el bootloader), y entonces veremos cómo el PC la detecta. En el caso de Maple nos asignará el un puerto, pero en el caso de HID no nos aparecerá en el listado de puertos.

Si nos inclinamos por el bootloader de Maple, es muy importante instalar el driver primero o sino la placa no será detectada cuando entre en modo programación y por lo tanto no podremos programarla. Para ello descargamos el siguiente fichero ZIP, lo descomprimimos, y ejecutamos el fichero install_drivers.bat que está dentro de la carpeta resultante.

Ahora que ya tenemos todo lo necesario instalado, procederemos a abrir nuestro sketch de Arduino y programarlo. Seleccionamos las opciones correspondientes a la placa que tenemos y el bootloader que hemos instalado, y pulsamos sobre el botón de programar.

NOTA: Recuerda que en el caso de usar el bootloader STM32 HID la opción de puerto no será seleccionable, pero en el caso de usar el bootloader Maple, tendrás que seleccionar el puerto correcto.

Tras unos instantes de compilación el programa estará listo y subido al microcontrolador. En el caso de tener el bootloader HID, tendrás que volver a poner ambos jumpers a 0 para que el STM32 cargue el programa. En el caso del bootloader de Mapple, ambos seguirán a 0 y por lo tanto no tendrás que realizar ningún cambio.

Espero que te haya gustado y te sirva para tus proyectos futuros. ¡Saludos!

Daniel Carrasco

DevOps con varios años de experiencia, y arquitecto cloud con experiencia en Google Cloud Platform y Amazon Web Services. En sus ratos libres experimenta con Arduino y electrónica.

Deja un comentario

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