1 |
60 |
zero_gravi |
<<<
|
2 |
|
|
:sectnums:
|
3 |
|
|
==== Watchdog Timer (WDT)
|
4 |
|
|
|
5 |
|
|
[cols="<3,<3,<4"]
|
6 |
|
|
[frame="topbot",grid="none"]
|
7 |
|
|
|=======================
|
8 |
|
|
| Hardware source file(s): | neorv32_wdt.vhd |
|
9 |
|
|
| Software driver file(s): | neorv32_wdt.c |
|
10 |
|
|
| | neorv32_wdt.h |
|
11 |
|
|
| Top entity port: | none |
|
12 |
|
|
| Configuration generics: | _IO_WDT_EN_ | implement GPIO port when _true_
|
13 |
61 |
zero_gravi |
| CPU interrupts: | fast IRQ channel 0 | watchdog timer overflow (see <<_processor_interrupts>>)
|
14 |
60 |
zero_gravi |
|=======================
|
15 |
|
|
|
16 |
|
|
**Theory of Operation**
|
17 |
|
|
|
18 |
|
|
The watchdog (WDT) provides a last resort for safety-critical applications. The WDT has an internal 20-bit
|
19 |
|
|
wide counter that needs to be reset every now and then by the user program. If the counter overflows, either
|
20 |
|
|
a system reset or an interrupt is generated (depending on the configured operation mode).
|
21 |
|
|
|
22 |
64 |
zero_gravi |
Configuration of the watchdog is done by a single control register `CTRL`. The watchdog is enabled by
|
23 |
|
|
setting the _WDT_CTRL_EN_ bit. The clock used to increment the internal counter is selected via the 3-bit
|
24 |
|
|
_WDT_CTRL_CLK_SELx_ prescaler:
|
25 |
60 |
zero_gravi |
|
26 |
|
|
[cols="^3,^3,>4"]
|
27 |
|
|
[options="header",grid="rows"]
|
28 |
|
|
|=======================
|
29 |
64 |
zero_gravi |
| **`WDT_CTRL_CLK_SELx`** | Main clock prescaler | Timeout period in clock cycles
|
30 |
60 |
zero_gravi |
| `0b000` | 2 | 2 097 152
|
31 |
|
|
| `0b001` | 4 | 4 194 304
|
32 |
|
|
| `0b010` | 8 | 8 388 608
|
33 |
|
|
| `0b011` | 64 | 67 108 864
|
34 |
|
|
| `0b100` | 128 | 134 217 728
|
35 |
|
|
| `0b101` | 1024 | 1 073 741 824
|
36 |
|
|
| `0b110` | 2048 | 2 147 483 648
|
37 |
|
|
| `0b111` | 4096 | 4 294 967 296
|
38 |
|
|
|=======================
|
39 |
|
|
|
40 |
|
|
Whenever the internal timer overflows the watchdog executes one of two possible actions: Either a hard
|
41 |
|
|
processor reset is triggered or an interrupt is requested at CPU's fast interrupt channel #0. The
|
42 |
66 |
zero_gravi |
WDT_CTRL_MODE bit defines the action to be taken on an overflow: When cleared, the Watchdog will assert an
|
43 |
65 |
zero_gravi |
IRQ, when set the WDT will cause a system reset. The configured action can also be triggered manually at
|
44 |
64 |
zero_gravi |
any time by setting the _WDT_CTRL_FORCE_ bit. The watchdog is reset by setting the _WDT_CTRL_RESET_ bit.
|
45 |
60 |
zero_gravi |
|
46 |
65 |
zero_gravi |
A watchdog interrupt can only occur if the watchdog is enabled and interrupt mode is enabled.
|
47 |
|
|
A pending interrupt is cleared by either disabling the watchdog or by resetting the watchdog.
|
48 |
|
|
|
49 |
64 |
zero_gravi |
The cause of the last action of the watchdog can be determined via the _WDT_CTRL_RCAUSE_ flag. If this flag is
|
50 |
60 |
zero_gravi |
zero, the processor has been reset via the external reset signal. If this flag is set the last system reset was
|
51 |
|
|
initiated by the watchdog.
|
52 |
|
|
|
53 |
|
|
The Watchdog control register can be locked in order to protect the current configuration. The lock is
|
54 |
64 |
zero_gravi |
activated by setting bit _WDT_CTRL_LOCK_. In the locked state any write access to the configuration flags is
|
55 |
60 |
zero_gravi |
ignored (see table below, "accessible if locked"). Read accesses to the control register are not effected. The
|
56 |
|
|
lock can only be removed by a system reset (via external reset signal or via a watchdog reset action).
|
57 |
|
|
|
58 |
64 |
zero_gravi |
.WDT register map (`struct NEORV32_WDT`)
|
59 |
60 |
zero_gravi |
[cols="<2,<2,<4,^1,^2,<4"]
|
60 |
|
|
[options="header",grid="all"]
|
61 |
|
|
|=======================
|
62 |
|
|
| Address | Name [C] | Bit(s), Name [C] | R/W | Writable if locked | Function
|
63 |
64 |
zero_gravi |
.9+<| `0xffffffbc` .9+<| `NEORV32_WDT.CTRL` <|`0` _WDT_CTRL_EN_ ^| r/w ^| no <| watchdog enable
|
64 |
|
|
<|`1` _WDT_CTRL_CLK_SEL0_ ^| r/w ^| no .3+<| 3-bit clock prescaler select
|
65 |
|
|
<|`2` _WDT_CTRL_CLK_SEL1_ ^| r/w ^| no
|
66 |
|
|
<|`3` _WDT_CTRL_CLK_SEL2_ ^| r/w ^| no
|
67 |
|
|
<|`4` _WDT_CTRL_MODE_ ^| r/w ^| no <| overflow action: `1`=reset, `0`=IRQ
|
68 |
|
|
<|`5` _WDT_CTRL_RCAUSE_ ^| r/- ^| - <| cause of last system reset: `0`=caused by external reset signal, `1`=caused by watchdog
|
69 |
|
|
<|`6` _WDT_CTRL_RESET_ ^| -/w ^| yes <| watchdog reset when set, auto-clears
|
70 |
|
|
<|`7` _WDT_CTRL_FORCE_ ^| -/w ^| yes <| force configured watchdog action when set, auto-clears
|
71 |
|
|
<|`8` _WDT_CTRL_LOCK_ ^| r/w ^| no <| lock access to configuration when set, clears only on system reset (via external reset signal OR watchdog reset action = reset)
|
72 |
60 |
zero_gravi |
|=======================
|