Class to add reset supervision with a watchdog timer functionality
Dependents: Example_WatchDog_Timer
ResetSupervisor.h@2:72d1cb8fc13c, 2019-10-04 (annotated)
- Committer:
- rlanders73
- Date:
- Fri Oct 04 14:50:29 2019 +0000
- Revision:
- 2:72d1cb8fc13c
- Parent:
- 1:4e2e6a9dc079
- Child:
- 3:b7a9432fe880
removed WatchdogReset function as it was redundant to resetReason.
Who changed what in which revision?
User | Revision | Line number | New 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 | 2:72d1cb8fc13c | 60 | // wd.initWD(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 | 2:72d1cb8fc13c | 67 | void initWD(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 | 2:72d1cb8fc13c | 73 | // wd.pingWD(); |
rlanders73 | 1:4e2e6a9dc079 | 74 | // @endcode |
rlanders73 | 1:4e2e6a9dc079 | 75 | // @returns none |
rlanders73 | 2:72d1cb8fc13c | 76 | void pingWD(); |
rlanders73 | 2:72d1cb8fc13c | 77 | |
rlanders73 | 1:4e2e6a9dc079 | 78 | /* ResetReasons explains what exactly caused the system reset |
rlanders73 | 2:72d1cb8fc13c | 79 | * |
rlanders73 | 2:72d1cb8fc13c | 80 | * example: |
rlanders73 | 2:72d1cb8fc13c | 81 | * @code |
rlanders73 | 2:72d1cb8fc13c | 82 | * switch(wd.ResetReason()){ |
rlanders73 | 2:72d1cb8fc13c | 83 | * case RCC_FLAG_BORRST: |
rlanders73 | 2:72d1cb8fc13c | 84 | * . |
rlanders73 | 2:72d1cb8fc13c | 85 | * . |
rlanders73 | 2:72d1cb8fc13c | 86 | * break, |
rlanders73 | 2:72d1cb8fc13c | 87 | * } |
rlanders73 | 2:72d1cb8fc13c | 88 | * Returns: |
rlanders73 | 2:72d1cb8fc13c | 89 | * RCC_FLAG_BORRST BOR reset |
rlanders73 | 2:72d1cb8fc13c | 90 | * RCC_FLAG_OBLRST OBLRST reset |
rlanders73 | 2:72d1cb8fc13c | 91 | * RCC_FLAG_PINRST Pin reset |
rlanders73 | 2:72d1cb8fc13c | 92 | * RCC_FLAG_FWRST FIREWALL reset |
rlanders73 | 2:72d1cb8fc13c | 93 | * RCC_FLAG_SFTRST Software reset |
rlanders73 | 2:72d1cb8fc13c | 94 | * RCC_FLAG_IWDGRST Independent Supervisor reset |
rlanders73 | 2:72d1cb8fc13c | 95 | * RCC_FLAG_WWDGRST Window Supervisor reset |
rlanders73 | 2:72d1cb8fc13c | 96 | * RCC_FLAG_LPWRRST Low Power reset |
rlanders73 | 1:4e2e6a9dc079 | 97 | */ |
rlanders73 | 2:72d1cb8fc13c | 98 | uint8_t resetReason(); |
rlanders73 | 1:4e2e6a9dc079 | 99 | |
rlanders73 | 1:4e2e6a9dc079 | 100 | private: |
rlanders73 | 1:4e2e6a9dc079 | 101 | uint8_t rstRsn; |
rlanders73 | 2:72d1cb8fc13c | 102 | |
rlanders73 | 1:4e2e6a9dc079 | 103 | }; |
rlanders73 | 1:4e2e6a9dc079 | 104 | |
rlanders73 | 1:4e2e6a9dc079 | 105 | #endif // WATCHDOG_H |