Forum: Mikrocontroller und Digitale Elektronik SAM4E Watchdog lässt sich nicht aktivieren


von Adam P. (adamap)


Lesenswert?

Hallo zusammen,

ich habe zwei Boards mit einem SAM4E
- Atmel SAM4E X-Plained
- Eigenes User-Board

Auf dem Atmel Board habe ich das Watchdog Beispiel aufgespielt und dort 
funktioniert alles.

Nun wollte ich auf meinem Board den Watchdog aktivieren, leider 
beschreibt er die Register überhaupt nicht - Habs mir Step für Step im 
Debug mode angeschaut.

Was könnte ich übersehen?

1
bool sys_wdt_init(void)
2
{
3
  uint32_t wdt_mode;
4
  uint32_t timeout_value;
5
6
  timeout_value = wdt_get_timeout_value(WDT_TIMEOUT * 1000, BOARD_FREQ_SLCK_XTAL);
7
8
  if (timeout_value == WDT_INVALID_ARGUMENT)
9
  {
10
    return false;
11
  }
12
13
  /* Konfiguration */
14
  wdt_mode =  WDT_MR_WDFIEN  |
15
        WDT_MR_WDRPROC  |  
16
        WDT_MR_WDDBGHLT |
17
        WDT_MR_WDIDLEHLT;
18
19
  wdt_init(WDT, wdt_mode, timeout_value, timeout_value);
20
21
  NVIC_DisableIRQ(WDT_IRQn);
22
  NVIC_ClearPendingIRQ(WDT_IRQn);
23
  NVIC_SetPriority(WDT_IRQn, 0);
24
  NVIC_EnableIRQ(WDT_IRQn);
25
26
  return true;
27
}

von Adam P. (adamap)


Lesenswert?

Nachtrag:

Laut Datenblatt werden die Register WDV (Counter Value) und WDD (Delta 
Value) beim System-Start (Reset) mit 0x0FFF geladen - bei mir passiert 
da ebenfalls nichts.

von Jim M. (turboj)


Lesenswert?

Adam P. schrieb:
> Nun wollte ich auf meinem Board den Watchdog aktivieren, leider
> beschreibt er die Register überhaupt nicht

Dann hat man meistens irgendein Bit im Clock Tree vergessen und der WDT 
Block bekommt kein Taktsignal.

von Adam P. (adamap)


Angehängte Dateien:

Lesenswert?

Also das "Problem" habe ich nun gefunden - verstehen tu ich es jedoch 
nicht.

Mein Bootloader hat den WDT deaktiviert, bzw. im Bsp. wäre es in der 
board_init():
1
#ifndef CONF_BOARD_KEEP_WATCHDOG_AT_INIT
2
    /* Disable the watchdog */
3
    WDT->WDT_MR = WDT_MR_WDDIS;
4
#endif

Nun stellt sich mir die frage: Warum kann man den WDT nach einem 
'disable' nicht wieder einschalten? Weder wdt_init() noch wdt_restart() 
ändert etwas an den Bits.

Siehe Anhang:
Bild 1 - Nach System-Start
Bild 2 - Nach 'disable' und ebenfalls nach dem Init.-Versuch.

---
Edit:
Problem ist gelöst - Hatte einen Satz im Datenblatt "überlesen" :-(

WDT_MR can be written only once. Only a processor reset resets it.

Trotzdem Danke ;) ...peinlich, peinlich

Toll find ich das jedoch nicht. Mein Ansatz wäre nämlich:
- WDT disable
- System-Init. durchführen
- WDT enable

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.