04 febrero 2018

Programando la STM32 LoRa Discovery Board con OpenOCD

¡Hola a todos!

Comenzamos el 2018 comprando algunas tarjetas electrónicas nuevas para poder experimentar y hacer proyectos en el Hackerspace San Salvador. Durante el 2017 nos enfocamos mucho en proyectos que utilizan el estándar IEEE 802.15.4 para conectividad inalámbrica al Internet de las Cosas.

Explorando otros protocolos decidimos que sería interesante trabajar un poco más con LoRa y LoRaWAN así que adquirimos la tarjeta B-L072Z-LRWAN1 para poder tener una plataforma de desarrollo que combinara un microcontrolador + un radio LoRa para comenzar a "jugar".

Lástimosamente aunque la tableta resultó muy prometedora nos desencantó un poco el entorno de desarrollo. En esta entrada de blog voy a explicar las cosas buenas y malas de esta tableta de desarrollo y voy a explicar rápidamente como lograrla hacer funcionar con la herramienta de depuración OpenOCD que les permitirá programarla como consideren más conveniente.

¡Comencemos!


Conociendo a la B-L072Z-LRWAN1


La razón por la que elegimos esta tarjeta es porque incluye incluye un microcontrolador de ST Microelectronics de la familia STM32. Por alguna extraña coincidencia nos hemos estado llenando de varios microcontroladores de esta familia. Actualmente la OpenMV que mostramos en nuestro video de Youtube y el control remoto del dron tienen microcontroladores de esa familia.

Algunas cosas que nos parecieron muy atractivas:
  • La tableta de desarrollo incluye el módulo LoRa de Murata CMWX1ZZABZ (Conocida como TypeABZ) que combina un microcontrolador STM32L + un radio LoRa.
  • Está basado en el microcontrolador STM32L072CZ. Este microcontrolador está basado en la tecnología ARM-Cortex M0+ con 192Kbytes de memoria Flash y 20Kbytes de SRAM que corre a 33MHz.
  • El radio SX1276 puede trabajar entre las frecuencias de los 868 hasta los 925Mhz.
  • Integra un depurador ST-Link V2.1 como parte de la tableta por lo que podemos "fácilmente" re-programar el chip y correr nuestros programass paso a paso.
  • Es compatible con el factor de forma para shields de Arduino UNO por lo que podemos re-utilizar componentes para esta plataforma.
Hasta aquí parece una tarjeta electrónica super-genial... ¿O no?

Luego vino el desencanto...


Realmente la tarjeta nos pareció muy prometedora y una de las primeras cosas que intentamos hacer fue re-programarla para acostumbrarnos al pequeño STM32L que se incluye en la tarjeta y "sorpresa"... La tarjeta no era detectada por el programador oficial de ST Microelectronics STM32-Cubeprog.

De aquí en adelante voy a listar los problemas que nos encontramos para intentar programar la tarjeta electrónica que relamente nos desencantaron un poco.

¿Dónde está el manual?

Fe de errores: En la versión original de este artículo hacíamos referencia a los problemas para acceder info sobre la tarjeta de desarrollo y en efecto era un error de nuestro lado al no leer adecuadamente el manual y encontrarnos con buscando en la página erronea de soporte cuando la información que buscámos estaba justo ahí frente a nuestras narices. Dejo el texto original "tachado" ya que no es válido. En cambio dejo los vínculos a documentos interesantes para el desarrollo.
Una de las cosas que a pesar de lo anterior no nos termina de gustar es que la mayoría de ejemplos y código disponibles son para la plataforma ARM MBED. Si bien todo el entorno de desarollo resulta interesante, la realidad es que uno queda atado a utilizar la infraestructura de ARM MBED Cloud para todo. El otro problema con ARM MBED es que basa su funcionamiento en un core propietario que si bien tiene una API accesible, podría difucultar su integradción con soluciones full open-source.

Así que despues de perder tanto tiempo en tratar de obtener un simple y sencillo manual con la referencia de conexiones en la tarjeta simplemente decidimos en el Hackerspace San Salvador que no queríamos tener la bendición de Murata y nos iríamos por el liberador camino Free-Open-Source.

Liberando la tarjeta con OpenOCD

Nota: Asumimos que tienen OpenOCD instalado. Si no es así pueden instalarlo ahora mismo.

Si queríamos tener esta tarjeta libre para nuestro uso debíamos de poder re-programarla así que la opción terminó siendo OpenOCD. Afortunadamente, OpenOCD tiene soporte tanto para la serie de Microcontroladores STM32L0 como para el depurador ST Link V2.1.

¿Recuerdan que al inicio les comenté que la herramienta oficial no reconocía el microcontrolador de la tableta de desarrollo? Pues mismo les pasará con OpenOCD.

