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!