Numerosos dispositivos electrónicos actuales vienen con una unidad controladora STM32 (MCU, Microcontroller Unit). Este chip se ha hecho muy popular en la electrónica de nuestros múlticopteros, controladoras de vuelo y emisoras de radio, amén de toda una panoplia de IoT devices tan comunes hoy en día. Todo ello representaciones de un nuevo avance tecnológico: los «single chip computers», los nuevos y pequeños MCU frente a las viejas CPU, más complejas.

Ejemplos de lo anterior, desarrollados en otros artículos de este blog, son la radio FrSky X10 Horus o la **controladora Matek F405, controladas por un chip STM32.

Los drivers USB de este chip, tanto en su modo normal como en el modo bootloader o DFU (Device Firmware Update), pueden ser un verdadero dolor de cabeza en los sistemas Windows. Veamos cómo instalarlos y solucionar problemas de funcionamiento.

Nuestros dispositivos electrónicos controlados por un chip MCU suelen venir con un puerto serie USB, para conectarlos a un PC y enviar o recibir con el chip. Todas estas placas precisaban de otro chip adicional para convertir la señal serie USB de nuestro PC, a serie UART/TTL que utiliza el micro de manera nativa. Hasta no hace mucho era común que esa función la hiciera un chip como el popular CP210x, cuyos drivers se instalaban en un abrir y cerrar de ojos.

Actualmente en las placas con MCU STM32 no viene físicamente este chip conversor y su función está integrada en el propio micro, lo cual dificulta un poco las operaciones de instalación o actualización de firmware (flasheo). El objetivo imagino que ha sido la minimización de costes y la reducción de peso y tamaño.

En este nuevo escenario necesitamos conocer los modos de funcionamiento de cualquier chip MCU: modo de arranque normal y modo de arranque DFU. Ambos necesitarán drivers independientes.

El bootloader, o cómo arranca un chip STM32

Gráfico memoria donde se ubica el programa bootloader y el programa firmware de cualquier MCU

Nada más dar corriente a un dispositivo controlado por un STM32 (o cualquier otro MCU), se ejecuta un pequeño programa grabado normalmente en la ROM del microcontrolador. Es el bootloader.

En algunos dispositivos el programa bootloader estaba grabado en RAM, es decir, en memoria que podía ser reescrita. En ese caso, si cometemos algún error en el proceso de flasheo del firmware y borramos total o parcialmente al bootloader, el dispositivo quedará inutilizable (salvo poder arrancarlo con otro dispositivo convenientemente cableado). Es lo que se conoce como un dispositivo «bricked«, un ladrillo, vamos.

Nuestros dispositivos normalmente no tendrán este riesgo, por lo que cualquier error en el flasheo es subsanable. Conviene no obstante confirmar la ubicación en ROM del bootloader en las especificaciones o en foros.

El bootloader puede iniciarse en dos modos:

  1. Modo normal: arranca la placa y ejecuta el programa principal grabado en RAM. Es decir, ejecuta el firmware, su pequeño sistema operativo. Si no hacemos nada, este el modo por defecto, por lo que siempre que demos corriente a la placa, arrancará el firmware.
  2. Modo DFU (Device Firmware Upgrade): no arranca la placa y mantiene al microprocesador en espera de datos que grabará en en RAM. Es el modo para flashear nuestro firmware, es decir, para actualizar su sistema operativo y mantener al día nuestro dispositivo. Nuestra controladora de vuelo estará a la última versión, nuestra radio funcionará con el último OpenTx o nuestro transmisor FPV tendrá el último firmware ¿Imprescindible verdad?
    En placas antiguas había que puentear dos pines al darle corriente para activar este modo en el bootloader, en las más recientes suele ser un botón que hay que mantener pulsado mientras se da corriente (sólo mientras se da corriente ¡luego hay que soltar!)

Drivers USB (modo normal)

Enlaces para la descarga de los drivers USB y programas de instalación en Betaflight Configurator

El programa Betaflight Configurator viene con los enlaces actualizados para bajarse los drivers de todos los modos de funcionamiento de los STM32.

En el enlace número 1 están los viejos drivers del conversor FTDI CP201x. No deberían dar complicaciones si estamos en ese caso. Podemos bajarlos de aquí alternativamente: CP210x USB to UART Bridge VCP Drivers.

El modelo de conversor integrado en el propio chip STM32 se denomina «MCU integrated STM32 VCP USB interface«. Lo vemos en el enlace 2. Podemos bajarlos de aquí alternativamente: STM32 Virtual COM Port Driver. Instalarlos sólo si tu sistema operativo es anterior a Windows 10.

