Blink LEDs like a pro

Die Präsentation des Vortrags ist hier zu finden. Am 14. Oktober 2019 hat Rafael uns gezeigt wie man LEDs zum blinken bringt mit einem Mikrocontroller - nicht ganz, denn dies kann man auf verschiedensten Wegen bewerkstelligen.

Er hat uns fünf Wege gezeigt, die eine LED zum blinken bringen. Der Erste ist sehr einfach und braucht auch keinen Code, nur eine Verbindung zwischen dem Mikrocontroller und einem Debugger. In diesem wird die Kontrollwert der LED per Hand umgeschaltet. Dies bringt sie zum blinken.

Andererseits kann man ein Programm schreiben, welches durch eine Endlosschleife läuft, die erst die LED anschaltet, wartet, ausschaltet und wieder wartet und danach wieder von vorne anfängt. Das Warten wird in diesem Fall einfach durch eine lange For-Schleife bewerkstelligt. Notiz: GPIOC_MODER ist ein virtueller Zeiger auf den Kontrollwert der LED.

/* Crude delay function */
void delay(uint32_t count) {
    for (int i = 0; i < count; i++) {
        __asm__("nop");
    }
}

int main() {
    /* Initialize APB2 (Advanced Peripheral Bus 2) */
    *RCC_APB2ENR = 0x10;
    /* Set GPIO port C pin 13 as output */
    *GPIOC_MODER |= 0x200000;

    /* Set and Reset Output Data Register of PC13 */
    while (1) {
        *GPIOC_ODR = 0x2000;
        delay(200000);
        *GPIOC_ODR = 0x0;
        delay(200000);
    }
}

Dies sieht nicht nach einem guten C-Programm aus, weil es sich vor allem sehr nahe an der Hardware orientiert. Rafael hat uns somit die HAL (Hardware Abstraktionsebene) vorgestellt, damit unser C-Code besser aussehen kann. Das nächste Program besteht aus einer leeren Endlosschleife, die nichts tut, damit das Program nicht terminiert. Davor wird ein Timer erstellt der periodisch einen Interupt aufruft. Dieser schaltet den Kontrollwert der LED um, was sie zum blinken bringt.

Diese Lösung benutzt immer noch den CPU. Diesmal besteht das Programm wiedereinmal aus einer leeren Endschleife. Kurz davor wird der DMA (Direct Memory Access) angewiesen, ein Feld, das aus 1 und 0 besteht, periodisch auf den Kontrollwert der LED zu schreiben, was die LED effektiv zum blinken bringt - wieder einmal.

Das letzte Programm hat einfache Mikrocontrolleranweisung benutzt. Man könnte auch RTOS (Real-time Betriebssystem) benutzen und ein typisches Softwareprogramm schreiben, welches die LED zum blinken bringt.