Watchdog STM32F4Discovery

Gast #3959081
Hallo, kann mir jemand erklären wie man den Prescaler und den Reload 
Wert beim STM32F4Discovery berechnet um einen "Interrupt" des Watchdogs 
nach 15ms auszulösen?
Die Formel die in den Examples steht versteh ich nicht.
Dort wird das so erklärt:
1
/* IWDG timeout equal to 250 ms (the timeout may varies due to LSI frequency
2
     dispersion) */
3
/* IWDG counter clock: LSI/32 */
4
  IWDG_SetPrescaler(IWDG_Prescaler_32);
5

6
  /* Set counter reload value to obtain 250ms IWDG TimeOut.
7
     IWDG counter clock Frequency = LsiFreq/32
8
     Counter Reload Value = 250ms/IWDG counter clock period
9
                          = 0.25s / (32/LsiFreq)
10
                          = LsiFreq/(32 * 4)
11
                          = LsiFreq/128
12
   */   
13
  IWDG_SetReload(uwLsiFreq/128);
Bin gerade sehr ratlos, für Hilfe bin ich dankbar!
#3959323
Als erstes nimmst du dir das RM0090, aktuell Rev 8, zur Hand:
http://www.st.com/st-web-ui/static/active/en/resource/technical/document/reference_manual/DM00031020.pdf

Dort findest du auf Seite 695 neben dem Blockdiagramm des IWDG eine 
nette Tabelle, aus der hervorgeht, dass selbst mit einem Vorteiler-Wert 
von 32 ein Watchdog-Timeout zwischen 1...4096ms eingestellt werden kann 
(Reload-Register 12bit => 0...4095).

Zurück zum von dir genannten Beispiel:
1. der Prescaler wurde auf 32 gesetzt (im Beispiel könntest du ihn auch 
auf jeden anderen zulässigen Wert setzen, da 250ms sich in allen 
Wertebereichen wiederfindet)

2. der Reload-Wert ergibt sich dann wie im Kommentar beschrieben und man 
muss natürlich wissen, dass die LSI-Freq (Low Speed Internal) durchaus 
Bauteil-abhängig ist und beim STM32F405/7 z.B. zwischen 17...47kHz 
liegt:

Zuerst nochmal den 250ms-Wert:

IWDG-f = LsiFreq/Prescaler
Reload Value = 250ms/(IWDG counter clock period)
             = 250ms * IWDG-f
Wenn man hier IWDG-f durch die erste Gleichung ersetzt, kommst du auf 
dasselbe Ergebnis, eben auf
             = 250ms * LsiFreq/32 (Achtung: ms! 32/0.25=128) also:
             = LsiFreq/128

Die Programmzeile lautet demnach:
             IWDG_SetReload(uwLsiFreq/128);

Jetzt deine 15ms:

der Einfachheit kann der Vorteiler auf 32 bleiben, dann ergibt sich der 
Reload-Wert zu:

IWDG-f = LsiFreq/Prescaler
Reload Value = 15ms/(IWDG counter clock period)
             = 15ms * IWDG-f
Wenn man hier IWDG-f durch die erste Gleichung ersetzt, kommst du auf
             = 15ms * LsiFreq/32 (Achtung: wieder ms! 32/0.015=2133.3) 
also:
             = LsiFreq/2133

Die Programmzeile lautet also:
             IWDG_SetReload(uwLsiFreq/2133);

Jetzt musst du dich nur noch damit beschäftigen, wie du mit der 
Abweichung von 2.3 Mikrosekunden klarkommst, die der IWDG später 
zuschlägt.

Theoretisch.

Praktisch schaust du dir das Scheunentor der LSI-Frequenz im Datenblatt 
an...

Alle Klarheiten beseitigt?

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 11 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.