Forum: Mikrocontroller und Digitale Elektronik STM32 Probleme mit Watchdog


von Mehmet K. (mkmk)


Angehängte Dateien:

Lesenswert?

Das Problem habe ich in der Zwischenzeit "gelöst"; indem ich es 
umschifft habe. Habe aber nicht die geringste Ahnung, was da nicht 
koscher ist.

In medias res: Die Software laeuft seit mehreren Tagen stabil. Keinerlei 
Haenger und dergleichen.
Also Zeit den Watchdog zu aktivieren.
Erstes Aha-Erlebnis: beim STM32 gibts 2 davon.
Ich entscheide mich für den WWDG. Ein Blick auf das ST-Beispielprogramm, 
ein Blick ins Manual: alles ganz einfach.
24 Stunden spaeter: "Dann halt den IWDG; was soll's".
Wieder ein Blick auf das ST-Beispielprogramm, wieder ein Blick ins 
Manual: alles ganz einfach!

Weitere 24 Stunden spater steh ich nun hier. Fassungslos mich am Kopf 
kratzend.

Meine Vorgendsweise ist die:
TIM2 / CH4 tiggert alle 100ms.
Damit steuere ich eine CTRL-LED.
Dorthin habe ich auch IWDG_ReloadCounter() gesetzt.

Wenn ich nun gleich oder auch ein paar Zeilen unterhalb IWDG_init() 
einen Breakpoint setze und dann weiterfahre, funktioniert alles wie es 
soll.
Ohne den Breakpoint resetet sich das Miststück fortlaufend.
1
TIM2_init();
2
:
3
weitere inits ...
4
:
5
:
6
IWDG_init();  // 300ms timeout
7
TIM2_start(); 
8
:
9
:
Nach Stunden des TryAndError fand ich heraus, dass wenn ich diese 
Reihenfolge waehle, sich alles in Wohlwollen auflöst.
1
:
2
IWDG_init();  
3
TIM2_init();
4
TIM2_start(); 
5
:

Ich vermute, dass ich bei der Initialisierung des TIM2 etwas falsch 
mache. Aber anderseits: vieles in der Software basiert auf TIM2. Wenn da 
was falsch waere, haette ich das das sicher bememerkt.

(Da die Codes für TIM2 mehr als ein paar Zeilen sind, lege ich diese als 
Attachment bei.)

1
//=============================
2
// IWDG_init
3
//=============================
4
void IWDG_init(void)
5
{  
6
  IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);
7
  IWDG_SetPrescaler(IWDG_Prescaler_32);
8
  IWDG_SetReload(375); 
9
  IWDG_ReloadCounter(); 
10
  //IWDG_WriteAccessCmd(IWDG_WriteAccess_Disable);
11
12
  IWDG_Enable();
13
  while((IWDG->SR & IWDG_FLAG_RVU) != (uint32_t)RESET);
14
  DBGMCU_Config(DBGMCU_IWDG_STOP, ENABLE);
15
}

Dank im voraus!

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.