Desde el concurso de MakeWithAda, del cuál os hablé en la otra entrada, nos enviaron una placa de desarrollo (STM32F4DISCOVERY). Esta placa de desarrollo contiene un procesador ARM-M4 de 32 bits con módulo de coma flotante. En nuestro proyecto, la vamos a usar para leer los datos del módulo ECG y ejecutar la red neuronal, todo ello corriendo en un STM32 y programado en Ada.

PLaca de desarrollo STM32F4DISC

Placa de desarrollo STM32F4DISC

Software necesario

Para poder empezar a jugar con la placa necesitamos instalar el software para poder compilar el código en Ada y flashear la placa de desarrollo. Para ello vamos a necesitar instalar y configurar varios programas:

  • Python 2.7 (Es muy importante que sea la versión 2.7) Necesitamos que esté instalada y configurada en el PATH.
  • STLINK-V2 (Descarga) Será el encargado de comunicar nuestro entorno de desarrollo con la placa.
  • GPS y ARM-ELF (Descarga) Es importante descargar los dos enlaces. En función del sistema operativo en el que estéis, os aparecerá la versión correcta.
    Enlaces de GPS y ARM-ELF

    Enlaces de GPS y ARM-ELF

  • Git (Descarga) El conocidísimo control de versiones, necesario para instalar las librerías de Ada que se encargan de hablar con el hardware.

Una vez tenemos todo instalado, tenemos que confirmar que tenemos el arm-elf y python accesible desde la consola. Para saber si los tenemos basta con ejecutar los siguientes comandos:

1
2
3
4
5
6
7
8
9
$ python --version
Python 2.7.13

$ arm-eabi-ar --version
GNU ar (GNU Binutils) 2.28.51.20170529
Copyright (C) 2017 Free Software Foundation, Inc.
This program is free software; you may redistribute it under the terms of
the GNU General Public License version 3 or (at your option) any later version.
This program has absolutely no warranty.

Si en alguno de los comando aparece que no encuentra el programa especificado, habría que añadir la carpeta correspondiente al PATH de tu sistema operativo.

Con esto ya instalado, nos tocaría instalar las librerías para trabajar con el hardware físico. Estas librerías están disponibles en Github. Para instalarlas vamos a hacer uso de Git y con un par de comandos las tendremos listas.

1
2
3
4
$ cd directorio_donde_queremos_guardarlas
$ git clone --recursive https://github.com/AdaCore/Ada_Drivers_Library.git
$ cd Ada_Drivers_Library
$ python ./scripts/install_dependencies.py

Hello Leds

Ahora vamos a compilar, flashear y ejecutar alguno de los ejemplos que vienen con la librería. Los ejemplos están dentro de la carpeta 'Ada_drivers_Library/examples/STM32F4_DISCO". En nuestro caso vamos a abrir el proyecto “blinky_f4disco.gpr” y hacemos click en Build->Bareboard->Flash to Board. Si todo ha ido bien, nos compilará el proyecto y lo enviará a la placa. Al pulsar el botón reset (Cuando haya terminado de flashear) los LEDs deberían empezar a parpadear.

Si al intentar flashear nos aparece el error: Could not locate executable on path: openocd es porque el proyecto se nos ha autoconfigurado al openocd.
Para arreglarlo hay que ir a: Projecto -> Embedded -> Connection Tool -> st-util

Empezando un proyecto nuestro

Con la prueba anterior comprobamos que todo lo necesario para compilar y flashear el STM32 está instalado. Sin embargo, ahora nos interesa empezar nuestro proyecto. Para ello solo nos tenemos que copiar uno de los ejemplos a una carpeta nuestra, por ejemplo de Ada_Drivers_Library\examples\STM32F4_DISCO\accelerometer a nuestra carpeta del proyecto Documentos/ProyectoAda. Borramos todo el código (dejamos el main.adb) que hay dentro de la subcarpeta src y luego tenemos que cambiar el nombre del proyecto. Esto se consigue cambiando el nombre del fichero .gpr y editandolo. En nuestro ejemplo cambiariamos de accelerometer.gpr a miproyecto.gpr y editaríamos el fichero para cambiar el nombre del proyecto (líneas remarcadas):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
with "C:/GNAT/Ada_Drivers_Library/boards/stm32f407_discovery/stm32f407_discovery_full.gpr";

project miproyecto extends "C:/GNAT/Ada_Drivers_Library/examples/shared/common/common.gpr" is

  for Runtime ("Ada") use STM32F407_Discovery_Full'Runtime ("Ada");
  for Target use "arm-eabi";
  for Main use ("main.adb");
  for Languages use ("Ada");
  for Source_Dirs use ("src");
  for Object_Dir use "obj";
  for Create_Missing_Dirs use "True";
   
  package Linker is
     for Default_Switches ("Ada") use ("-Wl,--print-memory-usage");
  end Linker;

  package Compiler renames STM32F407_Discovery_Full.Compiler;


end miproyecto;

Ahora ya solo nos queda escribir el código en el fichero src/main.adb, compilarlo y flashearlo en el STM32 para ver que funciona. Como ejemplo os pongo un pequeño main que parpadea todos los LEDs de la placa cada 2 segundos.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
with STM32.Board;   use STM32.Board;
with Ada.Real_Time; use Ada.Real_Time;

procedure Main is
   Next_execution: Ada.Real_Time.Time;
   Period: constant Ada.Real_Time.Time_Span:= Ada.Real_Time.To_Time_Span(2.0); -- 2secs
begin
   Initialize_LEDs;
   Next_execution:= Ada.Real_Time.Clock + Period;
   All_LEDs_Off;
   loop
      Toggle_LEDs(All_LEDs);
      delay until Next_execution;
      Next_execution:= clock + Period;      
   end loop;
   
end Main;

Gluón

Teleco con ganas de aprender más y compartirlo. Viajero empedernido y amante de la fotografía y la tecnología. Espero dejar mi granito de arena y que este pueda servir de ayuda.