mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik STM32 Watchdog; kein Reset


Autor: tse (Gast)
Datum:

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

Hier die INIT:
void WWDG_init(void)
{ 
  u32 *temp=((u32 * )0xE0042004);  //WWDG-Debug Mode Stop  DBGMCU_CR register
  *temp|= 0x00000200;        //WWDG-Debug Mode Stop
  
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE);

  NVIC_InitTypeDef NVIC_InitStructure;
  NVIC_InitStructure.NVIC_IRQChannel =WWDG_IRQChannel;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);  

  /* On Value line devices, WWDG clock counter = (PCLK1 (24MHz)/4096)/8 = 732 Hz (~1366 æs)  */
  /* On other devices, WWDG clock counter = (PCLK1(36MHz)/4096)/8 = 1099 Hz (~910 æs)  */
  WWDG_SetPrescaler(WWDG_Prescaler_8);
  
  /* Set Window value to 65 */
  WWDG_SetWindowValue(65);
  
  /* On Value line devices, Enable WWDG and set counter value to 127, WWDG timeout = ~1366 æs * 64 = 87.42 ms */
  /* On other devices, Enable WWDG and set counter value to 127, WWDG timeout = ~910 æs * 64 = 58.25 ms */
  WWDG_Enable(127);
  
  /* Clear EWI flag */
  WWDG_ClearFlag();
  
  /* Enable EW interrupt */
  WWDG_EnableIT();
 }

und der early wakeup interrupt:
void WWDG_IRQHandler(void)
{
  /* Update WWDG counter */
  //WWDG_SetCounter(0x7F);
  
  /* Clear EWI flag */
  WWDG_ClearFlag();  
}

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

Autor: Hannes S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: tse (Gast)
Datum:

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

Autor: Hannes S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: tse (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Hannes S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: tse (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: tse (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Hannes S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: TSE (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hier mal ein Screen der Register nach der WWDG init

Autor: Hannes S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: TSE (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: TSE (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

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

TSE

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.