STM32 Watchdog; kein Reset

Gast #1765933
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
Gast #1766022
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
Gast #1766286
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
Gast #1766304
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
Gast #1766666
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...
Gast #1767774
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...
Gast #1767859
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren