Quelldateien für den CH32V003




Um den CH32V003 programmieren zu können sind dem Archiv (download hier) einige Sourcedateien beigefügt, die ein Kennenlernen deutlich erleichtern, diese werden hier beschrieben. Die wichtigste Quelldatei besteht hierbei lediglich aus einem Header:

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


    ch32v003_gpio.h    



Der Autor ist ein großer Freund davon, Hardwaredeklarationen und -definitionen in einem Main-Programm zu "verstecken", damit die Funktion eines Hauptprogramms klarer und strukturiert bleibt. Eine der wichtigsten Funktionen im Umgang mit Mikrocontrollern ist die Möglichkeit, frei programmierbare Anschlußpins, die als sogenannte GPIO (general purpose input output) bezeichnet werden, schalten zu können. Je komplexer ein Mikrocontroller ist, umso größer sind in aller Regel Funktionsaufrufe diesen zum Einen zu initialisieren und zum Anderen einen solchen Pin anzusprechen um ihn ein bzw. aus zu schalten. Aus diesem Grund existiert für den CH32V003 (und beim Autor für jeden anderen Mikrocontroller auch) eine Headerdatei, die einen GPIO einheitlich ansprechen kann und hier alle verfügbaren GPIO's nach dem gleichen Schema funktionieren. Für das Initialisieren eines GPIO's existieren Makros für die wichtigsten Betriebsarten:
  • GPIO als Ausgang (es kann vom Programm aus ein Pin gesetzt bzw. gelöscht werden)

  • GPIO als Eingang mit eingeschaltetem PopUp- / PopDownwiderstand (intern im Chip geschaltetem Widerstand gegen +Vdd oder GND)

  • GPIO als Eingang ohne eingeschaltetem PopUp- / PopDownwiderstand (dieser Zustand wird auch als "float" bezeichnet, ist aber nicht zu verwechseln mit dem Variablentyp float)

Für das Ansprechen eines GPIO's sind Makros verfügbar für:
  • das Setzen eines GPIO-Pins auf logisch 1

  • das Löschen / reseten eines GPIO-Pins auf logisch 0

  • das Einlesen des digitalen logischen Pegels, der an einem GPIO anliegt.

Für jeden einzelnen GPIO-Pin die der CH32V003 besitzt, wurden Makros deklariert, die alle demselben Schema folgen.


Schemata für die GPIO Anschlüsse
  • pinbezeichnung_output_init();
  • pinbezeichnung_set();
  • pinbezeichnung_clr();

  • pinbezeichnung_input_init();
  • pinbezeichnung_float_init();
  • is_pinbezeichnung();
Hierbei ist "pinbezeichnung" durch den Anschlußnamen des Pin's in Großschreibweise zu ersetzen. Soll bspw. der Portpin PD4 als Ausgang benutzt werden, so kann dieser mit
               PD4_output_init();
als Ausgang initialisiert werden.

               PC3_input_init();
initialisiert den Anschluss PC3 als einen Eingang mit angeschlossenem internen PullUp- oder PullDown-Widerstand.


Beispielprogramm für die Benutzung von GPIO's
  
          #include "ch32fun.h"
          #include "ch32v003_gpio.h"
          
          
          #define led_init()               PD4_output_init()
          #define led_set()                PD4_set()
          #define led_clr()                PD4_clr()
          
          #define key_init()               PC4_input_init()
          #define key_pullup()             PC4_set()
          #define is_key()                 (is_PC4())
          
          
          int main(void)
          {
            SystemInit();
          
            led_init();
            key_pullup();
            key_init();
          
            while(1)
            {
              if (is_key()) { led_set(); }
                       else { led_clr(); }
            }
          }               
               
In diesem Beispielprogramm wird angenommen, dass an PD4 eine Leuchtdiode gegen GND und ein Taster ebenfalls gegen GND geschaltet ist. Das Makro key_pullup() schaltet durch das Setzen des Portpins bei Funktion als Eingang einen internen PullUp-Widerstand gegen +Vdd. Hierdurch wird beim Lesen des Tastenpins an PC4 bei einem unbetätigten Taster eine logische 1 zurück geliefert und die LED leuchtet bei unbetätigtem Taster (bei betätigtem Taster wird eine 0 zurück geliefert und die LED ist aus).

Wollte man, dass die LED bei betätigtem Taster leuchtet, müßte die Deklaration für is_key lauten (man beachte die Invertierung durch das "!"):
               #define is_key()                 (!is_PC4())