Dienstag, Februar 18, 2020

Deaktivieren der STM32-IWDG beim Debuggen

Ich habe eine ChibiOS 3.x-Programm auf einem STM32F4 microcontroller, wo ich den IWDG watchdog-reset der MCU auf Fehler wie diese:

int main() {
    iwdgInit();
    iwdgStart(&IWDGD, &wd_cfg);
    while(true) {
        //... do stuff
    }
}

Wenn ich jetzt anfügen, mein debugger und an jeder Stelle, beenden Sie das Programm (manuell oder über einen Haltepunkt), der microcontroller wird zurückgesetzt, nachdem der timeout definiert durch die watchdog-Konfiguration (und damit zu Problemen in meinem debugging-Prozess)

Wie kann ich dieses Verhalten deaktivieren, d.h. wie kann ich deaktivieren Sie die IWDG, während der Kern angehalten wird, aufgrund der debugger?

Ich habe versucht, das deaktivieren es ganz, allerdings muss ich laufen lassen um zu fangen unerwünschte IWDG setzt.

  • Der IWDG ist standardmäßig deaktiviert, so dass Sie nur können, lassen Sie es deaktiviert, bis Sie beginnen testen der endgültige code. Wenn Sie wollen, zu tun, tutorials für die STM, Sie sind viel besser auf die STM32 wiki. Stack overflow ist eine Q&A, nicht ein tutorial site.
  • a) sicher Sein, dass meine tutorials ganz anders Aussehen als diese. Dies ist eine konkrete Frage mit einer konkreten Antwort, mit anderen Worten eine Q&A. Was STM32 wiki meinst du? b) Deine Vermutung ist falsch. Während in der frühen Entwicklung dieser funktionieren könnte, habe ich eine ganze Menge von usecases, in denen ich den IWDG zurücksetzen, wenn der WDG timer abläuft, z.B. um Daten zu gewinnen über die (fehl -) Verhalten unter hoher Last, Netzwerk-Aktivität (nicht der watchdog-reset inadvertedly?). Warten, bis die Produktion mit dieser wäre töricht. Auch die Antwort auf diese ist ziemlich wichtig für die Produktion testen.
  • Also, keine STM32 Frage gestellt werden muss, weil es alles in den docs? Ich denke nicht wirklich, dass dieses argument funktioniert. Wenn Sie denken, das ist eine Frage, die mit nicht genug Forschung, downvote und / oder Abstimmung zu schließen. Ich nehme an, Sie haben das schon getan. Während Sie das tun, ich werde mehr schreiben, Lösungen für tatsächliche Probleme, sorry…
  • Sollten Sie bereits ein Vorschlag, aber, wie fix die „nicht genug Forschung problem“, ohne Sie zu kopieren, die Antwort in die Frage, bin ich glücklich, es zu implementieren.
  • Ich hatte diese Frage vor 7 Monaten. Es war nicht wichtig genug, um zu Fragen überall auf das internet zu mir (ich könnte, aber ich Tat es nicht). Heute habe ich zufällig die Lösung gefunden. Ich habe nicht wirklich finden eine einfache Antwort, dass nirgendwo sonst-so dachte ich, ‚Ursache, die ich denke, es ist eine etwas wichtige Frage ist, dass ich, sollte es teilen. Wenn Sie wollen, nennen es ein tutorial, in Ordnung. Ziemlich das gleiche gilt für die anderen F&Wie Sie sprechen. Tut mir Leid, wenn Sie mögen es nicht, oder kann nicht wirklich nutzen es für Ihre Anwendungen. Andere Leute tun, die mich in diese Gruppe aufgenommen.
  • Obwohl ich glaube, Sie sind bereits bewusst, dass, bitte Lesen Sie blog.stackexchange.com/2011/07/… — es ist nicht nur erlaubt, sondern ermutigt zu schreiben, selbst-antwortete Q&As.

InformationsquelleAutor Uli Köhler | 2015-09-11

2 Kommentare

  1. 10

    Den STM32-MCUs enthalten eine Funktion namens debug-freeze. Sie stoppen können mehrere Peripheriegeräte, einschließlich der I2C-timeouts, die RTC und, natürlich, der watchdog.

    In der STM32 reference manual, siehe Abschnitt 38.16.4 ff.

    Den IWDG läuft auf dem bus APB1. Daher müssen Sie zum ändern DBGMCU_APB1_FZ, die meisten speziell die für die Geltendmachung der bit – DBG_IWDG_STOP in das register.

    Dem POR-Wert (= default-Wert) für dieses register ist 0 x 0, d.h. wenn Sie nicht aktiv deaktivieren Sie es, die IWDG wird immer noch ausgeführt werden.

    int main() {
        //Disable IWDG if core is halted
        DBGMCU->APB1FZ |= DBGMCU_APB1_FZ_DBG_IWDG_STOP;
        //Now we can enable the IWDG
        iwdgInit();
        iwdgStart(&IWDGD, &wd_cfg);
        //[...]
    }

    Beachten Sie, dass, wenn Sie nicht die Aktivierung der watchdog in software, es könnte noch aktiviert werden, in hardware, wenn die WDG_SW bit wird zurückgesetzt, in der flash-option bytes.

    Wenn Sie mit der ST HAL (nicht im Lieferumfang enthalten in ChibiOS, siehe STM32CubeF4), Sie können auch verwenden Sie dieses makro:

     __HAL_DBGMCU_FREEZE_IWDG()

    (was im Grunde genau das gleiche tut wie oben beschrieben)

    Außerdem müssen Sie aktivieren die DBGMCU Uhr auf APB2.

     __HAL_RCC_DBGMCU_CLK_ENABLE();
  2. 3

    Bei der Verwendung der ST HAL, das richtige makro zu verwenden ist:

    __HAL_DBGMCU_FREEZE_IWDG()
    • Guter Punkt, vielen Dank für das hinzufügen dieser. Die meisten der Zeit, ich glaube nicht, das HAL-zumindest für einfache Sachen, aber ich vermute, dass die meisten Menschen in der Regel verwenden die ST HAL, so könnte dies sehr hilfreich für Sie.
    • Funktioniert das auch deaktivieren IWDG vor dem Stopp-Modus ?
    • Keine IWDG kann nicht deaktiviert werden..

Kostenlose Online-Tests