Forum: Mikrocontroller und Digitale Elektronik STM32 Watchdog; kein Reset


von tse (Gast)


Lesenswert?

Hallo,
Ich habe Probleme mit dem WWDG des STM32F...
Er generiert  mir keinen Reset des Controllers!

Hier die INIT:
1
void WWDG_init(void)
2
{ 
3
  u32 *temp=((u32 * )0xE0042004);  //WWDG-Debug Mode Stop  DBGMCU_CR register
4
  *temp|= 0x00000200;        //WWDG-Debug Mode Stop
5
  
6
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE);
7
8
  NVIC_InitTypeDef NVIC_InitStructure;
9
  NVIC_InitStructure.NVIC_IRQChannel =WWDG_IRQChannel;
10
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
11
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
12
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
13
  NVIC_Init(&NVIC_InitStructure);  
14
15
  /* On Value line devices, WWDG clock counter = (PCLK1 (24MHz)/4096)/8 = 732 Hz (~1366 æs)  */
16
  /* On other devices, WWDG clock counter = (PCLK1(36MHz)/4096)/8 = 1099 Hz (~910 æs)  */
17
  WWDG_SetPrescaler(WWDG_Prescaler_8);
18
  
19
  /* Set Window value to 65 */
20
  WWDG_SetWindowValue(65);
21
  
22
  /* On Value line devices, Enable WWDG and set counter value to 127, WWDG timeout = ~1366 æs * 64 = 87.42 ms */
23
  /* On other devices, Enable WWDG and set counter value to 127, WWDG timeout = ~910 æs * 64 = 58.25 ms */
24
  WWDG_Enable(127);
25
  
26
  /* Clear EWI flag */
27
  WWDG_ClearFlag();
28
  
29
  /* Enable EW interrupt */
30
  WWDG_EnableIT();
31
 }

und der early wakeup interrupt:
1
void WWDG_IRQHandler(void)
2
{
3
  /* Update WWDG counter */
4
  //WWDG_SetCounter(0x7F);
5
  
6
  /* Clear EWI flag */
7
  WWDG_ClearFlag();  
8
}

Um einen Reset zu provozieren wird der WWDG nicht neu gesetzt.
Als Ergebniss Zählt der Counter runter bis 0x00 und bleibt dort stehen 
ohne bei 0x3F einen Reset zu generieren.

Ich habe den Controller auch schon mal in einem Systick interrupt in 
eine while(1) Schleife geschickt so das der WWDG nicht neu gesetzt 
werden konnte
Dann Springt er zwar nicht mehr in den WWDG-Interrupt jedoch wird der 
Counter dennoch mit 0xff neu gesetzt(evtl Überlauf?)

Ich hoffe ihr könnt mir weiterhelfen
mfg
TSE

von Hannes S. (Gast)


Lesenswert?

Ich glaube mich daran zu erinnern, dass der Reset nur ausgelöst wird, 
wenn man den Interrupt nicht aktiviert hat - also einfach 
WWDG_EnableIT(); weglassen, dann sollte es gehen.
Gruß,
Hannes

von tse (Gast)


Lesenswert?

Hallo Hannes,
Auskommentieren des NVIC-Teils und der WWDG_EnableIT() Zeilen hat keine 
Änderungen gebracht.

von Hannes S. (Gast)


Lesenswert?

Ich erinnere mich daran, dass ich mich damals auch etwas gewundert habe, 
ich weiss aber nicht mehr was es war. Im meinem aktuellen Code verwende 
ich den IWDG und der löst definitiv einen Reset aus. Hier der Init:

  RCC_LSICmd(ENABLE);
  IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);
  IWDG_SetPrescaler(IWDG_Prescaler_16);
  IWDG_SetReload(0xfff);
  IWDG_WriteAccessCmd(IWDG_WriteAccess_Disable);
  IWDG_Enable();

Ich weiss, das ist jetzt nicht die Antwort auf Deine Frage aber 
möglicherweise eine Lösung für Dein Problem...

