Class to add reset supervision with a watchdog timer functionality

Dependents:   Example_WatchDog_Timer

Committer:
rlanders73
Date:
Thu Oct 03 19:47:05 2019 +0000
Revision:
1:4e2e6a9dc079
Child:
2:72d1cb8fc13c
updateed watchdog to be a full reset supervisor

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rlanders73 1:4e2e6a9dc079 1 // This provides a reset supervisor service for the mbed. You can configure
rlanders73 1:4e2e6a9dc079 2 // various timeout intervals for the watchdog that meet your system needs. Additionally,
rlanders73 1:4e2e6a9dc079 3 // it is possible to identify if the Supervisor was the cause of any
rlanders73 1:4e2e6a9dc079 4 // system restart, permitting the application code to take appropriate
rlanders73 1:4e2e6a9dc079 5 // behavior.
rlanders73 1:4e2e6a9dc079 6 //
rlanders73 1:4e2e6a9dc079 7 // Adapted from Simon's watchdog code from http://mbed.org/forum/mbed/topic/508/
rlanders73 1:4e2e6a9dc079 8 //
rlanders73 1:4e2e6a9dc079 9 //
rlanders73 1:4e2e6a9dc079 10 #ifndef RESETSUPERVISOR_H
rlanders73 1:4e2e6a9dc079 11 #define RESETSUPERVISOR_H
rlanders73 1:4e2e6a9dc079 12 #include "mbed.h"
rlanders73 1:4e2e6a9dc079 13
rlanders73 1:4e2e6a9dc079 14 // The Supervisor class provides the interface to the Supervisor feature
rlanders73 1:4e2e6a9dc079 15 //
rlanders73 1:4e2e6a9dc079 16 // Embedded programs, by their nature, are usually unattended. If things
rlanders73 1:4e2e6a9dc079 17 // go wrong, it is usually important that the system attempts to recover.
rlanders73 1:4e2e6a9dc079 18 // Aside from robust software, a hardware watchdog can monitor the
rlanders73 1:4e2e6a9dc079 19 // system and initiate a system reset when appropriate.
rlanders73 1:4e2e6a9dc079 20 //
rlanders73 1:4e2e6a9dc079 21 // This Supervisor is patterned after one found elsewhere on the mbed site,
rlanders73 1:4e2e6a9dc079 22 // however this one also provides a method for the application software
rlanders73 1:4e2e6a9dc079 23 // to determine the cause of the reset - watchdog or otherwise.
rlanders73 1:4e2e6a9dc079 24 //
rlanders73 1:4e2e6a9dc079 25 // example:
rlanders73 1:4e2e6a9dc079 26 // @code
rlanders73 1:4e2e6a9dc079 27 // Supervisor wd;
rlanders73 1:4e2e6a9dc079 28 //
rlanders73 1:4e2e6a9dc079 29 // ...
rlanders73 1:4e2e6a9dc079 30 // main() {
rlanders73 1:4e2e6a9dc079 31 // if (wd.SupervisorCausedReset())
rlanders73 1:4e2e6a9dc079 32 // pc.printf("Supervisor caused reset.\r\n");
rlanders73 1:4e2e6a9dc079 33 //
rlanders73 1:4e2e6a9dc079 34 // wd.Configure(3.0); // sets the timeout interval
rlanders73 1:4e2e6a9dc079 35 // for (;;) {
rlanders73 1:4e2e6a9dc079 36 // wd.Update(); // kick the dog before the timeout
rlanders73 1:4e2e6a9dc079 37 // // do other work
rlanders73 1:4e2e6a9dc079 38 // }
rlanders73 1:4e2e6a9dc079 39 // }
rlanders73 1:4e2e6a9dc079 40 // @endcode
rlanders73 1:4e2e6a9dc079 41 //
rlanders73 1:4e2e6a9dc079 42 class Supervisor {
rlanders73 1:4e2e6a9dc079 43 public:
rlanders73 1:4e2e6a9dc079 44 // Create a Supervisor object
rlanders73 1:4e2e6a9dc079 45 //
rlanders73 1:4e2e6a9dc079 46 // example:
rlanders73 1:4e2e6a9dc079 47 // @code
rlanders73 1:4e2e6a9dc079 48 // Supervisor wd; // placed before main
rlanders73 1:4e2e6a9dc079 49 // @endcode
rlanders73 1:4e2e6a9dc079 50 Supervisor();
rlanders73 1:4e2e6a9dc079 51
rlanders73 1:4e2e6a9dc079 52 // Configure the timeout for the Supervisor
rlanders73 1:4e2e6a9dc079 53 //
rlanders73 1:4e2e6a9dc079 54 // This configures the Supervisor service and starts it. It must
rlanders73 1:4e2e6a9dc079 55 // be serviced before the timeout, or the system will be restarted.
rlanders73 1:4e2e6a9dc079 56 //
rlanders73 1:4e2e6a9dc079 57 // example:
rlanders73 1:4e2e6a9dc079 58 // @code
rlanders73 1:4e2e6a9dc079 59 // ...
rlanders73 1:4e2e6a9dc079 60 // wd.Configure(1.4); // configure for a 1.4 second timeout
rlanders73 1:4e2e6a9dc079 61 // ...
rlanders73 1:4e2e6a9dc079 62 // @endcode
rlanders73 1:4e2e6a9dc079 63 //
rlanders73 1:4e2e6a9dc079 64 // @param[in] timeout in seconds, as a floating point number
rlanders73 1:4e2e6a9dc079 65 // @returns none
rlanders73 1:4e2e6a9dc079 66 //
rlanders73 1:4e2e6a9dc079 67 void Configure(float timeout);
rlanders73 1:4e2e6a9dc079 68
rlanders73 1:4e2e6a9dc079 69 // Service the Supervisor so it does not cause a system reset
rlanders73 1:4e2e6a9dc079 70 //
rlanders73 1:4e2e6a9dc079 71 // example:
rlanders73 1:4e2e6a9dc079 72 // @code
rlanders73 1:4e2e6a9dc079 73 // wd.Update();
rlanders73 1:4e2e6a9dc079 74 // @endcode
rlanders73 1:4e2e6a9dc079 75 // @returns none
rlanders73 1:4e2e6a9dc079 76 void Update();
rlanders73 1:4e2e6a9dc079 77
rlanders73 1:4e2e6a9dc079 78 // SupervisorCausedReset identifies if the cause of the system
rlanders73 1:4e2e6a9dc079 79 // reset was the Supervisor
rlanders73 1:4e2e6a9dc079 80 //
rlanders73 1:4e2e6a9dc079 81 // example:
rlanders73 1:4e2e6a9dc079 82 // @code
rlanders73 1:4e2e6a9dc079 83 // if (wd.WatchdogCausedReset())) {
rlanders73 1:4e2e6a9dc079 84 // @endcode
rlanders73 1:4e2e6a9dc079 85 //
rlanders73 1:4e2e6a9dc079 86 // @returns true if the Supervisor was the cause of the reset
rlanders73 1:4e2e6a9dc079 87 bool WatchdogReset();
rlanders73 1:4e2e6a9dc079 88
rlanders73 1:4e2e6a9dc079 89 /* ResetReasons explains what exactly caused the system reset
rlanders73 1:4e2e6a9dc079 90 //
rlanders73 1:4e2e6a9dc079 91 // example:
rlanders73 1:4e2e6a9dc079 92 // @code
rlanders73 1:4e2e6a9dc079 93 switch(wd.ResetReason()){
rlanders73 1:4e2e6a9dc079 94 case RCC_FLAG_BORRST:
rlanders73 1:4e2e6a9dc079 95 .
rlanders73 1:4e2e6a9dc079 96 .
rlanders73 1:4e2e6a9dc079 97 break,
rlanders73 1:4e2e6a9dc079 98 }
rlanders73 1:4e2e6a9dc079 99 */
rlanders73 1:4e2e6a9dc079 100 uint8_t ResetReason();
rlanders73 1:4e2e6a9dc079 101
rlanders73 1:4e2e6a9dc079 102 private:
rlanders73 1:4e2e6a9dc079 103 uint8_t rstRsn;
rlanders73 1:4e2e6a9dc079 104 /*
rlanders73 1:4e2e6a9dc079 105 * @arg @ref RCC_FLAG_BORRST BOR reset
rlanders73 1:4e2e6a9dc079 106 * @arg @ref RCC_FLAG_OBLRST OBLRST reset
rlanders73 1:4e2e6a9dc079 107 * @arg @ref RCC_FLAG_PINRST Pin reset
rlanders73 1:4e2e6a9dc079 108 * @arg @ref RCC_FLAG_FWRST FIREWALL reset
rlanders73 1:4e2e6a9dc079 109 * @arg @ref RCC_FLAG_SFTRST Software reset
rlanders73 1:4e2e6a9dc079 110 * @arg @ref RCC_FLAG_IWDGRST Independent Supervisor reset
rlanders73 1:4e2e6a9dc079 111 * @arg @ref RCC_FLAG_WWDGRST Window Supervisor reset
rlanders73 1:4e2e6a9dc079 112 * @arg @ref RCC_FLAG_LPWRRST Low Power reset
rlanders73 1:4e2e6a9dc079 113 */
rlanders73 1:4e2e6a9dc079 114 };
rlanders73 1:4e2e6a9dc079 115
rlanders73 1:4e2e6a9dc079 116 #endif // WATCHDOG_H