Hace años me costó bastantes dolores de cabeza tener todas las piezas claras y como sé que el artículo más visitado de LibreServo es Software para programar STM32, voy a intentar realizar un artículo que conglomere todos los pasos necesarios para poner a funcionar desde cero un microcontrolador STM32, tanto a nivel de diseño electrónico, como de programación. Como LibreServo está basado en el microcontrolador STM32f302K8, todo irá referenciado a éste microcontrolador por facilidad, pero los pasos son exportables a todos los microcontrolador más comunes de la familia STM32 ARM Cortex de ST, de hecho, si es tu primer proyecto no sería la mejor opción con la que empezar, más que nada por el encapsulado que trae. El STM32F302C8 sería el gemelo pero en un encapsulado mucho más sencillo de soldar. Pero hay literalmente decenas de microcontroladores según lo que cada uno requiera.
Vamos a realizar un ejemplo de Hola mundo, hacer parpadear un LED. Si lo que tienes es ya una placa de desarrollo o una placa ya diseñada con un microcontrolador de ST y quieres ir directamente a la parte software, entonces puedes ahorrarte esta primera parte centrada en el diseño electrónico y saltar al apartado de Software para programar STM32 o a Cómo programar un microcontrolador STM32 si ya tienes instalado el IDE de programación y quieres ver un ejemplo de programación. También puedes seguir leyendo e intentar repasar y/o aclarar conceptos.
Cómo diseñar tu primera placa electrónica para un microcontrolador STM32
Puede ser que te de muchísimo respecto o miedo diseñar un circuito electrónico con un microcontrolador STM32 (o cualquier otro microcontrolador) pero como verás a continuación, tan sólo requiere seguir cuatro sencillos pasos. Vamos a ello.
Para esta parte, vamos a hacer uso del datasheet, que es el documento donde estará la información básica y resumida de nuestro microcontrolador. Para información más detallada, hay que utilizar el Reference Manual. Que sus más de 1000 páginas no te echen atrás, utilizaremos partes muy concretas del mismo. Aún así, en el futuro debería ser tu libro de consulta.
Alimentación
Puede parecer algo obvio, pero el primer punto es saber a qué voltaje funciona tu microcontrolador. En nuestro caso ya en la primera página del datasheet nos indica que nuestro microcontrolador está preparado para funcionar desde 2 hasta 3,6 voltios. Pero más adecuado es ir la sección 3.5 Power management del datasheet, donde nos indica específicamente que tanto VDD como VDDA deben ir de 2 a 3,6 voltios, utilizaremos 3,3 voltios que es el voltaje normativo. ¡OJO! Que arduino suele funcionar a 5V, usa tecnología más vieja, y tienes que tener cuidado si vas a juntar un arduino con tu micro STM32, la mayoría de pines de los STM32 admiten 5V de entrada, pero tendrás que asegurarte previamente mirando el datasheet, Table 13. STM32F302x6/8 pin definitions. Tanto VSS como VSSA van conectados a tierra, 0V. Vemos que ST menciona dos tipos de alimentación VDD, digital, y VDDA, analógica. Para no complicanos ni tener problemas en el futuro, tanto VDD como VDDA deberán de ir a la misma tensión, 3,3 voltios en nuestro caso. Pueden estar directamente conectados, o si queremos un poco de aislamiento entre ellos podemos poner una "ferrita" entre ellos. Este punto no es necesario así que si es tu primera vez y no necesitas que tu circuito lea señales analógicas con muchísima preción, puedes conectar directamente VDD con VDDA.
Como ya sabemos que el microcontrolador va a funcionar a 3,3 voltios, lo siguiente es buscar un regulador lineal que nos genere nuestros 3,3 voltios. El más común es el LM1117 y familiares, con salida fija en 3,3 voltios. Cualquier distribuidor de componentes como Farnell, Rs-online, Mouser o la china lcsc entre otros muchos otros, tendrán decenas si no cientos de reguladores lineales a 3,3 voltios. Un microcontrolador STM32 por norma general consume menos de 50-100mA, así que prácticamente cualquier regulador lineal a 3,3 voltios te va a servir. Aunque si añades a tu circuito LEDs, sensores, bluetooth... eso será consumo extra que tendrás que calcular para escoger un regulador lineal adecuado. Por norma, estos reguladores lineales piden 1 condensador de 10uF tanto en la entrada como en la salida del regulador lineal para filtrar y tener una tensión más limpia. Puedes poner tanto condensadores electrolíticos como cerámicos para esta tarea, pero siempre pegados y en el mismo plano al regulador lineal.
VBAT no es necesario conectar ya que se utiliza sólo como alimentación de backup si la principal cae. No vamos a utilizar dicha característica.
Condensadores de desacoplo
Una de las cosas que siempre hay que mirar, son los condensadores de desacoplo. Son condensadores cerámicos que ST indica que tienes que colocar justo en los pines de alimentación del microcontrolador para asegurar su estabilidad. En el punto 6.1.6 Power supply scheme del datasheet, nos muestra qué condensadores tenemos que tener. Por un lado nos indica que para la alimentación digital, por cada par de VDD y VSS tenemos que poner un condensador de 100nF y luego, a parte, uno de 4.7uF. En nuestro caso, tenemos sólo dos pares de VDD y VSS así que pondremos dos condensadores de 100nF. ¡OJO! Tiene que ir uno en cada entrada de alimentación, no es correcto poner todos los condensadores directamente en una entrada. El de 4.7uF se puede colocar en cualquier par VDD-VSS. Además, nos indica que para la alimentación analógica VDDA-VSSA, tenemos que poner un condensador de 1uF y otro de 10nF.
Todos los condensadores de desacoplo siempre tienen que ir lo más cerca posible de los pines de alimentación. Esto es así en el microcontrolador como en cualquier otro componente.
Elección de un reloj externo
El reloj de un microcontrolador, sobre todo en los microcontroladores de cierta velocidad, funciona a una velocidad base, por ejemplo 8MHz, y el microcontrolador multiplica su velocidad para alcanzar 64, 72, 120 o los MHz que sea a los que funcione el microcontrolador.
El microcontrolador tiene un reloj interno, el cual por norma siempre intentaremos evitar su uso por su imprecisión y optaremos por un reloj externo. Dentro de los externos de precisión, tenemos que diferenciar entre un osciladores externos (de cristal) y cristales externos. Existen también resonadores cerámicos, que tienen una precisión mayor que el reloj interno del microcontrolador pero no tan alta como los anteriores, con lo que no son los más adecuados para comunicaciones, por ejemplo, así que los descartamos de salida.
El cristal externo es un cristal de cuarzo al que hay que añadir dos condensadores de carga, CL, que hay que calcular siguiendo el documento AN2867 - guía para oscilador externo de ST. En cambio, un oscilador externo es un componente que integra un cristal de cuarzo y que directamente nos genera una señal cuadrada de reloj a la frecuencia requerida. De los dos, el oscilador es el más sencillo de utilizar, el más compacto, utiliza sólo un pin de nuestro microcontrolador por los dos del cristal, aunque es un poco más caro que el cristal. En nuestro caso, ya sólo por el escaso espacio que disponemos utilizaremos un oscilador y de paso ganaremos el resto de ventajas que supone su uso. En general, si no tienes un presupuesto súper ajustado, un oscilador de cristal externo es lo más sencillo y la "mejor opción".
Existe un segundo tipo de reloj, un reloj lento de 32,768KHz, llamado RTC, reloj de tiempo real. Este reloj suele ser un reloj de mucha precisión que se utiliza para aplicaciones de hora, calendarios... Por norma general, no lo utilizaremos así que no tendremos que instalarlo.
Pines para programar el STM32
Para programar un microcontrolador STM32 hay muchas formas. Pero sin tener que cargar un bootloader específico para programarlo por USB o puerto serie, los típicos modos y con los que puedes hacer debug son JTAG y SW-DP (SWD).
De nuevo iré directamente al más sencillo y para mi la mejor opción, el SW-DP, que es un SWD, Serial Wire Debugger. En principio no tiene ninguna desventaja respecto a JTAG, tan sólo que es un método propio de ST, por lo demás, es igual pero se necesitan sólo 2 pines en vez de los 5 del JTAG, además, según la página 1041 del Reference Manual, punto 33.4.3 Internal pull-up and pull-down on JTAG pins, los microcontroladores de ST traen pull-ups y pull-downs internos con lo que no hay necesidad de poner resistencias de pull-up/pull-down en nuestro diseño.
Como hemos dicho, el SW-DP hace uso de dos pines, SWDIO y SWCLK, PA13 y PA14 respectivamente en nuestro microcontrolador. Además de las dos líneas de comunicación tendremos que tener tierra, que es obligatoria, y alimentación, que nos permitirá programar sin depender de una batería externa. En total, sólo son necesarios 4 cables.
¿Y reset?
La típica pregunta que siempre me hacen es si no hace falta el botón reset para programar nuestro microcontrolador o al menos cablearlo hasta el programador. Pues en nuestro caso que usaremos SW-DP para programar, no es necesario. Podríamos dejar el pin al aire si nunca vamos a querer hacer reset de nuestro microcontrolador con un botón, obviamente desconectando la alimentación resetea el microcontrolador y si estamos programando/debugueando también podemos hacer reset del microcontrolador desde el programa de programación. Aún así, no cuesta mucho poner un condensador y un botón extra, espacio más que nada, así que es decisión tuya. Si te sirve de ejemplo a seguir, yo nunca lo uso.
Recapitulación Diseño Electrónico
Como hemos visto, tan sólo son cuatro pasos básicos los que tendrás que seguir. En resumen quedaría:
- Diseñar la alimentación entorno a un regulador lineal de 3,3 voltios
- Colocar condensadores de desacoplo según indica el datasheet
- Utilizar un oscilador externo como señal de reloj
- Reservar los dos pines necesarios para programar el microcontrolador creando una interfaz de 4 pines para ello.
A continuación dejo el esquema electrónico mínimo para el STM32F302K8 donde he puesto tanto el reset, como una pequeña ferrita (ambos opcionales). Además, añado un led RGB para el test de Hola mundo. Adjunto el fichero para Eagle.
Esquema electrónico mínimo para STM32
TestLed.sch [344 KB]
ST-Link v2, hardware para programar STM32
De izquierda a derecha: ST-LINK v3, ST-LINK v2, DiscoveryF0 y Clon ST-LINK
Para programar un microcontrolador STM32, se encesita utilizar una "interfaz hardware", el ST-Link v2. El ST-Link se conecta al pc por usb y tiene los pines necesarios para programar el microcontrolador en una tira de pines. Existen varios formatos y precios.
Hace poco han sacado el ST-Link v3, pero no es necesario su uso y pagar su sobre-precio. En cuanto al ST-Link v2, tenemos varias opciones. Por un lado está el propio ST-Link v2 de ST, el cual es un aparato bastante engorroso del que no recomiendo su compra. Por otro lado, ST en sus placas de desarrollo también incluye un ST-Link v2 completo con la salvedad de que viene en un formato más adecuado y además es más barato ¡incluso viniendo con la placa de desarrollo! Esta es una opción muy adecuada. La placa de desarrollo que se compra para conseguir su ST-Link v2 es la stm32f0discovery, que cuesta menos de 10€ en los principales distribuidores; Farnell, Mouser, Rs-online... Pero aún hay una opción aún más barata e incluso cómoda, y es usar un clónico de ST-Link v2 que encontraremos por menos de 5€ en Ebay, Aliexpress, Banggood... Yo para esta guía usaré estas dos últimas opciones, el ST-Link integrado del stm32f0discovery y uno clónico.
En el siguiente paso, veremos IDE para programar STM32