Este blog está dedicado a mis experiencias, proyectos, dificultades y demás en todo lo relacionado a la electrónica y la programación en general sobre GNU/Linux

ARM Cortex-M, Nivel: Básico, STM32

Programar la BluePill (STM32) a través del USB con dapboot y PlatformIO

Nivel: Básico

¿Qué tengo que saber para este post?

  • Programar la Blue Pill o micro de STM32 con un ST-Link o a través de un USB/TTL Serie.

—————————————

En mi afán de solucionarle la vida a mis estudiantes, y que no necesiten un programador para arrancar con la Blue Pill, me puse en búsqueda de un bootloader que funcionara fácil o naturalmente en PlatformIO al hacer un clic. Obviamente, también debería funcionar con libOpenCM3 que es la herramienta de desarrollo con la que pienso encarar mi curso. Como era natural, probé primero con el STM32duino, pero no me convencía por diversos motivos, y además no podía compatibilizarlo con libOpenCM3 por lo cual terminó de ser descartado.

Por eso decidí utilizar el dapboot, un proyecto al que le mandé una estrella en github hace meses, pero nunca había probado (¿para qué? si tengo un stlink). Y después de muchas horas de buscar, leer y probar, encontré la manera de que todo funcione armoniosamente.

Preparativos

Antes de arrancar hay que tener un método probado y funcionando de grabado para la BluePill, puede ser utilizando un stlink, un USB/TTL Serie o (nunca lo probé, pero calculo que debería funcionar) un Arduino que nos haga de USB/TTL Serie. Para poder grabar el firmware del dapboot. Este bello proyecto tiene los binarios ya compilados en la parte de release de github listos para descargar y quemar. Tiene 2 variantes:

  • dapboot: el firmware se graba al principio de la flash y debemos tener en cuenta que nuestro código debe estar después del mismo.
  • highboot: el firmware se graba al final de la flash, por eso existen 2 versiones para la bluepill (64k y 128k). De esta forma no debemos procuparnos por donde arranca nuestro código, sino de que no llegue al final de la flash y pise el bootloader.

Obviamente, opté por el highboot-v1.11-bluepill-128.bin (en mi caso es de 128k), porque dudo que mis estudiantes lleguen a ocupar los 64k o 128k con las cosas que les voy a pedir programar y me pareció más práctico. Entonces usé el st-flash por linea de comandos para grabar el firmware conectando el stlink:

st-flash write highboot-v1.11-bluepill-128.bin 0x08000000

Si no tenés este programa instalado y estás en una distro de Linux derivada de Debian (Ubuntu, Mint etc.), se puede instalar por medio de apt:

sudo apt install stlink-tools stlink-gui

Como observarán existe una interfaz gráfica, que pueden utilizar también para grabar.

Si necesitan grabarlo por puerto serie, porque no tienen el stlink, pero sí un USB/TTL Serie o Arduino, van a necesitar el stm32flash que también se instala a través de apt.

Si usan windows voy a suponer que saben utilizar los softwares del fabricante para grabar el micro.

Podemos verificar que todo va bien si movemos el BOOT1 y conectando la BluePill al USB y hacemos un lsusb deberíamos ver lo siguiente:

Configurar el PlatformIO

El siguiente paso es empezar un proyecto en PlatformIO con libOpenCM3 como ya venimos trabajando los que siguen mi blog o canal de YT. Y en el platformio.ini debemos agregar las dos siguientes variables:

upload_protocol = dfu
upload_command = $PROJECT_PACKAGES_DIR/tool-dfuutil/bin/dfu-util -D $SOURCE

Con esto PlatformIO bajará dfu-util que es la herramienta que necesitamos y luego está el comando que se ejecutará al clickear upload con lo que hay que grabarle (el firmware.bin que se genera al compilar).

¿Cómo se usa?

Ahora lo único que hace falta es mover el jumper BOOT1 de la BluePill y apretar el reset, esto hace que se active el modo dfu. Ponemos el BOOT1 de nuevo en su posición original para que después de grabarlo no vuelva a entrar en modo dfu. Resta simplemente darle al UPLOAD en PlatformIO para que se grabe y empiece a ejecutar nuestro programa. Es normal que haya un error en la terminal al final de la programación ya que no es un dispositivo reconocido por dfu-util, pero no es para preocuparse.

Cada vez que queramos actualizar nuestro programa debemos hacer la secuencia de mover el BOOT1 y resetear. Otra opción es escribir en los dos primeros registros del BackUp «BOOT» en ASCII para activar el bootloader por software. Lo bueno es que una vez grabado el USB queda disponible para que lo utilicemos en nuestra aplicación, a diferencia del de Arduino que nos deja un CDC Serie.

Otra gran ventaja es que en windows no se necesita driver, lo cual me preocupaba porque sé que la mayoría (o todos) mis estudiantes son victimas usuarios de ese Sistema Operativo y quería estar seguro de que sea algo fácil de utilizar.

En definitiva estoy muy conforme con que se pueda grabar el STM32 por USB de una manera que me parece tan práctica, y que mis estudiantes que no tengan la facilidad económica puedan prescindir del stlink. Sé que tienen costos muy bajos, pero a veces eso implica menos dinero para comida o viáticos en la vida de mis estudiantes.

¡Hasta la próxima!

  1. Ale

    Piola.. Gracias por compartir..

  2. Hola, te agradezco mucho esto..

Dejar una respuesta