En el siguiente procedimiento nos conectaremos a la tarjeta de desarrollo, haremos un backup de la imagen de flash por si queremos restaurarla a su estado original y adicionalmente borraremos la memoria de la misma para dejarla lista para la programación.

Procedimiento:
  • Con la tarjeta desconectada coloquen un jumper entre nRST y GND.
  • Inicien OpenOCD con el siguiente comando:
openocd -f /usr/share/openocd/scripts/interface/stlink-v2-1.cfg -f /usr/share/openocd/scripts/target/stm32l0.cfg
Nota: Si los scripts de configuración de OpenOCD no se encuentran en /usr/share/openocd intenten cambiar por la carpeta /usr/local/share/openocd. Revisen la documentación de su distribución para encontrar la ubicación de los scripts de OpenOCD.
  • Si todo sale bien deberá de mostrarles un mensaje como el siguiente: "Info : stm32l0.cpu: hardware has 4 breakpoints, 2 watchpoints".
  • Dejamos a OpenOCD corriendo y abrimos una nueva terminal donde ejecutamos el siguiente comando para acceder a la consola de OpenOCD:
telnet localhost 4444
  • Desde la terminal escribimos el siguiente comando siguiente para poder detener el microcontrolador:
reset halt
  • En este momento podemos remover el jumper de nuestra tableta. Luego escribimos el comando siguiente para hacer un backup de la flash:
image_dump backup.bin 0x08000000 0x30000

Nota: El comando guardará la imagen de la memoria Flash que está almacenada en la dirección de memoria 0x08000000 y extraerá un total de 192KiB (0x3000).
  • Es bueno verificar que la imagen guardada coincide antes de borrar la flash de nuestro microcontrolador. Esto lo hacemos con el siguiente comando:
verify_image backup.bin 0x08000000
  • Por último borramos la memoria para dejar nuestra tarjeta lista para utilizar con el siguiente comando:
flash erase_sector 0 0 last
  • Opcional: Si por alguna razón deseamos restaurar la imagen original podemos utilizar el comando:
flash write_image backup.bin


La próxima vez que reiniciemos nuestra tableta será detectada tanto por OpenOCD como por el programador oficial STM32-Cubeprog.

Encendiendo las BlinkenLights


Creo que hasta este punto vale la pena correr algún programa de ejemplo completamente libre de las ataduras de las políticas de Murata y Compañía.

Nota: Asumo que tienen en su distribución linux instaladas las herramientas de desarrollo y la GNU Arm Embedded Toolchain.

Para celebrar la liberación de la tableta tenemos un pequeño ejemplo listo para compilar que puedes obtener con el siguiente procedimiento:
  • Descarga el ejemplo y actualiza las dependencias.
git clone https://github.com/hackerspacesv/lora-stm32
cd lora-stm32
git submodule update
  • Es necesario compilar la biblioteca de libopencm3 antes de continuar. Esto lo hacemos con el siguiente comando dentro del directorio de proyecto (lora-stm32):
cd libopencm3
make
  • Salimos al directorio principal y compilamos el ejemplo de miniblink:
cd ../
cd miniblink
make 


  • Si no hemos iniciado OpenOCD podemos hacerlo ahora:
openocd -f /usr/share/openocd/scripts/interface/stlink-v2-1.cfg -f /usr/share/openocd/scripts/target/stm32l0.cfg

  • Iniciamos GDB y nos conectamos a OpenOCD
arm-none-eabi-gdb miniblink.elf
target remote 127.0.0.1:3333
monitor reset halt

  • Ahora podemos cargar nuestro programa compilado a nuestra tarjeta con los siguientes comandos:

load
monitor reset halt
continue 

  • Si todo sale bien, deberíamos de poder ver nuestro LED marcado como LD1 parpadeándo en este momento. 
Puedes utilizar ese ejemplo de base para controlar la tarjeta de ahora en adelante. Recuerda revisar la documentación de libopencm3.

Habilitando el modo DFU en la tableta de desarrollo

Existe una segunda forma de cargar programas y es la interfaz DFU. Afortunadamente el STM32L072 soporta esta interfaz vía USB. Para habilitarla sin embargo debemos de hacer un pequeño cambio en nuestra PCB.
  • Busca los jumpers de soldadura de SB15 y SB16. Estos deberían estar ubicados cerca del logo de ST Microelectronics. Una vez los identifiques coloca un punto de soldadura para cada jumper.
  • Para arrancar en modo DFU debes colocar un cable jumper entre el pin BOOT0 y 3V3.

  • Importante: Asegúrate de que la tarjeta está alimentada tanto por el USB de depuración como el USB de usuario, ya que la tarjeta no se alimenta del USB de usuario.

  • Cuando conectes la tableta la computadora deberá de mostrar el nuevo dispositivo con la interfaz DFU de ST Microelectronics.

