Hallo Welt





Ein traditionelles "Hallo Welt"-Programm für Mikrocontroller ist eine blinkende Leuchtdiode. Mit dieser Tradition wird auch hier nicht gebrochen.
Verbinden sie wie im Schaltbild links den Programmer mit dem Mikrocontroller, evtl. auch auf einem Steckbrett.
Starten sie Geany (wahlweise auf der Konsole auch CIDE) und laden sie dort das Programm blink.c im Ordner blink. Drücken sie die Taste F8 oder klicken wahlweise auf das Icon zum Compilieren eines Programms. Nach Beendigung des Compiler- Linkergangs betätigen sie die Taste F9 oder wahlweise ein Klicken auf das Icon zum Flashen.

Die LED sollte nun blinken !

Viel Spaß beim Ausprobieren der anderen Beispielprogramme und beim Experimentieren mit CH32V003



    Die Sache mit dem Makefile    



Auf diesen Seiten wurde bereits hingewiesen, dass beim Erstellen von Programmen das sogenannte Makefile Verwendung findet. Hier soll jetzt hinsichtlich einer Programmerstellung für CH32V003 erläutert werden, wie die aus dem Archiv entpackten Programme mit einem Makefile zu einem lauffähigen Binary compiliert und geflasht werden.
Grundsätzlich gibt es zu jedem einzelnen Projekt ein eigenes Makefile. Makefiles können so geschrieben sein, dass sie zusätzlich zum Aufruf mittels make ein weiteres Argument beinhalten können. Im hier vorliegenden Fall kann ein Makefile folgendermaßen aufgerufen werden:
  • make

  • make all

  • make / make all (beide Aufrufe bewirken dasselbe) compiliert alle zu einem Programm gehörenden Quelldateien und linkt diese zu einem Programm mit dem Format .elf, .hex und .bin zusammen, welches hier ein auf einem CH32V003 lauffähiges Programm darstellt. Je nach Programmer wird einer dieser Dateien benötigt um damit einen CH32V003 flashen zu können. Der Selbstbauprogrammer verwendet das .bin Format

  • make flash

  • make flash programmiert einen Controller mit einem mit make zuvor erstellen .bin Programme

  • make clean

  • make clean löscht alle die Dateien, die mit make / make all erstellt werden. Das ist vor allen Dingen dann hilfreich, wenn eine Datei die nicht die Main-Funktion des Programms beinhaltet bearbeitet worden ist. Durch das Löschen aller Dateien wird sicher gestellt, dass bei einem Compiler- / Linkvorgang die editierte Quelldatei ebenfalls neu übersetzt wird.

Hinweis: make ist ein im Linux vorhandenes Programm das bei Aufruf die Angaben, die in Makefile gemacht werden auswertet und ausführt.

Da die Syntax eines Makefile sich bisweilen (zumindest für den Autor) sehr kryptisch anmutet und er bisweilen auch nachlesen muß wie genau etwas funktioniert, wurde das Makefile "aufgetrennt". Im Makefile selbst, welches in jedem Projektordner liegen muß das compiliert werden soll, müssen nur Angaben über den Projektnamen, zusätzlich zu verwendenden Quelldateien und den zu verwendenden Programmer gemacht werden (die zu machenden Angaben hier sind sehr überschaubar). Dieses Makefile bindet (inkludiert) eine Datei makefile.mk im übergeordneten Verzeichnis (das Stammverzeichnis CH32V003) ein. Jedes Projekt inkludiert diese Datei, deshalb sollte diese Datei, wenn überhaupt, nur mit sehr großer Vorsicht bearbeitet werden. makefile.mk stellt hier den funktionalen Teil des Compilierens dar und erstellt CH32V003 Programme für ein System mit 48 MHz interner Taktfrequenz und schaltet mit Systemstart alle GPIO Anschlüsse ein.

Für ein neues Projekt ist es eine gute Idee, einen neuen Ordner anzulegen und das Makefile aus einem bestehenden Projekt in diesen neuen Ordner zu kopieren und dann entsprechend dem neuen Projekt zu bearbeiten.



    Aufbau eines Makefile für CH32V003 an einem Beispiel    



