Die STM32F10x Prozessor-Serie hat einen eingebauten Watchdog-Timer, die bei einem Programmfehler den Prozessor wieder auf den "Boden" zurückholen kann. Wie funktioniert das jetzt ? Hierzu gibts eine eigene Clock von 40kHz die als Basisclock verwendet wird - unabhängig von der Quarzbeschaltung. Man muss nur den Frequenzteiler mit IWDG_SetPrescaler programmieren und den Zählerwert ab wann er denn den Prozessor resettet. Sobald der Zählerwert erreicht ist, wird ein Reset ausgelöst.

Dies kann man verhindern indem man einfach den Call IWDG_ReloadCounter(); innerhalb der IWDG-Zeit aufruft.

#include "stm32f10x_iwdg.h" um die passenden defines zu haben

/* Watchdog Test - Base frequency 40kHz */
    IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);
    IWDG_SetPrescaler(IWDG_Prescaler_256);
    IWDG_SetReload(3000);    // should be about 1/256s * 3000 should be about 20s

//Calculate the frequency in s : wd-time =  1 / (40kHz/prescaler) * reload value
    IWDG_ReloadCounter();
    IWDG_Enable();

while(1)
    {
        blink_yellow();                        // let the main program do something
        delay_ms(1000);
        IWDG_ReloadCounter();// and call the wdg
    }

Das wars. Den call IWDG_ReloadCounter(); muss man geschickt in der Hauptschleife des Programms unterbringen wo es eine Chance gibt dass sich ein Prozess etc. aufhängen könnte. Sinnvoll ist dies bei embedded Applikationen die nicht stehenbleiben dürfen z.B. Alarmanlage ;-). Es gibt übrigens auch eine Window Watchdog Funktion die einen Analogwert überwacht. Auch sehr nützlich.