Gruß,
Hannes

von tse (Gast)


Lesenswert?

Danke für den Code, ich werd damit etwas spielen.

Der fehlende Interrupt würd mich trozdem interesieren ...
Hat den schon mal jemand zum laufen bekommen?

Gruß
TSE

von Hannes S. (Gast)


Lesenswert?

Den WWDG hatte ich nach dem anfänglichen Gezicke schon zum laufen 
bekommen. Der Wechsel zum IWDG hatte bei mir lediglich den Grund, dass 
ich den DeepSleep Mode verwenden wollte.

Was mein Problem damals war, das würde ich Dir gerne sagen, ich weiss es 
leider nur nicht mehr und zuviel hat sich seitdem geändert - habe auch 
jetzt mal schnell Deinen Code in mein Project gepastet und der tut auch 
jetzt weider auf anhieb.

Dann bleibt mal wieder nur, die üblichen verdächtigen zu untersuchen: 
Alle notwendigen Clocks aktiv? Bug in der Lib? (ich verwende hier die 
V3.3.0)...

Gruß,
Hannes

von tse (Gast)


Lesenswert?

der Clock wird in der WWDG_init initialisert der APB1 clock sollte auch 
laufen. Ich denke auch nicht das es am Clock liegt sonnst dürfte er ja 
gar nichts machen.
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE);


Hm als lib wird mir V1.0 angezeigt obwohl ich den installer für den 
Performance Stick erst letzte woche von der Seite gezogen hab 
"Kopfkratz"

Ich werd mal versuchen die neue LIB einzubinden

von tse (Gast)


Lesenswert?

Die Libs sind komplett unterschiedlich.

teilweise fehlen Files
teilweise sind Sachen wo anders defined
teilweise sind die Files anders benannt
alle Variablen sind anders defined

von Hannes S. (Gast)


Lesenswert?

Vielleicht ist es erstmal besser zu schauen, ob denn die Bits in der 
Hardware richtig gesetzt sind. Der WWDG hat ja nicht so viele Register 
und eigentlich ist nur eines wirklich wichtig: In WWDG_CR muss das WDGA 
(BIT7) gesetzt sein. Dies sollte durch WWDG_Enable() geschehen sein...

von TSE (Gast)


Angehängte Dateien:

Lesenswert?

Hier mal ein Screen der Register nach der WWDG init

von Hannes S. (Gast)


Lesenswert?

Was mir auffällt: Eigentlich sollte WWDG_SetWindowValue(65); die Window 
Value auf 65 (0x41) setzen, im Screenshot steht aber 1 drin...

Andrerseits sollte der Reset unabhängig davon immer ausgelöst werden, 
wenn der Counter runterzählt und BIT6 gelöscht wird. Und das kann man 
auch provozieren, indem man das Register direkt beschreibt: WWDG->CR = 
0x80;

So. Und nun habe ich auch keine Ideen mehr...

von TSE (Gast)


Lesenswert?

Hallo,

Hab gerade nochmal die Ini durchgestept.
Bei SetWindowValue(65); wird der Wert auf 1 im Register geladen
Hab nun diese Funktion genau mit der neuen Lib funktion verglichen und 
in der Zeile:

tmpreg |= WindowValue & (u32)ENABLE;// BIT_Mask;
einen Fehler gefunden:
tmpreg |= WindowValue & (u32)BIT_Mask;// BIT_Mask; (neue Lib)

ENABLE ist als 0x01
BIT_Mask als 0x7F defeniert

Ich tippe mal darauf das noch weitere Fehler in dem File sind und werde 
am Montag mal jede Funktion genauer ansehen.
Danke für deine Hilfe Hannes

MFG
TSE


Die Moral von der Geschicht:
Traue keiner Lib die du nicht selbst gefälscht... äh geschrieben hast

von TSE (Gast)


Lesenswert?

Hallo,

Ich habe auf die neueste Lib umgestellt jetzt arbeitet der WWDG wie er 
soll.

TSE

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.