Digi-Dot-Booster am STM32 Nucleo Board mit mbed

Nach erfolgreichen Versuchen mit dem Digi-Dot-Booster am Raspberry Pi, habe ich mich nach weiteren Plattformen umgeschaut, die mit wenig Aufwand zu schnellen Ergebnissen führen würden. Nach kurzem Durchwühlen der Bastelkiste kam ein STM32 Nucleo Board zum Vorschein. Das interessante bei diesem Board ist, dass es bereits für die ARM mbed Plattform vorbereitet ist. Die Webseite stellt einen Online Code Editor mit C/C++ Compiler  inklusive zahlreicher Bibliotheken für den Zugriff auf die Schnittstellen zur Verfügung – optimal für einen schnellen Test ohne eine komplette Entwicklungsumgebung aufsetzen zu müssen. Also kam das Board aus der Kiste auf den Arbeitstisch zum Experimentieren…

UPDATE: Inzwischen habe ich eine eigenständige DD-Booster Bibliothek für mbed erstellt, welche die Befehle in einfachen Funktionen kapselt.

Ich habe hier das Nucleo F303RE Board für die Anleitung verwendet, es sollte aber grundsätzlich auch mit anderen Plattformen mit mbed Unterstützung funktionieren. Der Programmcode kann im Prinzip in jedem aktuellen Browser auf jedem Betriebssystem geschrieben werden. Nach dem Kompilieren wird das Binary einfach zum Download angeboten – die Datei legt man dann auf dem Wechsellaufwerk ab, welches nach dem Anschluss des Nucleo Boards am Rechner erscheint. Das Board erkennt die neue Datei, der Flash wird damit automatisch programmiert und das Programm dann ausgeführt.

Angeschlossen wird der DD-Booster an die Arduino Pins. Erfreulicherweise sind diese direkt auf der Platine beschriftet, beim DD Booster ist ein Blick in die Dokumentation notwendig (Beschriftung auf dem Board würde dem BB-Booster auch gut tun. Update: laut Folker kommt die Beschriftung auch).

STM32 Nucle + DD-Booster

Für die Nutzung des Online Compilers ist die kostenlose Registrierung erforderlich. Nachdem das erledigt ist, kann man sich dort anmelden und bekommt einen leeren Codeeditor zu sehen.

Leerer Code Editor

Leerer Code Editor

Bevor man mit dem Programmieren anfangen kann, muss eine Plattform ausgewählt werden. Das geht über die Schaltfläche „No device selected“ rechts oben.

Eigene ausgewählte Plattformen

Eigene ausgewählte Plattformen

Nach der Erstanmeldung wird die Liste zuerst leer sein, später werden dort alle eigenen mbed Plattformen erscheinen, zwischen den man einfach umschalten kann. Zuerst soll das Nucleo Board hinzugefügt werden. Dazu klickt man auf den Button „Add Platform“ unten links. Man wird daraufhin auf die Seite mit den unterstützten Boards weitergeleitet.

 

Die Liste der Boards mit mbed Unterstützung ist recht groß.

Die Liste der Boards mit mbed Unterstützung ist recht groß. STM32 Nucleo Boards sind auch dabei.

Nach der Auswahl des Boards kommt man zunächst auf die Seite des Boards mit umfangreichen Informationen und Hinweisen.

Mit dem Klick auf den Button „Add to your mbed Compiler“ wird diese Plattform zu der Liste hinzugefügt. Übrigens: falls man später eine Plattform aus der eigenen Liste entfernen möchte, muss man das ebenfalls über diese Seite tun und nicht im Compiler selbst.

Zurück im Compiler wird direkt ein neues Projekt erzeugt und zur Auswahl werden unterschiedliche Templates angeboten. Wir fangen mit einem leeren Projekt („Empty Program“) an und vergeben einen aussagekräftigen Namen für das Projekt.

Test

Neu hinzugefügte Plattform wird für das erste Projekt verwendet.

Wir legen nun eine neue Datei über den Rechtsklick auf den Projektordner im Workspace auf der linken Seite an.

Das leere Projekt enthält wie erwartet keine Dateien.

Das leere Projekt enthält wie erwartet keine Dateien.

Die Datei bekommt ebenfalls einen Namen – `rainbow.cpp` in diesem Fall.

Screen Shot 2016-02-27 at 00.08.12Für der Regenbogen habe ich diesen Code geschrieben, der direkt im Editor eingefügt werden kann. Der Code ist an die bisherigen Beispiele angelehnt mit dem Unterschied, dass die ChipSelect Leitung nun manuell getriggert werden muss.

#include "mbed.h"

SPI device(SPI_MOSI, SPI_MISO, SPI_SCK);
DigitalOut cs(SPI_CS);

#define LEDS 30

void initSPI()
{
    cs = 1;
    device.format(8,0);
    device.frequency(10000000);
}

void initLEDs()
{
    cs = 0;
    device.write(0xB1);
    device.write(LEDS);
    device.write(24);
    cs = 1;
    wait_ms(40);
}

int main()
{
    uint16_t i = 0;
    initSPI();
    initLEDs();
    while(1) {
        i += 5;
        i = i % 360;
        cs = 0;
        device.write(0xA7);
        device.write(i & 0xFF);
        device.write(i >> 8);
        device.write(255);
        device.write(100);
        device.write(0);
        device.write(LEDS - 1);
        device.write(10);
        device.write(0xB2);
        cs = 1;
        wait_ms(40);
    }
}
Obligatorisches Rainbow Beispiel.

Obligatorisches Rainbow Beispiel.

Beim Click auf „Compilieren“ bekommt man einen Fehler. Der Grund ist klar – es wird eine Header Datei `mbed.h` importiert, weil wir die Funktionen der mbed Bibliothek für den Zugriff auf die SPI Schnittstelle verwenden wollen, im Projekt ist jedoch nicht definiert, wo diese zu suchen ist. Praktischerweise gibt es neben der Fehlermeldung den „Fix it“ Button.

Es fehlt noch etwas...

Es fehlt noch etwas…

Beim Klick darauf, versucht die Entwicklungsumgebung die fehlende Bibliothek selbst zu finden – mit Erfolg wie man sieht.

Die richtige mbed Bibliothek wird gefunden.

Die richtige mbed Bibliothek wird gefunden.

Der erste Treffer ist der richtige – auswählen und mit OK bestätigen. Daraufhin erscheint eine Referenz im Projekt darauf und das Kompilieren geht nun ohne Probleme. Die Datei speichert man direkt auf dem vom Nucleo Board im System erstellten Wechseldatenträger ab.

Erfolgreich kompiliert und zum Download angeboten.

Erfolgreich kompiliert und zum Download angeboten.

Das war’s! Das Nucleo Board übernimmt das Programm, macht einen kurzen Reset und lässt die LEDs in Regenbogen-Farben leuchten.

FAZIT: Mit dem „mbed Compiler“ kann man ebenfalls recht schnell Erfolge haben. Man kann dabei nicht nur auf die offizielle mbed Bibliothek zugreifen, sondern auf viele andere, die aus der mbed Community kommen. Der Nachteil ist der fehlende Debugger – möchte man Schritt für Schritt den Code analysieren und die Werte der Variablen prüfen, muss man auf die lokale Entwicklungsumgebung umsteigen.

Schreibe einen Kommentar