System Reset
From Nutwiki
Test Environments
Hardware Comments | Nut/OS 4.8.0 | |||
Ethernut 1.3 H | Unknown bug: doesn't recognize reset cause | |||
Ethernut 2.1 B | Unknown bug: doesn't recognize reset cause | |||
Ethernut 3.0 E | Compiling Error (see discussion) | |||
EIR 1.0 C | Set jumper JP1 to DBGU mode. | OK Binaries | ||
Compiler: ARM-GCC 4.2.2 ; AVR-GCC 4.3.0 |
Source Code
<source lang="c">
- include <dev/board.h>
- include <dev/reset.h>
- include <sys/timer.h>
- include <stdio.h>
- include <io.h>
int main(void) {
int rc = NutResetCause(); uint32_t baud = 115200; char *cause; int i;
NutRegisterDevice(&DEV_DEBUG, 0, 0); freopen(DEV_DEBUG_NAME, "w", stdout); _ioctl(_fileno(stdout), UART_SETSPEED, &baud);
switch (rc) { case NUT_RSTTYP_POWERUP: cause = "Powerup"; break; case NUT_RSTTYP_WATCHDOG: cause = "Watchdog"; break; case NUT_RSTTYP_EXTERNAL: cause = "External"; break; case NUT_RSTTYP_SOFTWARE: cause = "Software"; break; case NUT_RSTTYP_BROWNOUT: cause = "Brownout"; break; default: cause = "Unknown"; break; } printf("\nLast reset caused by %s (rc = %d)\n", cause, rc);
for(i = 32; --i > 0 ;) { printf("\rNext reset in %d seconds", i); NutSleep(1000); } printf("\nReset\n"); NutReset(); printf("Reset failed\n"); for (;;);
return 0;
} </source>
Details
You can invoke a system reset by calling
<source lang="c"> NutReset(); </source>
This function will only return in case of a failure.
Use NutResetCause
to determine the cause of the last reset.
<source lang="c"> rc = NutResetCause(); </source>
This function should be called at the very first beginning of your main program. It may return any of the following values:
-
NUT_RSTTYP_POWERUP
, if the reset was caused by powering up the system. -
NUT_RSTTYP_WATCHDOG
, if the watchdog triggered the last reset. -
NUT_RSTTYP_EXTERNAL
, if an external reset signal appeared like pressing a reset button. -
NUT_RSTTYP_SOFTWARE
, if the reset was triggered by writing to a reset controller register. -
NUT_RSTTYP_BROWNOUT
, if the reset was cause by low voltage detection.
Which code is actually returned depends on the capabilities of the CPU and the board design.