NOTA IMPORTANTE: si tenemos Windows 10, no instalar los drivers USB del STM32. El propio fabricante recomienda utilizar los nativos de Windows. De hecho, en mi caso, los del fabricante, aunque reconocían el dispositivo, NO FUNCIONABAN BIEN CON BETAFLIGHT.
Necesitaremos los drivers (CP201x o STM32, del fabricante o los nativos) instalados en nuestro equipo simplemente para poder conectar la placa y poder interaccionar con el firmware que ejecuta el STM32. Sin ellos ni siquiera podremos configurar, por ejemplo, nuestra radio o nuestra controladora de vuelo.

Con estos drivers instalados no debería haber problemas en el modo de conexión normal.

Drivers DFU (modo DFU – flasheo)

Botón modo DFU en controladora de vuelo Matek (STM32 F405)

Pero si lo que necesitamos es conectarnos con nuestro dispositivo para eliminar su sistema operativo actual y reemplazarlo por otro más moderno, necesitamos iniciar el STM32 en modo DFU.

Si nuestra controladora es más o menos antigua tal vez venga con el conversor CP201x. En este caso los drivers de este chip son suficientes para conectarnos con ella en modo DFU.

El problema surge cuando nuestra placa usa los drivers VCP (sin un chip USB->TTL físico). Este es el caso de la mayor parte de dispositivos MCU modernos.

Placas antiguas: Si nuestra placa lleva un conversor USB CP201x no necesitaremos instalar driver adicionales para flashearla.
Placas modernas: Si la conversión USB está integrada en placa, necesitaremos drivers adicionales VCP para el modo flasheo o DFU.

En estos últimos casos Windows parece tener innumerables problemas para reconocer nuestro MCU STM32 en modo DFU. En el siguiente apartado veremos como instalar los drivers DFU y resolver algún problema de instalación erronea.

Instalar los drivers STM32 modo DFU (Zadig drivers)

Procedimiento para instalar los drivers vía Zadig

Los drivers Zadig son los drivers oficiosos para el modo DFU. Están disponibles en el enlace 3 de Betaflight o en https://zadig.akeo.ie/. Zadig permite la reinstalación completa de varios drivers que no funcionen bien o no reconozcan al dispositivo correctamente.

Para instalar el driver tenemos que tener conectado al PC el dispositivo EN MODO DFU. Es importante esto último porque no en todos los manuales lo menciona.

Es muy conveniente tener algún programa para ver los dispositivos USB conectados. En la imagen usamos USB Device Tree Viewer. Al conectar el dispositivo lo vemos aparecer por su nombre en algún punto de nuestro árbol USB (punto 1). En este caso el driver funciona bien, pero si hemos llegado hasta aquí, el visor USB nos indicará con algún aviso que el driver tiene errores.

Luego, en Zadig hay que marcar Options -> List all devices (punto 2) para que aparezca todo lo conectado a los puertos USB. Seleccionamos nuestro dispositivo. Es MUY importante aquí seleccionar correctamente nuestro dispositivo, para ello utilizaremos el programa visor USB y lo identificaremos por el nombre (punto 3 = punto 1) o incluso por el device ID (punto 5). Si elegimos el dispositivo incorrecto arruinaremos su funcionamiento.

En el punto 4 nos mostrará el driver antiguo y el nuevo que va a instalar. No modificarlo. En la imagen es el mismo porque en mi sistema ya está arreglado.

Pulsamos en Reinstall driver (punto 6) y esperamos. En algunos casos he reportado hasta 10 minutos de espera, e incluso con mensajes de error al final el driver se ha reparado.

Instalar los drivers STM32 modo DFU (ImpulseRc drivers)

ImpulseRC driver fixer

Si lo anterior falla tenemos una última opción. Incluso si hemos metido la para con Zadig reinstalando el driver STM32 en vez del STM32 Bootloader (al conectar el dispositivo en el modo incorrecto, confieso), este programita puede sacarnos del apuro. Es un programa de terceros, al contrario que Zadig con código desconocido, por lo que conviene pasarlo por el antivirus.

Este programita lo podemos descargar de aquí. Aunque guardo una copia local aquí. Este programa es mucho más simple y no pregunta nada, simplemente arregla los drivers USB del STM32 que considera que no están bien instalados. En la web dice que funcionan para el chip STM32 F4, pero intuyo que valen para toda la familia STM32.

No pregunta nada. Se lanza e intenta la reparación. Como con el anterior hay que tener conectado el dispositivo en modo DFU, aunque en este caso, al ser absolutamente automático, supongo que si no lo haces lanzará un error. Usarlo con precaución y sólo como última opción, lo veo excesivamente automático para mi gusto.

Lecturas recomendadas

Hay mucha información en ingles sobre este tema en estas webs. Buena parte de la experiencia que me ha llevado a escribir este artículo está basada en la lectura completa de estas webs:

https://github.com/betaflight/betaflight/wiki/Installing-Betaflight#dfu-flashing-under-windows—usb-dfu

https://github.com/pbatard/libwdi/wiki/Zadig