systick.h / systick.c    



CH32V003 besitzt einen sogenannten Systemticker. Im Prinzip ist dieses ein Timerinterrupt, der ein Programm periodisch unterbricht um den Programmteil im Interrupthandler auszuführen. Im hier vorliegenden Fall hat systick eine einzige Funktion, die vom Benutzer aufrufbar ist:

            systick_init    

           Prototyp: void systick_init(void);
Durch den Aufruf von systick_init wird der Systemticker so initialisiert, dass der Interrupthandler hierfür jede Millisekunde aufgerufen wird. Innerhalb dieses Interrupthandlers werden Varbiablen durch den Systemticker gezählt, auf die der Benutzer, da global, innerhalb seines Programms Zugriff hat. Diese sind:

           volatile uint32_t systick_millis;
           volatile uint32_t system_zsec;
           volatile uint32_t system_halfsec;
           volatile uint32_t system_sec;

Während die Variablen system_millis (jede Millisekunde) und system_sec (jede Sekunde) bis zu einem Überlauf hochgezählt werden (was im Falle von system_sec nie passieren wird, denn 232 Sekunden sind über 130 Jahre) zählt die Variable system_halfsec alle 1/10 Sekunde periodisch nur von 0 bis 9. system_halfsec toggelt im Halbsekundentakt zwischen 1 und 0 hin und her:
  
        #include "ch32fun.h"
        #include "ch32v003_gpio.h"
        #include "systick.h"
        
        #define led_init()               PD4_output_init()
        #define led_set()                PD4_set()
        #define led_clr()                PD4_clr()
        
        
        int main(void)
        {
          SystemInit();
        
          led_init();
          systick_init();
        
          while(1)
          {
            if (system_halfsec) { led_set(); }
                           else { led_clr(); }
          }
        }