Basic implementation of watchdog
Dependencies: STM_ResetSupervisor USBDevice
Revision 2:50b1371247da, committed 2019-10-06
- Comitter:
- rlanders73
- Date:
- Sun Oct 06 02:59:58 2019 +0000
- Parent:
- 1:38b385f34687
- Commit message:
- using new STM_ResetSupervisor library that has watchdog functionality
Changed in this revision
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/STM_ResetSupervisor.lib Sun Oct 06 02:59:58 2019 +0000 @@ -0,0 +1,1 @@ +https://os.mbed.com/teams/PointLabs/code/STM_ResetSupervisor/#f31b32884780
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBDevice.lib Sun Oct 06 02:59:58 2019 +0000 @@ -0,0 +1,1 @@ +https://os.mbed.com/teams/PointLabs/code/USBDevice/#584b0afbd742
--- a/Watchdog/Watchdog.cpp Tue Jun 25 23:49:40 2019 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,131 +0,0 @@
-/// @file Watchdog.cpp provides the interface to the Watchdog module
-///
-/// This provides basic Watchdog service for the mbed. You can configure
-/// various timeout intervals that meet your system needs. Additionally,
-/// it is possible to identify if the Watchdog was the cause of any
-/// system restart.
-///
-/// Adapted from Simon's Watchdog code from http://mbed.org/forum/mbed/topic/508/
-///
-/// @note Copyright © 2011 by Smartware Computing, all rights reserved.
-/// This software may be used to derive new software, as long as
-/// this copyright statement remains in the source file.
-/// @author David Smart
-///
-/// @note Copyright © 2015 by NBRemond, all rights reserved.
-/// This software may be used to derive new software, as long as
-/// this copyright statement remains in the source file.
-///
-/// Added support for STM32 Nucleo platforms
-///
-/// @author Bernaérd Remond
-///
-
-//#define LPC
-#define ST_NUCLEO
-
-
-#include "mbed.h"
-#include "Watchdog.h"
-
-
-/// Watchdog gets instantiated at the module level
-Watchdog::Watchdog() {
-#ifdef LPC
- wdreset = (LPC_WDT->WDMOD >> 2) & 1; // capture the cause of the previous reset
-#endif
-#ifdef ST_NUCLEO
- // capture the cause of the previous reset
- /* Check if the system has resumed from IWDG reset */
-/*
- if (__HAL_RCC_GET_FLAG(RCC_FLAG_IWDGRST)) {
- wdreset = true;
- }
- else {
- wdreset = false;
- }
-*/
- printf("in constructor\r\n");
- wdreset = false;
-#endif
-
-}
-
-/// Load timeout value in watchdog timer and enable
-void Watchdog::Configure(float timeout) {
-#ifdef LPC
- LPC_WDT->WDCLKSEL = 0x1; // Set CLK src to PCLK
- uint32_t clk = SystemCoreClock / 16; // WD has a fixed /4 prescaler, PCLK default is /4
- LPC_WDT->WDTC = (uint32_t)(timeout * (float)clk);
- LPC_WDT->WDMOD = 0x3; // Enabled and Reset
-#endif
-
-#ifdef ST_NUCLEO
- // see http://embedded-lab.com/blog/?p=9662
- #define LsiFreq (45000)
- uint16_t PrescalerCode;
- uint16_t Prescaler;
- uint16_t ReloadValue;
- float Calculated_timeout;
-
- if ((timeout * (LsiFreq/4)) < 0x7FF) {
- PrescalerCode = IWDG_PRESCALER_4;
- Prescaler = 4;
- }
- else if ((timeout * (LsiFreq/8)) < 0xFF0) {
- PrescalerCode = IWDG_PRESCALER_8;
- Prescaler = 8;
- }
- else if ((timeout * (LsiFreq/16)) < 0xFF0) {
- PrescalerCode = IWDG_PRESCALER_16;
- Prescaler = 16;
- }
- else if ((timeout * (LsiFreq/32)) < 0xFF0) {
- PrescalerCode = IWDG_PRESCALER_32;
- Prescaler = 32;
- }
- else if ((timeout * (LsiFreq/64)) < 0xFF0) {
- PrescalerCode = IWDG_PRESCALER_64;
- Prescaler = 64;
- }
- else if ((timeout * (LsiFreq/128)) < 0xFF0) {
- PrescalerCode = IWDG_PRESCALER_128;
- Prescaler = 128;
- }
- else {
- PrescalerCode = IWDG_PRESCALER_256;
- Prescaler = 256;
- }
-
- // specifies the IWDG Reload value. This parameter must be a number between 0 and 0x0FFF.
- ReloadValue = (uint32_t)(timeout * (LsiFreq/Prescaler));
-
- Calculated_timeout = ((float)(Prescaler * ReloadValue)) / LsiFreq;
- printf("WATCHDOG set with prescaler:%d reload value: 0x%X - timeout:%f\n",Prescaler, ReloadValue, Calculated_timeout);
-
- IWDG->KR = 0x5555; //Disable write protection of IWDG registers
- IWDG->PR = PrescalerCode; //Set PR value
- IWDG->RLR = ReloadValue; //Set RLR value
- IWDG->KR = 0xAAAA; //Reload IWDG
- IWDG->KR = 0xCCCC; //Start IWDG - See more at: http://embedded-lab.com/blog/?p=9662#sthash.6VNxVSn0.dpuf
-#endif
-
- Service();
-}
-
-/// "Service", "kick" or "feed" the dog - reset the watchdog timer
-/// by writing this required bit pattern
-void Watchdog::Service() {
-#ifdef LPC
- LPC_WDT->WDFEED = 0xAA;
- LPC_WDT->WDFEED = 0x55;
-#endif
-#ifdef ST_NUCLEO
- IWDG->KR = 0xAAAA; //Reload IWDG - See more at: http://embedded-lab.com/blog/?p=9662#sthash.6VNxVSn0.dpuf
-#endif
-}
-
-/// get the flag to indicate if the watchdog causes the reset
-bool Watchdog::WatchdogCausedReset() {
- return wdreset;
-}
--- a/Watchdog/Watchdog.h Tue Jun 25 23:49:40 2019 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,101 +0,0 @@
-/// @file Watchdog.h provides the interface to the Watchdog module
-///
-/// This provides basic Watchdog service for the mbed. You can configure
-/// various timeout intervals that meet your system needs. Additionally,
-/// it is possible to identify if the Watchdog was the cause of any
-/// system restart, permitting the application code to take appropriate
-/// behavior.
-///
-/// Adapted from Simon's Watchdog code from http://mbed.org/forum/mbed/topic/508/
-///
-/// @note Copyright © 2011 by Smartware Computing, all rights reserved.
-/// This software may be used to derive new software, as long as
-/// this copyright statement remains in the source file.
-/// @author David Smart
-///
-/// History
-/// \li v1.00 - 20110616: initial release with some documentation improvements
-///
-#ifndef WATCHDOG_H
-#define WATCHDOG_H
-#include "mbed.h"
-
-/// The Watchdog class provides the interface to the Watchdog feature
-///
-/// Embedded programs, by their nature, are usually unattended. If things
-/// go wrong, it is usually important that the system attempts to recover.
-/// Aside from robust software, a hardware watchdog can monitor the
-/// system and initiate a system reset when appropriate.
-///
-/// This Watchdog is patterned after one found elsewhere on the mbed site,
-/// however this one also provides a method for the application software
-/// to determine the cause of the reset - watchdog or otherwise.
-///
-/// example:
-/// @code
-/// Watchdog wd;
-///
-/// ...
-/// main() {
-/// if (wd.WatchdogCausedReset())
-/// pc.printf("Watchdog caused reset.\r\n");
-///
-/// wd.Configure(3.0); // sets the timeout interval
-/// for (;;) {
-/// wd.Service(); // kick the dog before the timeout
-/// // do other work
-/// }
-/// }
-/// @endcode
-///
-class Watchdog {
-public:
- /// Create a Watchdog object
- ///
- /// example:
- /// @code
- /// Watchdog wd; // placed before main
- /// @endcode
- Watchdog();
-
- /// Configure the timeout for the Watchdog
- ///
- /// This configures the Watchdog service and starts it. It must
- /// be serviced before the timeout, or the system will be restarted.
- ///
- /// example:
- /// @code
- /// ...
- /// wd.Configure(1.4); // configure for a 1.4 second timeout
- /// ...
- /// @endcode
- ///
- /// @param[in] timeout in seconds, as a floating point number
- /// @returns none
- ///
- void Configure(float timeout);
-
- /// Service the Watchdog so it does not cause a system reset
- ///
- /// example:
- /// @code
- /// wd.Service();
- /// @endcode
- /// @returns none
- void Service();
-
- /// WatchdogCausedReset identifies if the cause of the system
- /// reset was the Watchdog
- ///
- /// example:
- /// @code
- /// if (wd.WatchdogCausedReset())) {
- /// @endcode
- ///
- /// @returns true if the Watchdog was the cause of the reset
- bool WatchdogCausedReset();
-private:
- bool wdreset;
-};
-
-#endif // WATCHDOG_H
\ No newline at end of file
--- a/main.cpp Tue Jun 25 23:49:40 2019 +0000
+++ b/main.cpp Sun Oct 06 02:59:58 2019 +0000
@@ -1,29 +1,37 @@
#include "mbed.h"
-#include <ros.h>
-#include <nav_msgs/Odometry.h> //contains both the twist and pose
-#include "Watchdog.h"
+#include "ResetSupervisor.h"
int i = 1;
-Serial pc(USBTX, USBRX, 57600); //Serial Monitor
+#include "USBSerial.h"
+/******************** Comms *********************/
+USBSerial pc;
+FileHandle* mbed::mbed_override_console(int)
+{
+ return &pc;
+}
+
+Supervisor foreman;
int main(void)
{
- Watchdog dog;
- dog.Configure(1);
- pc.printf("I'm resetting!\n", dog.WatchdogCausedReset());
+ wait(1);
+
+ foreman.initWD(5); // turn on the Watchdog Timer and set it for 5 seconds
+ if(foreman.resetReason() == RCC_FLAG_IWDGRST)
+ pc.printf("Watchdog Reset!\n");
- while(i++)
+ while(1)
{
- pc.printf("Hello! I'm working! Iteration: %d \n", i);
- wait(0.9);
-
- if (i == 10) {
- wait(0.6);
- }
-
-
- dog.Service();
- //return 0;
+ pc.printf("Hello! I'm working! Iteration: %d \n", i);
+ wait(1);
+
+ if (i == 10) {
+ wait(10);
+ }
+
+
+ foreman.pingWD();
+ i++;
}
}
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed_app.json Sun Oct 06 02:59:58 2019 +0000
@@ -0,0 +1,25 @@
+{
+ "config": {
+ "trace-level": {
+ "help": "Options are TRACE_LEVEL_ERROR,TRACE_LEVEL_WARN,TRACE_LEVEL_INFO,TRACE_LEVEL_DEBUG",
+ "macro_name": "MBED_TRACE_MAX_LEVEL",
+ "value": "TRACE_LEVEL_DEBUG"
+ }
+ },
+ "macros": [
+ "MODEM_UBLOX_R41XM",
+ "GPS_CFG_FILE=\"gps_config.h\""
+
+ ],
+ "target_overrides": {
+ "*": {
+ "target.features_add": ["COMMON_PAL"],
+ "target.device_has_add":["RESET_REASON"],
+ "platform.stdio-baud-rate": 115200,
+ "platform.stdio-convert-newlines": true,
+ "platform.default-serial-baud-rate": 115200,
+ "platform.stdio-buffered-serial": true,
+ "target.network-default-interface-type" : "CELLULAR"
+ }
+ }
+}
\ No newline at end of file
--- a/ros_lib_kinetic.lib Tue Jun 25 23:49:40 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -https://developer.mbed.org/users/garyservin/code/ros_lib_kinetic/#a849bf78d77f