¿Qué sigue?

Ya que aún no tenemos el diagrama de conexión tenemos que dedicar un par de días a documentar las diferentes conexiones del módulo. Luego hay que explorar si existe alguna implementación de LoRaWAN Open-Source que podamos utilizar sin tanto problema. Caso contrario tendremos que escribir alguna implementación de MAC que nos permita usar estos radios.

Actualmente el MKR1300 de Arduino incluyen un módulo muy similar pero es controlado a través de comandos AT. Esto significa que siempre dependemos de una implementación de terceros y no podemos aprovechar directamente el microcontrolador incluido en la tableta.

Lo que queremos lograr es poder utilizar directamente el microcontrolador incluido en el módulo para no depender de implementaciones y también para reducir costos de implementación.

Así que sin más que decir por el momento. ¡Hasta la próxima!

Links de utilidad

3 comentarios:

Gonzalo Fernández Trastoy dijo...

Hola Mario, yo también estoy muy interesado en este modulo de Murata. Pero mi idea es integrarlo en un diseño propio y no utilizar la placa de desarrollo B-L072Z-LRWAN1. Al igual que tu, no me interesa la plataforma mBed y quiero código C que pueda unir al resto de mis funcionalidades. De momento estoy con una versión primaria y uso un modulo de Lora chino que controlo por UART, pines para cambiar el modo (transmisión, recepción, bajo consumo y configuración) y un pin de interrupción que te avisa cuando recibes un mensaje en bajo consumo). Pero mas adelante quiero abaratar costes usando el modulo de Murata.

En esta pagina están los drivers y ejemplos en C para esta placa:
http://www.st.com/en/embedded-software/i-cube-lrwan.html
Puedes extraer de aquí el código que necesites y adaptalo a tus proyectos.
Tambien puedes usar unos drivers para el chip sx1276 genéricos y añadirlos al codigo para el MCU STM32L072. Aqui el link:
https://github.com/Lora-net/LoRaMac-node/tree/master/src/radio

Si prefieres código en C++, aquí hay un proyecto para esta y otras placas:
https://os.mbed.com/users/Helmut64/code/SX1276GenericLib/
Esta en la plataforma mBed pero se supone que el codigo es adaptable a otras

Aquí tienes un datasheet para el modulo CMWX1ZZABZ:
https://d3s5r33r268y59.cloudfront.net/datasheets/9465/2017-04-18-03-35-57/typeABZ_datasheet.pdf

Espero que te sirva de ayuda, si quieres ponerte en contacto conmigo te dejo mi correo:
gonfertra@gmail.com

Un saludo y espero ver que tal te va con esta placa ;)

Mario Gómez dijo...

¡Hola Gonzalo!

Como mencionaba en el artículo del blog queremos alejarnos de MBED como la peste. Realmente la plataforma suena prometedora, pero nos topamos con que 1ro. depende de un "core" cerrado que la gente de ARM ha venido prometiendo que lo va a abrir pero nunca lo hace y 2do. casi que si queres hacer soluciones IoT tus datos tienen que pasar por la plataforma de MBED.

Ambas cosas atentan contra las libertades del usuario. Es decir, si tenes una plataforma que depende de terceros para funcionar... ¿Mejor compras un módulo ya hecho solo para conectar no?

Al final lo que estamos haciendo es usar el código de STM32Cube con los ejemplos de WAN y solo hemos hecho algunas pequeñas modificaciones para utilizarlos en la banda libre aquí en El Salvador. Puedes encontrar la copia del código en nuestro repo: https://github.com/hackerspacesv/STM32CubeExpansion_LRWAN_V1.1.4

También nos dedicamos a probar el alcance con IEEE 802.15.4 y radios amplificados. Por si quieres curiosear como nos fue en la prueba aquí te dejo el enlace: http://fuenteabierta.teubi.co/2018/04/transmitiendo-datos-con-lora-e-ieee.html

El siguiente paso en agenda es modificar los ejemplos del STM32Cube para levantar un gateway LoRa. Te mantengo informado de cómo nos va :)

¡Saludos!
Mario.

Gonzalo Fernández Trastoy dijo...

Hola Mario, algún avance en el diagrama de conexiones del módulo? Creo que yo también me voy a decidir a comprar 2 kits para ir adelantando trabajo e ir haciendo pruebas. En mi proyecto no voy a usar el protocol LoRaWAN, ya que creare una red privada con comunicación punto a punto (actuando uno como maestro que inicializará todas las comunicaciones). Voy a implementar una modificación del protocolo modbus con enrutado (para en un futuro poner repetifores) y una encriptacion basada en AES en modo CTR. Así que de primeras me basaré en el ejemplo Ping-Pong de STM32Cube LRWAN.