Nachdem ich auf der Embedded World in Nürnberg dieses Jahr ein STM8 Nucleo board erhalten habe, habe ich mich mal wieder mit den STM8 von STmicroelectronic beschäftigt. Meine letzte Erfahrung mit den STM8 war beim Bau unserer Küchenarbeitslampe. Damals gab es noch nicht die Möglichkeit unter Linux zu debuggen, das Compilieren ging zwar mit dem SDCC, aber da ich unbedingt den Debugger brauchte, habe ich mich für das STM eigene Tool "STVD" und den Compiler von COSMIC entschieden. Ich habe es sogar geschafft den Compiler in einer Windows VM laufen zu lassen und von Ubuntu den Compilevorgang zu starten. Bei meiner jetzigen Recherche habe ich nun aber eine brauchbare Lösung gefunden mit der die Mikrocontroller unter Ubuntu debugbar sind.

Benötigt werden folgende Tools:

  • stm8-gdb
  • sdcc mit stm8 support
  • openocd mit stm8 support

stm8-gdb

GDB ist Teil der binutils. Bisher ist der stm8 Teil noch nicht in den offiziellen Entwicklungszweig aufgenommen worden, deshalb müssen wir uns den GDB selbst patchen und übersetzen. Die Hauptarbeit wurde uns schon abgenommen, denn es gibt auf sourceforge ein Script welches die Quellen herunterläd, patcht und baut.

stm8-binutils-gdb-sources-*.tar.gz herunterladen

chrimbo@helios:~/Downloads$ tar xvfz stm8-binutils-gdb-sources-*.tar.gz
chrimbo@helios:~/Downloads$ cd stm8-binutils-gdb-sources
chrimbo@helios:~/Downloads$ ./patch_binutils.sh
chrimbo@helios:~/Downloads$ ./configure_binutils.sh
chrimbo@helios:~/Downloads$ cd binutils-2.30
chrimbo@helios:~/Downloads$ make
chrimbo@helios:~/Downloads$ sudo make install

openocd

Die Version in den Paketquellen von Ubuntu 18.04 LTS wurde leider nicht mit STM8 support kompiliert, sodass wir auch dieses Programm selbst übersetzen müssen. Ich verwende hier die aktuellen Quellen aus dem git repository.

chrimbo@helios:~/Downloads$ git clone https://git.code.sf.net/p/openocd/code openocd
chrimbo@helios:~/Downloads$ cd openocd
chrimbo@helios:~/Downloads/openocd$ ./bootstrap
chrimbo@helios:~/Downloads/openocd$ ./configure
chrimbo@helios:~/Downloads/openocd$ make
chrimbo@helios:~/Downloads/openocd$ sudo make install 

sdcc

Die SDCC Version in den Quellen von Ubuntu hat den Support für den STM8 bereits, vermisst aber die Möglichkeit elf Dateien zu erstellen. Glücklicherweise muss der SDCC nicht selbst kompiliert werden, da auf sourceforge bereits übersetzte Programme vorliegen hier Das Archiv muss nur entpackt werden und nach /usr/local kopiert werden. cp -r * /usr/local

Demo übersetzen

Das Demo projekt kann hier heruntergeladen werden.

/* 
 * STM8 NUCLEO-8L152R8 blinking LED
 */
#include <stdint.h>
#include "stm8l.h"
void main(void)
{
    // Configure LED pin/port
    PB_DDR = 0x20;
    PB_CR1 = 0x20;
    while(1)
    {
        PB_ODR ^= 0x20;
        for(uint16_t i = 0; i < 30000; i++)
            ;
    }
}

übersetzen mit

sdcc -mstm8 blink.c --out-fmt-elf --all-callee-saves --debug --verbose --stack-auto --fverbose-asm --float-reent --no-peep

sollte (unter anderem) ein blink.elf (ggf. Dateinamen anpassen) erstellen.

Debugging starten

In einer Shell openocd starten

chrimbo@helios:~/Downloads/blink$ openocd -f interface/stlink.cfg -f target/stm8l.cfg -c "init" -c "reset halt"

und in einer weiteren gdb

chrimbo@helios:~/Downloads/blink$ stm8-gdb blink.elf

mit start kann das Programm auf den STM8 geladen werden. Es durchläuft dann die Initialisierung und setzt einen breakpoint auf die erste Zeile in main. Mit continue wird das Programm fortgesetzt. Die LED sollte nun blinken.

Previous Post