En la actualidad, al escuchar de proyectos de electrónica lo primero que se nos viene a la mente es la existencia de un Arduino.
A pesar de que arduino es una buena plataforma estilo plug & play les puedo asegurar que llegará el momento en el que quieran evolucionar a microcontroladores o sistemas más potentes.
Ahí es donde aparecen los microcontroladores ARM Cortex M de 32 bits. En si ARM no fabrica los chips, si no que licencia el core y periféricos a terceros, para que ellos sean los encargados de fabricarlos.
De los ARM Cortex M, tenemos 3 principales familias: M0 y M0+, M3 y M4, M7. Además cuentan con una infinidad de tarjetas de desarrollo a precios más asequibles que los mismos arduinos.
Me podrán decir que en los arduinos también hay procesadores ARM Cortex con el Arduino DUE o incluso se podría meter aquí el Teensy, pero si comparamos los precios en canales oficiales, nos encontramos que los arduinos tienen precios más elevados que otras tarjetas de desarrollo con ARM Cortex M.
Si ponemos un ejemplo, por canales oficiales, el arduino pro mini 328 tiene un costo de alrededor de 13 usd más impuestos y envío, pero sólo te ofrece un procesador de 8 bits con 2K en RAM y 32K en FLASH, pero por el mismo precio, no podemos conseguir una serie de tarjetas Nucleo de STMicroelectronics con procesadores ARM Cortex M0 a M4.
Por ejemplo:
Nucleo-L432KC, ARM Cortex M4, 64K SRAM, 256K Flash, Unidad de Punto Flotante e instrucciones DSP.
Nucleo-F303RE, ARM Cortex M4, 64K SRAM, 512K Flash, Unidad de Punto Flotante e instrucciones DSP.
Ahora si nos vamos al rango de precios del Arduino Due (64 usd) ARM Cortex M3 con 96K en SRAM y 512K en FLASH y el teensy 3.6 (34 USD) ARM Cortex M4 256K SRAM y 1M en FLASH, de otro lado contamos con tarjetas como
Nucleo-F746ZG, ARM Cortex M7, 320K SRAM y 1M Flash (por 30 USD)
En definitiva, con estos MCUs podrían ser capaces de enfrentar proyectos más complejos usando sistemas operativos como FreeRTOS y Nuttx.
Instalando las herramientas de desarrollo en Ubuntu
Antes de querer usar un IDE, primero debemos entender como se manejan estos procesadores desde sus bases, por lo que requeriremos instalar 2 componentes esenciales:
- Toolchain
- Debuggger
El toolchain, son las herramientas que nos permiten traducir de un lenguaje de programación de alto nivel como lo es C/C++ al lenguaje máquina que es el que entiende el MCU.
El Debugger, son las herramientas que nos permiten analizar el comportamiento del sistema, nos permite verificar registros, variables, colocar breakpoints, de tal forma que podamos resolver problemas de una forma más adecuada que el uso de meras impresiones a consola.
Instalando el Toolchain
Esta es la parte más sencilla del proceso, ya que se mantiene un ppa con las últimas versiones del gcc para sistemas embebidos, por lo cual lo único que tenemos que hacer es abrir una terminal y escribir lo siguiente
Al momento, la última versión es la 6.3.1
Instalando el debugger
En los repositorios de ubuntu se encuentra el OpenOCD, pero si se quiere la última versión la tendrán que descargar y compilar. Para comenzar simplemente usaremos el OpenOCD de la distribución que en estos momentos es la versión 0.9
Como la mayorías de las tarjetas de desarrollo de STMicroelectronics cuentan con el programador ST-Link, tenemos otra opción que pueden descargar y compilar una herramienta llamada stlink. Más información de esta herramienta la pueden obtener de No tienes permitido ver los links. Registrarse o Entrar a mi cuenta y como lo deben de compilar en No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Para las primeras pruebas, esta última herramienta va a ser usada.
Hola Mundo
Ya que tenemos nuestro toolchain procederemos a realizar el primer hola mundo, que consta en prender y apagar un LED de forma cíclica. Para esas pruebas voy a usar una tarjeta de desarrollo mínima que puede obtener por internet y que cuenta con el STM32F103C8T6.
También nos descargaremos las hojas de datos y manuales de referencia del microcontrolador. En este caso todos esos archivos los podemos conseguir en el siguiente enlace No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Los documentos que nos interesan son las especificaciones del producto (DS5319), el manual de referencia (RM0008) y los manuales de programación (PM0075 y PM0056) y para finalizar, dependiendo de los periféricos que usemos en nuestros proyectos tendríamos que darle un vistazo a los erratas (ES096).
No es que nos tengamos que leer las 1137 páginas del manual de referencia, pero sirven como un apoyo para resolver dudas puntuales.
El objetivo de este primer ejemplo será entender como movernos por los archivos anteriores.
El primer paso es buscar el mapa de memoria. Una imagen se encuentra en el primer archivo sugerido en la página 34.
Según el mapa de memoría la RAM se ubica en la dirección 0x20000000, la flash en 0x08000000 y los registros de los periféricos se encuentran en 0x40000000 y a partir de esta dirección se encuentran los registros que controlan todos los periféricos de los que vamos a hacer uso.
Así que lo primero que es crear un directorio para nuestro primer ejemplo donde crearemos nuestro main.c
Y añadiremos estas primeras líneas
A diferencia de los otros MCUs, en los arm cortex a cada periférico se le tiene que habilitar el reloj, por lo que si queremos usar el el puerto C y el pin 13 de este puerto, primero tenemos que saber a que reloj esta conectado para saber cual es el registro que tenemos que acceder. En la página 11 del mismo archivo tenemos un diagrama de bloques que nos indica cada periférico a cual bus y reloj esta conectados.
De la imagen anterior podemos ver que el puerto C esta conectado al bus APB2.
Hay una serie de registros que controlan en reloj y que inician en la dirección 0x40021000 y es llamado RCC (Reset and Clock Control), y el registro que nos interesa es el que nos permite activar el reloj para el Puerto C. La información de estos registros se encuentran en el manual de referencia (RM0008) en la sección 7
¿Que información obtuvimos? En primera instancia, sabemos que la dirección base de los registros RCC se encuentra en 0x40021000, por lo que el registro en el que estamos interesados para activar el reloj del puerto C se encuentra con un offset de 0x18 bytes de esa dirección base. Además obtenemos la información del bit y el valor que debemos colocar para activarlo.
Lo siguiente que vamos añadir a nuestro main.c es una referencia a la ubicación de este registros
Técnicamente ya estaríamos preparados para activar el reloj para el puerto C con la siguiente instrucción
Siguiendo el mismo procedimiento, añadimos los registros que se encargan de configurar el puerto C
En GPIOC_CRL y GPIOC_CRH se configuran la función de cada uno de los pines. En la tarjeta de desarrollo tenemos un LED en el pin 13 del puerto C, por lo que lo tenemos que configurar como salida pp (push pull) escribiendo 0b0011 en el registro correspondiente
El registro GPIOC_BSRR y GPIOC_BRR es usando para setear o reasetear cualquiera de los pines del puerto
Colocando todo junto tenemos el siguiente código (no se preocupen por el código extra en la próxima entrega lo explicaré)
Lo que resta es crear el liker script y el Makefile para compilar nuestro proyecto
Linker Script (stm32_minimal.ld)
Makefile
Después de crear estos archivos en una terminal, localizados en nuestro proyecto ejecutamos
Si todo ha ido bien, lo que veremos a la salida es
Si no hubo error, conectamos nuestra tarjeta al programador st-link, lo conectamos a la PC y ejecutamos
Con lo que debemos ver nuestro LED parpadear.
En la siguiente entrega explicaré como usar el debugger (OpenOCD) con nuestro programa de ejemplo.