Forum: Mikrocontroller und Digitale Elektronik Watchdog STM32F4Discovery


von IWDG (Gast)


Lesenswert?

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!

von Pd G. (pdg)


Lesenswert?

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?

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.