Blue Pill Introducción - pensactius/Tutoriales GitHub Wiki

Introducción

Cuando pensamos en una placa basada en microcontrolador para nuestros proyectos lo primero que pensamos es en usar Arduino. Es sencilla de usar, barata y ofrece gran cantidad de E/S digital y analógico.

Pero Arduino tiene sus limitaciones. Una de ellas es la velocidad, las placas Arduino basadas en AVR corren a 16 MHz. Suficiente para un amplio rango de aplicaciones, pero demasiado lento para otras.

Es por esto que necesitamos considerar otras placas alternativas a Arduino.

Introduciendo STM32F103xx

(Información extraída de Gadgetronicx

STM32 ofrece una amplia gama de microcontroladores de 32-bits y es bastante popular entre ingenieros y aficionados. En particular, el STM32F103C8T6 -el chip usado en la placa Blue Pill- es un microcontrolador de 32 bits basado en arquitectura ARM CORTEX M3. Tiene 48 pins y 64KB de memoria flash. A continuación podemos sus principales características:

  • Frecuencia máxima de trabajo – 72MHz
  • I2C Buses – 2
  • SPI Buses – 2
  • CAN Buses – Yes
  • Entradas Analógicas – 10
  • Pines PWM – 15
  • USART Buses – 3
  • GPIO – 32
  • Resolución ADC – 12 bit
  • Nivel Cuantización – 4096
  • Resolución PWM – 16 bit
  • SRAM (Datos) – 20KB
  • Memoria Flash (Código) – 64KB

Pesadilla STM32

Aviso ya que programar una placa basada en STM32 no es, en absoluto, una tarea para principiantes. En general requiere descargar una serie de programas y electrónica extra para programar y cargar el binario resultante a la placa.

A lo largo de este tutorial explicaré el proceso para poder programar la Blue Pill desde Arduino, y todos los programas y electrónica extras que necesitaremos instalar.

Es por esto que creo necesario explicar con un poco más de detalle cómo funciona una placa basada en STM32.

STM32 GPIO como salida

Antes de comenzar a programar con la placa Blue Pill con el IDE de Arduino veamos más detalladamente como funciona el microcontrolador STM32 que utiliza. Si estás familiarizado con los detalles internos de los microcontroladores te sonará el término registros. Todo microcontrolador tiene una serie de registros que necesita para operar de la forma deseada. Aunque usaremos el entorno de Arduino para programar la placa de forma sencilla, nunca viene mal conocer los detalles sobre los registros involucrados en su programación.

El registro APB2

En este tutorial, usaremos el pin PC13 para encender/apagar un LED. Así que vamos a revisar los registros asociados al pin PC13. Para activar un puerto determinado en un microcontrolador STM32 hay que acceder al registro APB2. Este registro se muestra a continuación:

APB2 Register bits

Los bits 16-31 están reservados, no tenemos control sobre ellos. Bits 0-16 son de lectura/escritura. Observa que el pin 4 denominado IOPCEN controla el puerto C. Si ponemos a 1 el bit IOPCEN habilitamos el puerto C y por tanto cualquier pin de este puerto estará disponible para nuestro uso.

Registro GPIOC_CRH

GPIOC_CRH

Para encender y apagar el LED conectado a PC13 necesitamos configurar PC13 como salida. Para ello hay que seleccionar el modo de operación del pin PC13 usando el registro GPIOC_CRH. Este registro es responsable de configurar los pines 8 a 15 del puerto C (PC13 el el pin 13 del puerto C). Si quisiéramos usar los pines 0 a 7 del puerto C usaríamos GPIOC_CRL. Cada pin usa 4 bits para determinar el modo de operación según la tabla siguiente:

Port bit configuration

Observando la tabla anterior se puede deducir que CNF13 deberá valer 00 (CNF1=0,CNF0=0) para operar en modo Push-Pull. Los bits del MODE13[1:0] los configuraremos a "0" y "1" lo que establecerá una velocidad máxima de operación de 10Mhz, más que de sobra para encender/apagar un LED.

Una vez configurado el modo de operación como Push-Pull, ya está todo listo para encender y apagar el LED conectado a PC13.

Registro GPIOC_ODR

Registro GPIO_CODR

Este es el registro que controla la salida de los pines del puerto C. Todos los bits de este registro son de lectura/escritura. Para activar un pin concreto lo que haremos será escribir un 1 en el bit correspondiente del registro. En nuestro caso queremos activar y desactivar el pin PC13, por tanto deberemos escribir un "1" (activar) o un "0" (desactivar) en el bit ODR13 .

Placa de desarrollo STM32 Blue Pill

En la figura podemos encontrar el pinout de la placa Blue Pill:

BluePill pinout

Esta placa STM32, popularmente conocida como Blue Pill, tiene un microcontrolador STM32F103C8T6. Tiene dos osciladores de 8 MHz y 32 MHz, que se usan para controlar el Reloj de Tiempo Real (RTC) interno. La placa funciona a 3.3V pero tiene un regulador de voltaje que permite alimentarla también con 5V. Todos los pines operan a 3.3V aunque hay algunos que pueden trabajar a 5V. En el dibujo anterior los puedes identificar los que admiten 5V porque tienen un circulito negro (5V tolerant).

Programando la placa STM32

Espero que se entienda un poco mejor los detalles involucrados en programar un microcontrolador STM32. Aunque usaremos el IDE de Arduino con las librerías de STM32, es importante entender qué sucede por debajo. Veamos como programar esta placa usando el IDE de Arduino.

El primer inconveniente que tiene esta placa es que, de fábrica, no podemos cargar el programa directamente desde USB. Para poder cargar el programa al STM32 necesitamos una adaptador FTDI, es decir, un conversor serie a USB. Hay métodos para cargar los programas desde el USB, pero implica cargar primero un bootloader usando el adaptador FTDI.

Si buscas USB a TTL en Aliexpress encontrarás muchos a elegir. Nosotros usaremos uno parecido a este:

USB to TTL

Programación de STM32 desde Arduino

Para poder trabajar con placas STM32 deberemos instalar los archivos de estas placas en el editor de Arduino desde el Gestor de Tarjetas, también conocido como stm32duino. A fecha de escribir este artículo (Octubre de 2020) existen dos variantes de stm32duino para programar STM32 desde Arduino:

Arduino STM32 https://github.com/rogerclarkmelbourne/Arduino_STM32

Probablemente el más utilizado, pero soporta muy pocas variantes de placas STM32.

Ventajas

  • Funciona con Maple mini, también con las versiones con carga desde USB
  • Funciona a partir del IDE 1.6.3 +
  • Con una larga vida por detrás, con lo que muchos de los fallos han sido corregidos.

Desventajas

  • El código original se creó por el 2011 y no usa las cabeceras estandard de STM ni la Standard Peripheral Library. Esto significa que añadir nuevas funcionalidades hardware i.e. CAN Bus o I2S es más complicado y debe programarse desde cero. (No había código propio de STM para la gama F103 hasta comienzos de 2015)

  • Más difícil de portar a otros micros como el STM32F4 ya que todo el código debe ser re-escrito, en lugar de poder usar el código disponible desde STM

Arduino STM32 es un derivado de libmaple, desarrollada inicialmente por LeafLabs para sus placas Maple y Maple mini. LibMapple se escribió en 2012 y sólo soporta Arduino 0022 (pre Arduino 1.0).

LibMaple y por tanto Arduino STM32 sólo soportan la serie STM32F103, aunque la versión que instalaremos también soporta algunas placas de la gama STM32F4.

STM Core boards https://github.com/stm32duino

STM ha creado su propia versión oficial, Arduino Core, que soporta múlitples MCUs de la familia STM32.

Basado en STM HAL, puede instalarse o bien desde github o directamente desde el Gestor de Tarjetas de Arduino.

Ventajas

  • Al usar STM HAL es más fácil portar a otros MCUs STM32
  • Al usar STM HAL añadir funcionalidades extra como SDIO debería ser más fácil que comenzar desde cero
  • Desarrollado por programadores profesionales (Wi6Labs), usando las especificaciones modernas de Arduino

Desventajas

  • Probablemente usa más memoria RAM y Flash ya que las librerías HAL consumen algo más de memoria que la librería LibMaple
  • Personalmente, la principal desventaja que encuentro es que no viene incluído el programa Open Source stm32flash para cargar los binarios (que sí viene en Arduino STM32 de Roger Clark). Para cargar los binarios a la placa deberemos descargar el programa STM32CubeProgrammer. Este programa, a su vez, requiere de una instalación de Java 8 update 261 que habrá que instalar también si no la tenemos ya instalada.

Ambas versiones siguen desarrollándose activamente y reciben actualizaciones (al menos a fecha de escribir estas líneas). Realmente no hay una opción mejor que la otra, ya que cada una tiene sus ventajas e inconvenientes. Comenzaré explicando la instalación de Arduino STM32 de Roger Clark.

Añadir Arduino STM32 al Gestor de Placas de Arduino

Para instalar Arduino STM32 sigue estos pasos:

  • Abre el IDE Arduino. Asegúrate de usar la versión 1.8 o superior.
  • Haz clic en el menú Archivo en la barra superior del menú.
  • Haz clic en Preferencias. Se abrirá el cuadro de diálogo Preferencias.
  • Deberías estar en la pestaña Ajustes del cuadro de diálogo Preferencias.
  • Busca el apartado “Gestor de URLs Adicionales de Tarjetas”.
  • Si ya hay texto en ese cuadro de texto añade una coma al final de este y continúa con el siguiente paso.
  • Pega el siguiente enlace en el cuadro de texto – http://dan.drown.org/stm32duino/package_STM32duino_index.json
  • Haz Clic en el botón OK para guardar los cambios.

Debería quedar algo así:

A continuación deberás usar esta nueva entrada para descargar las placas STM32F1xx al IDE de Arduino:

  • En el IDE de Arduino haz clic en el menú Herramientas.
  • Busca el apartado de Placa: (i.e. Placa: Arduino/Genuino Uno).
  • Se abrirá un submenú cuando selecciones la entrada Placa:.
  • En la parte superior del submenu aparece Gestor de Tarjetas... Haz clic en éste para abrir el cuadro de diálogo Gestor de Tarjetas.
  • En el filtro de búsqueda teclea stm32f1”.
  • Deberías encontrar “STM32F1xx/GD32F1xx boards by stm32duino”. La última versión a fecha de este artículo es la 2020.8.9. Selecciona esta entrada y haz clic en el botón Instalar.

  • Esto instalará las placas de la serie STM32F1 en el IDE de Arduino.
  • Ahora en el apartado de Placa: deberás ver las placas STM32 soportadas de la serie STM32F103. Para programar la Blue Pill usaremos Generic STM32F103C series.

Conexión del adaptador serie USB

El adaptador FTDI convierte las señales que van por el USB a una comunicación serie de forma que nuestra placa las pueda entender. Las conexiones a la placa se muestran a continuación. Recuerda que deberás poner la placa en modo programación cambiando el puente boot0 a la posición "1".

Conexion placa <-> FTDI

Deberás configurar el editor de Arduino para que use el adaptador serie como método de carga seleccionando Upload method: "Serial" como se muestra a continuación:

Hola Mundo - Parpadeo STM32

int ledPin = PC13;

void setup() {
  pinMode(ledPin, OUTPUT);  
  Serial.begin(115200);
}

void loop() {
  Serial.println("ENCENDIDO");
  digitalWrite(ledPin, HIGH);
  delay(1000);

  Serial.println("APAGADO");
  digitalWrite(ledPin, LOW);
  delay(500);

}

El LED está internamente conectado al Pin PC13 del controlador STM32. Activamos y desactivamos PC13 para encender durante un segundo (1000 ms) el LED y apagarlo 500 ms. Además hemos hecho uso del monitor serie para mostrar el estado del LED. Fíjate que hemos usado una velocidad de transferencia mayor. Es común en estas placas STM32 usar velocidades serie de 115200 baudios.