Am Beispiel für das Programm uart_demo (im gleichnahmigen Verzeichnis) soll ein Makefileaufbau erläutert werden:
      ############################################################
      #
      #                         Makefile
      #
      ############################################################
      
      PROJECT       = uart_demo
      
      # hier alle zusaetzlichen Softwaremodule angegeben
      SRC           = ../src/uart.c
      SRC          += ../src/my_printf.c
      SRC          += ../src/term_colpos.c
      
      INC_DIR       = -I ./ -I ../include
      
      # Programmerauswahl
      # fuer USE_ARDULINK = 1 wird der Arduinoprogrammer verwendet, in diesem
      #                       Fall muss zusaetzlich der serielle Port angegeben werden
      # fuer USE_ARDULINK = 0 wird WCH-LINKE verwendet wird die
      #                       serielle Portangabe hier ignoriert
      
      PROGPORT      = /dev/ttyUSB0
      USE_ARDULINK  = 0
      
      include ../ch32v003.mk            
                  

Ein Makefile arbeitet ähnlich einer Programmiersprache mit Variablen / Konstanten (der Autor weiß nicht, ob dieses die korrekte Bezeichnung ist aber glaubt, dass das verständlich ausgedrückt ist).

In diesem "Benutzerteil" des Makefile gibt es Variable, die von der später inkludierten Datei ../ch32v003.mk ausgewertet werden. Diese sind:
  • PROJECT
  • SRC
  • INC_DIR
  • PROGPORT
  • USE_ARDULINK
Für PROJECT ist der Name der Datei OHNE die Erweiterung .c anzugeben, die die Main-Funktion des Programms beinhaltet. Von daher ist es also vorgegeben, dass diese Datei zwingend auf dem Datenträger mit der Namensendung .c gespeichert vorliegen muß. Hier wird also das Programm uart_demo.c compiliert und gelinkt werden.

Mit SRC werden alle zusätzlichen Quelldateien angegeben, die übersetzt und in das Programm mit eingebunden werden sollen. Eine erste einzubindende Datei wird nur mit einem "=" Zeichen zugewiesen, jede weitere einzubindende Datei mit "+=".

Im vorliegenden Fall werden also im übergeordneten Verzeichnis und dort im Verzeichnis src die Dateien uart.c, my_printf.c und term_colpos.c mit eingebunden. Die Angaben der Dateinamen sind MIT der Dateinamensendung .c anzugeben.

Hier ist jetzt zu erkennen, dass im übergeordneten Verzeichnis ein Verzeichnis src existiert, in dem alle zusätzlich vorhandenen Quelldateien gespeichert sind.

Mit INC_DIR wird der Suchpfad angegeben, nachdem der Compiler einzubindende Dateien, meistens Header, suchen soll. Im vorliegenden Beispiel sucht der Compiler also zuerst in dem Projektverzeichnis ( -I ./ ) nach der Datei, wird er dort nicht fündig, sucht er im übergeordneten Verzeichnis und dort im Verzeichnis include ( -I ../include). Wird der Compiler im Projektverzeichnis fündig, wird eine eventuell im ../include Ordner ignoriert. Das Speichern eines Headers im Projektordner macht dann Sinn, wenn bspw. GPIO-Pins, die Hardware steuern und nur für dieses eine Projekt gelten sollen.

USE_ARDULINK gibt an, welcher Programmer bei einem Flash-Vorgang zu verwenden ist. Mit der Benutzung des Selbstbauprogrammers oder eines originalen WCH-LinkE ist hier der Wert 0 anzugeben. Eine 1 gibt an, dass der Arduino basierende Programmer (der zum Flashen des Selbstbauprogrammers benötigt wurde) zu verwenden ist. In aller Regel wird man diesen ARDULINK jedoch nicht verwenden, sobald eben ein deutlich besserer Programmer vorliegt.

PROGPORT gibt an, welcher Anschluss verwendet werden soll, sollte der Arduino-Programmer zum Einsatz kommen. Ist in USE_ARDULINK der Wert 0 angegeben hat die Angabe in PROGPORT keinerlei Wirkung.