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ística | ATMega328P | STM32F103 |
CPU | 16Mhz | 72Mhz |
Flash Memory | 32k | 64k/128k |
SRAM | 4k | 20k |
EEPROM | 1k | |
Voltaje de funcionamiento | 2.7v – 5.5v | 2.0v – 3.6v |
Pines | 14 Digitales y 6 Analógicos | 32 pines, 10 usables como analógicos |
Analog Digital Converter (ADC) | 10 bits, 8 canales | 12 bits, 16 canales |
PWM | dos de 8 bits y uno de 16 bits, 6 canales *1 | tres de 16 bits, 12 canales |
Interfaces | 1 I2C 1 USART 1 SPI | 2 I2C 3 USART 2 SPI CAN |
USB | Sólo programación | Acceso completo |
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:
BOOT0 | BOOT1 | Modo |
0 | 0 | Flash del usuario (modo por defecto) |
1 | 0 | Memoria del sistema (bootloader) |
1 | 1 | Memoria 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.
- STM32duino: https://github.com/rogerclarkmelbourne/STM32duino-bootloader
- STM32 HID: https://github.com/Serasidis/STM32_HID_Bootloader
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.
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.
o por el contrario pondremos el jumper BOOT1 a 1 si elegimos el bootloader 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!