Forum: Mikrocontroller und Digitale Elektronik STM32F0 WWDG fehlerhaft?


von Tom W. (nericoh)


Lesenswert?

Hallo zusammen,

ich beiße mir gerade an der Inbetriebnahme des System window watchdog 
(WWDG) eines STM32F0 die Zähne aus: sobald ich den WD aktiviere (Bit7 im 
CR-Register setze), generiert der WD mir einen Reset - auch dann, wenn 
ich unmittelbar vorher T[6:0] im CR Register mit 0x7F beschreibe.

Hat jemand Ähnliches beobachtet und weiß Rat?

Gruß,
Tom

Beitrag "STM32F4 Watchdog"
-> der TO hatte möglicherweise das gleiche Problem, hat aber nie wieder 
in dem Thread geantwortet...

Hier mein Code dazu:
1
void WDint_onInit(void)
2
{
3
  /* enable clk for WWDG */
4
  RCC->APB1ENR |= RCC_APB1ENR_WWDGEN;
5
6
  /* divide PCLK by 8 */
7
  WWDG->CFR |=  (WWDG_CFR_WDGTB0 | WWDG_CFR_WDGTB1);
8
9
  /* enable early wakeup IR */
10
  WWDG->CFR |=  (WWDG_CFR_EWI);
11
12
  /* clear early wakeup interrupt flag */
13
  WWDG->SR  &= ~WWDG_SR_EWIF;
14
15
  /* set Counter value for WWDF -> setting all bits results in cycletime of xx ms */
16
    WWDG->CR |= ( WWDG_CR_T6 | WWDG_CR_T5 | WWDG_CR_T4 | WWDG_CR_T3 | WWDG_CR_T2 | WWDG_CR_T1 | WWDG_CR_T0);
17
18
  __asm("nop"); //nur fuer den Breakpoint
19
20
  /* enable WD */
21
  WWDG->CR |= WWDG_CR_WDGA;
22
23
  __asm("nop"); //nur fuer den Breakpoint; wird nie erreicht :(
24
}

von Tom W. (nericoh)


Lesenswert?

Zusatzinfo: auffällig ist, dass ich beim ersten Brakepoint (unmittelbar 
nach Beschreiben des CR-Registers) in CT->T[6:0] kein 0x7F, sondern 
immer unterschiedliche Werte (in einem Versuch 0x39, in einem weiteren 
0x34, 0x2b, 0x6c, 0x7b, 0x48, ...) beobachte

von Oliver R. (2a17)


Lesenswert?

Ich habe bei einem STM32F030K6 scheinbar das gleiche verhalten...hast Du 
mittlerweile was herausgefunden?

von Paul (Gast)


Lesenswert?

Dein Wert für das high limit in CFR ist 0, d.h. du bist beim enablen des 
WWDG automatisch außerhalb des erlaubten Bereichs und es gibt einen 
Reset. Probier mal 0x7f als high Limit und 0x7e als Wert für CR.

von Tom W. (nericoh)


Lesenswert?

Danke an Paul für den Hinweis!

Vllt hilft das Oliver auch weiter? Habe es noch nicht (wieder) 
ausprobiert, da ich damals dann auf den Independent Watchdog (IWDG) 
ausgewichen bin...

von Tom W. (nericoh)


Lesenswert?

Offenbar verstehe ich die Funktion der Bits 0-6 im CFR nicht richtig: 
nach meinem Verständnis bedeutet ein Wert von 0, dass ich den WD 
jederzeit refreshen darf - die "Window"-Funktion also faktisch nicht 
aktiv ist. So verstehe ich Figure 206 des Reference Manual. 
Interpretiere ich das falsch?

von Tom W. (nericoh)


Lesenswert?

Hm, habe das wohl genau falsch herum gelesen: refresh ist nur erlaubt, 
wenn der Counterwert kleiner ist als der im von W[6:0] im CFR. W[6:0] = 
0 bedeutet (genau wie von Paul dargestellt), dass ich nie refreshen 
darf...

von Tom W. (nericoh)


Lesenswert?

Ans Laufen bekomme ich den WD so leider auch nicht...

in den paar Zeilen vom Aktivieren des APB1-Clocks für den WD bis zu 
meinem ersten nop zählt der Counter von 0x7f auf 0x3f (manchmal auch 
0x3b, 0x33, 0x36, ...) runter.

Wirkt auf mich vollkommen undeterministisch und unplausibel. Ich gebs 
vorerst auf und arbeite mit dem IWDG weiter.

Falls jemand den WWDG im STM32F0... mal erfolgreich benutzt hat, möge er 
sich melden - ich wäre zumindest dran interessiert, wo mein Fehler lag. 
Kann ich mit meinen Takteinstellungen irgendwas derartig vergeigt haben, 
dass ich hier so ein seltsames Verhalten beobachte?

von Paul (Gast)


Lesenswert?

Das ist schon richtig so: "This downcounter is free-running: It counts 
down even if the watchdog is disabled."

Der WWDG läuft also auch wenn nicht WDGA gesetzt. Nur macht er dann 
keinen Reset.

von Tom W. (nericoh)


Lesenswert?

Dass er prinzipiell dann schon runterläuft ist mir bewusst - dass er 
aber innerhalb weniger Codezeilen um soviele Takte runterzählt, finde 
ich unplausibel:

diese 4 Codezeilen müssten ja ziemlich viele CPU-Zyklen zur Abarbeitung 
benötigen, damit der WD-Counter (der aus einem langsameren Takt, der 
zudem noch um 8 heruntergeteilt wird, gespeist wird) um 64 (von 0x7f auf 
0x3f) dekrementiert wird.

Wobei ich gerade net genau präsent habe, welcher Takt den WD treibt und 
wie der sich zum CPU-Takt verhält. Werde ich Montag nochmal 
nachvollziehen...

Selbst wenn es plausibel wäre, dass der WD-Counter während der 
Abarbeitung von 4 Codezeilen soweit runterläuft, hieße das ja, dass der 
WD faktisch unbrauchbar ist, da er alle paar Codezeilen retriggert 
werden müsste, um den uC nicht zu reseten! Ich strebe ein "Füttern" des 
WDs alle paar (d.h. irgendwas zwischen 1 und ~25) ms an und kann mir 
gerade schwer vorstellen, dass ein interner WD sinnvoll einsetzbar ist, 
der innerhalb weniger us neu gefüttert werden muss - oder fehlt mir da 
gerade schlicht die Fantasie für eine sinnvolle Anwendung?

von Paul (Gast)


Lesenswert?

Bei 8MHz PCLK und AHB/APB prescaler jeweils 1 ist der WWDG-Takt maximal 
~2kHz, minimal 244Hz. Das Fenster ist bei minimalem Takt bis zu 262ms 
gross. Je nachdem welchen Takt du für die APB-peripherals maximal 
brauchst, kannst du den WWDG-Takt per AHB/APB-prescaler noch weiter 
verringern.

von Oliver R. (2a17)


Lesenswert?

Ich bin nun auch auf den IWDG ausgewichen, da ich den WWDG auch mit 0x7f 
als Limit und 0x7e als Counter auch nicht läuft.
Ich habe die gleiche Initialisierung auf einem STM32F4xx (laut Reference 
Manual technisch gleich) problemlos laufen und vermute deshalb ein 
Hardwarefehler. Bei ST oder im Netz habe ich dazu jedoch noch nichts 
gefunden.

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.