Forum: Mikrocontroller und Digitale Elektronik ESP32 Watchdog


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Thomas M. (tom_holzwurm)


Lesenswert?

Hallo Kollegen,
nach etlichen erfolglosen Experimenten und eifrigen Suchens habe ich 
keine befriedigende Antwort auf die WDG Architektur des ESP32 gefunden.
Es gibt laut Beschreibung 2 WDG's: einmal für Interrupts und einmal für 
Tasks.
Aber anscheinend keinen WDG, der wie bei anderen µC einen echten HW 
Reset ausführt.
Ich habe auch schon versucht einen WDG mit Timern zu implementieren, was 
letztlich einen ESP32.reset() auslöst, aber das funktioniert auch nur 
bedingt.
Zum einen setzt die genannte Systemfunktion nicht alle 
Peripheriebaugruopen zurück und der ESP32 gerät z.B. durch Unterbrechung 
des WLAN's in einen Zustand, wo nur ein echter Reset hilft.
Man könnte natürlich einen externen Baustein dazu verwenden, aber es 
sollte doch eine Möglichkeit für einen echten WDG on Chip geben.
Frage: hab ich was übersehen, oder geht das tatsächlich nicht ?
Dake für Eure Hilfe,
Gruß Thomas

von Εrnst B. (ernst)


Lesenswert?

Thomas M. schrieb:
> Es gibt laut Beschreibung 2 WDG's: einmal für Interrupts und einmal für
> Tasks.

Laut 
https://docs.espressif.com/projects/esp-idf/en/stable/esp32/api-reference/system/wdts.html

gibt es zwei Hardware-Watchdogs, einer in der RTC, ein "Normaler".

Die sind durch die HAL und FreeRTOS abstrahiert, das was du als 
"Interrupt" und "Task"-Watchdog siehst, greift beides auf den MWDT_WDT 
zu.

Und der sollte eigentlich einen "echten" Reset ausführen.

von Thomas M. (tom_holzwurm)


Lesenswert?

OK, danke für den Tip, ich werde das gelegentlich testen und dann 
berichten.

von Alexander (alecxs)


Lesenswert?


von Thomas M. (tom_holzwurm)


Lesenswert?

Nee, das hilft leider nicht, weil es sich auch auf den Task WDT bezieht. 
Aber, ich habe das Problem gelöst:
Der Tip mit dem RTC WDT ist korrek t, weil dieses Modul löst entweder 
für die RTC oder(!) fürs System einen Reset aus. Und nur das macht einen 
echten Systemreset !
esp_restart() startedt nur die CPU neu, wenn die Peripherie abgeschmiert 
ist, in meinem Fall das WLAN Modul, ist der ESP32 trotzdem tot.
Die SW Lösung ist total easy, aber echt gut versteckt:
"https://github.com/espressif/esp-idf/blob/master/components/esp_hw_support/include/rtc_wdt.h"; 
das ist das Headerfile für den RTC_WDT ist die Lösung dokumentiert:
Sieht dann so aus:
// Initialisierung bei mir auf 10 sec. mit RTC_WDT_TIMEOUT
void WatchdogSetup(void){
    rtc_wdt_protect_off();
    rtc_wdt_disable();
    rtc_wdt_set_length_of_reset_signal(RTC_WDT_SYS_RESET_SIG, 
RTC_WDT_LENGTH_3_2us);
    rtc_wdt_set_stage(RTC_WDT_STAGE0, 
RTC_WDT_STAGE_ACTION_RESET_SYSTEM); //RTC_WDT_STAGE_ACTION_RESET_SYSTEM 
or RTC_WDT_STAGE_ACTION_RESET_RTC
    rtc_wdt_set_time(RTC_WDT_STAGE0, RTC_WDT_TIMEOUT);     // timeout 
rtd_wdt 7000ms.
    rtc_wdt_enable();
    rtc_wdt_protect_on();
#if(WDG_DEBUG >0)
    ESP_LOGI(TAG, "!!! ESP WDG INIT !!!!");
#endif
}
///////////////////////////////////////////////////////////
void WatchdogReset(void)
{
     rtc_wdt_feed();
}
wird periodisch bei mir von der NTP Uhr zyklisch aufgerufen.
Und das wars wohl, zumindest die Test waren bisher positiv, ich werde 
das Ganze erst auf einem Knoten eine Weil laufen lassen und dann überall 
ausrollen.
Danke nochmals für die Hilfe,
Gruß Thomas

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.