HAL support for 8s watchdog

This commit is contained in:
Scott Lahteine 2020-11-04 15:08:31 -06:00
parent 2a78fe0f81
commit 4fe1adc383
14 changed files with 82 additions and 73 deletions

View File

@ -36,7 +36,7 @@ void watchdogSetup() {
#if ENABLED(USE_WATCHDOG) #if ENABLED(USE_WATCHDOG)
// 4 seconds timeout // 4 seconds timeout
uint32_t timeout = 4000; uint32_t timeout = TERN(WATCHDOG_DURATION_8S, 8000, 4000);
// Calculate timeout value in WDT counter ticks: This assumes // Calculate timeout value in WDT counter ticks: This assumes
// the slow clock is running at 32.768 kHz watchdog // the slow clock is running at 32.768 kHz watchdog

View File

@ -25,6 +25,8 @@
#if ENABLED(USE_WATCHDOG) #if ENABLED(USE_WATCHDOG)
#define WDT_TIMEOUT_US TERN(WATCHDOG_DURATION_8S, 8000000, 4000000) // 4 or 8 second timeout
#include "watchdog.h" #include "watchdog.h"
void watchdogSetup() { void watchdogSetup() {

View File

@ -27,6 +27,8 @@
#include "watchdog.h" #include "watchdog.h"
#define WDT_TIMEOUT_US TERN(WATCHDOG_DURATION_8S, 8000000, 4000000) // 4 or 8 second timeout
void watchdog_init() {} void watchdog_init() {}
void HAL_watchdog_refresh() {} void HAL_watchdog_refresh() {}

View File

@ -21,7 +21,5 @@
*/ */
#pragma once #pragma once
#define WDT_TIMEOUT 4000000 // 4 second timeout
void watchdog_init(); void watchdog_init();
void HAL_watchdog_refresh(); void HAL_watchdog_refresh();

View File

@ -28,6 +28,8 @@
#include <lpc17xx_wdt.h> #include <lpc17xx_wdt.h>
#include "watchdog.h" #include "watchdog.h"
#define WDT_TIMEOUT_US TERN(WATCHDOG_DURATION_8S, 8000000, 4000000) // 4 or 8 second timeout
void watchdog_init() { void watchdog_init() {
#if ENABLED(WATCHDOG_RESET_MANUAL) #if ENABLED(WATCHDOG_RESET_MANUAL)
// We enable the watchdog timer, but only for the interrupt. // We enable the watchdog timer, but only for the interrupt.
@ -52,7 +54,7 @@ void watchdog_init() {
#else #else
WDT_Init(WDT_CLKSRC_IRC, WDT_MODE_RESET); WDT_Init(WDT_CLKSRC_IRC, WDT_MODE_RESET);
#endif #endif
WDT_Start(WDT_TIMEOUT); WDT_Start(WDT_TIMEOUT_US);
} }
void HAL_watchdog_refresh() { void HAL_watchdog_refresh() {

View File

@ -21,8 +21,6 @@
*/ */
#pragma once #pragma once
#define WDT_TIMEOUT 4000000 // 4 second timeout
void watchdog_init(); void watchdog_init();
void HAL_watchdog_refresh(); void HAL_watchdog_refresh();

View File

@ -24,28 +24,30 @@
#if ENABLED(USE_WATCHDOG) #if ENABLED(USE_WATCHDOG)
#include "watchdog.h" #include "watchdog.h"
void watchdog_init() { #define WDT_TIMEOUT_REG TERN(WATCHDOG_DURATION_8S, WDT_CONFIG_PER_CYC8192, WDT_CONFIG_PER_CYC4096) // 4 or 8 second timeout
// The low-power oscillator used by the WDT runs at 32,768 Hz with
// a 1:32 prescale, thus 1024 Hz, though probably not super precise.
// Setup WDT clocks void watchdog_init() {
MCLK->APBAMASK.bit.OSC32KCTRL_ = true; // The low-power oscillator used by the WDT runs at 32,768 Hz with
MCLK->APBAMASK.bit.WDT_ = true; // a 1:32 prescale, thus 1024 Hz, though probably not super precise.
OSC32KCTRL->OSCULP32K.bit.EN1K = true; // Enable out 1K (this is what WDT uses)
WDT->CTRLA.bit.ENABLE = false; // Disable watchdog for config // Setup WDT clocks
SYNC(WDT->SYNCBUSY.bit.ENABLE); MCLK->APBAMASK.bit.OSC32KCTRL_ = true;
MCLK->APBAMASK.bit.WDT_ = true;
OSC32KCTRL->OSCULP32K.bit.EN1K = true; // Enable out 1K (this is what WDT uses)
WDT->INTENCLR.reg = WDT_INTENCLR_EW; // Disable early warning interrupt WDT->CTRLA.bit.ENABLE = false; // Disable watchdog for config
WDT->CONFIG.reg = WDT_CONFIG_PER_CYC4096; // Set at least 4s period for chip reset SYNC(WDT->SYNCBUSY.bit.ENABLE);
HAL_watchdog_refresh(); WDT->INTENCLR.reg = WDT_INTENCLR_EW; // Disable early warning interrupt
WDT->CONFIG.reg = WDT_TIMEOUT_REG; // Set a 4s or 8s period for chip reset
WDT->CTRLA.reg = WDT_CTRLA_ENABLE; // Start watchdog now in normal mode HAL_watchdog_refresh();
SYNC(WDT->SYNCBUSY.bit.ENABLE);
} WDT->CTRLA.reg = WDT_CTRLA_ENABLE; // Start watchdog now in normal mode
SYNC(WDT->SYNCBUSY.bit.ENABLE);
}
#endif // USE_WATCHDOG #endif // USE_WATCHDOG

View File

@ -25,23 +25,26 @@
#if ENABLED(USE_WATCHDOG) #if ENABLED(USE_WATCHDOG)
#include "../../inc/MarlinConfig.h" #define WDT_TIMEOUT_US TERN(WATCHDOG_DURATION_8S, 8000000, 4000000) // 4 or 8 second timeout
#include "watchdog.h" #include "../../inc/MarlinConfig.h"
#include <IWatchdog.h>
void watchdog_init() { #include "watchdog.h"
#if DISABLED(DISABLE_WATCHDOG_INIT) #include <IWatchdog.h>
IWatchdog.begin(4000000); // 4 sec timeout
#endif
}
void HAL_watchdog_refresh() { void watchdog_init() {
IWatchdog.reload(); #if DISABLED(DISABLE_WATCHDOG_INIT)
#if DISABLED(PINS_DEBUGGING) && PIN_EXISTS(LED) IWatchdog.begin(WDT_TIMEOUT_US);
TOGGLE(LED_PIN); // heartbeat indicator #endif
#endif }
}
void HAL_watchdog_refresh() {
IWatchdog.reload();
#if DISABLED(PINS_DEBUGGING) && PIN_EXISTS(LED)
TOGGLE(LED_PIN); // heartbeat indicator
#endif
}
#endif // USE_WATCHDOG #endif // USE_WATCHDOG
#endif // ARDUINO_ARCH_STM32 && !STM32GENERIC #endif // ARDUINO_ARCH_STM32 && !STM32GENERIC

View File

@ -33,6 +33,13 @@
#include <libmaple/iwdg.h> #include <libmaple/iwdg.h>
#include "watchdog.h" #include "watchdog.h"
/**
* The watchdog clock is 40Khz. We need a 4 seconds interval, so use a /256 preescaler and
* 625 reload value (counts down to 0)
* use 1250 for 8 seconds
*/
#define STM32F1_WD_RELOAD TERN(WATCHDOG_DURATION_8S, 1250, 625) // 4 or 8 second timeout
void HAL_watchdog_refresh() { void HAL_watchdog_refresh() {
#if DISABLED(PINS_DEBUGGING) && PIN_EXISTS(LED) #if DISABLED(PINS_DEBUGGING) && PIN_EXISTS(LED)
TOGGLE(LED_PIN); // heartbeat indicator TOGGLE(LED_PIN); // heartbeat indicator

View File

@ -27,13 +27,6 @@
#include <libmaple/iwdg.h> #include <libmaple/iwdg.h>
/**
* The watchdog clock is 40Khz. We need a 4 seconds interval, so use a /256 preescaler and
* 625 reload value (counts down to 0)
* use 1250 for 8 seconds
*/
#define STM32F1_WD_RELOAD 625
// Arduino STM32F1 core now has watchdog support // Arduino STM32F1 core now has watchdog support
// Initialize watchdog with a 4 second countdown time // Initialize watchdog with a 4 second countdown time

View File

@ -25,31 +25,33 @@
#if ENABLED(USE_WATCHDOG) #if ENABLED(USE_WATCHDOG)
#include "watchdog.h" #include "watchdog.h"
IWDG_HandleTypeDef hiwdg; #define WDT_TIMEOUT_COUNT TERN(WATCHDOG_DURATION_8S, 8192, 4096) // 4 or 8 second timeout
void watchdog_init() { IWDG_HandleTypeDef hiwdg;
hiwdg.Instance = IWDG;
hiwdg.Init.Prescaler = IWDG_PRESCALER_32; //32kHz LSI clock and 32x prescalar = 1024Hz IWDG clock void watchdog_init() {
hiwdg.Init.Reload = 4095; //4095 counts = 4 seconds at 1024Hz hiwdg.Instance = IWDG;
if (HAL_IWDG_Init(&hiwdg) != HAL_OK) { hiwdg.Init.Prescaler = IWDG_PRESCALER_32; // 32kHz LSI clock and 32x prescalar = 1024Hz IWDG clock
//Error_Handler(); hiwdg.Init.Reload = WDT_TIMEOUT_COUNT - 1;
} if (HAL_IWDG_Init(&hiwdg) != HAL_OK) {
else { //Error_Handler();
#if PIN_EXISTS(LED) && DISABLED(PINS_DEBUGGING)
TOGGLE(LED_PIN); // heartbeat indicator
#endif
}
} }
else {
void HAL_watchdog_refresh() { #if PIN_EXISTS(LED) && DISABLED(PINS_DEBUGGING)
/* Refresh IWDG: reload counter */ TOGGLE(LED_PIN); // heartbeat indicator
if (HAL_IWDG_Refresh(&hiwdg) != HAL_OK) { #endif
/* Refresh Error */
//Error_Handler();
}
} }
}
void HAL_watchdog_refresh() {
/* Refresh IWDG: reload counter */
if (HAL_IWDG_Refresh(&hiwdg) != HAL_OK) {
/* Refresh Error */
//Error_Handler();
}
}
#endif // USE_WATCHDOG #endif // USE_WATCHDOG
#endif // STM32GENERIC && (STM32F4 || STM32F7) #endif // STM32GENERIC && (STM32F4 || STM32F7)

View File

@ -27,9 +27,11 @@
#include "watchdog.h" #include "watchdog.h"
#define WDT_TIMEOUT_MS TERN(WATCHDOG_DURATION_8S, 8000, 4000) // 4 or 8 second timeout
void watchdog_init() { void watchdog_init() {
WDOG_TOVALH = 0; WDOG_TOVALH = 0;
WDOG_TOVALL = 4000; WDOG_TOVALL = WDT_TIMEOUT_MS;
WDOG_STCTRLH = WDOG_STCTRLH_WDOGEN; WDOG_STCTRLH = WDOG_STCTRLH_WDOGEN;
} }

View File

@ -27,9 +27,11 @@
#include "watchdog.h" #include "watchdog.h"
#define WDT_TIMEOUT_MS TERN(WATCHDOG_DURATION_8S, 8000, 4000) // 4 or 8 second timeout
void watchdog_init() { void watchdog_init() {
WDOG_TOVALH = 0; WDOG_TOVALH = 0;
WDOG_TOVALL = 4000; WDOG_TOVALL = WDT_TIMEOUT_MS;
WDOG_STCTRLH = WDOG_STCTRLH_WDOGEN; WDOG_STCTRLH = WDOG_STCTRLH_WDOGEN;
} }

View File

@ -19,31 +19,27 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
* *
*/ */
#ifdef __IMXRT1062__
/** /**
* HAL Watchdog for Teensy 4.0 (IMXRT1062DVL6A) / 4.1 (IMXRT1062DVJ6A) * HAL Watchdog for Teensy 4.0 (IMXRT1062DVL6A) / 4.1 (IMXRT1062DVJ6A)
*/ */
#ifdef __IMXRT1062__
#include "../../inc/MarlinConfig.h" #include "../../inc/MarlinConfig.h"
#if ENABLED(USE_WATCHDOG) #if ENABLED(USE_WATCHDOG)
#include "watchdog.h" #include "watchdog.h"
// 4 seconds timeout #define WDT_TIMEOUT TERN(WATCHDOG_DURATION_8S, 8, 4) // 4 or 8 second timeout
#define WDTO 4 //seconds
uint8_t timeoutval = (WDTO - 0.5f) / 0.5f; constexpr uint8_t timeoutval = (WDT_TIMEOUT - 0.5f) / 0.5f;
void watchdog_init() { void watchdog_init() {
CCM_CCGR3 |= CCM_CCGR3_WDOG1(3); // enable WDOG1 clocks CCM_CCGR3 |= CCM_CCGR3_WDOG1(3); // enable WDOG1 clocks
WDOG1_WMCR = 0; // disable power down PDE WDOG1_WMCR = 0; // disable power down PDE
WDOG1_WCR |= WDOG_WCR_SRS | WDOG_WCR_WT(timeoutval); WDOG1_WCR |= WDOG_WCR_SRS | WDOG_WCR_WT(timeoutval);
WDOG1_WCR |= WDOG_WCR_WDE | WDOG_WCR_WDT | WDOG_WCR_SRE; WDOG1_WCR |= WDOG_WCR_WDE | WDOG_WCR_WDT | WDOG_WCR_SRE;
} }
void HAL_watchdog_refresh() { void HAL_watchdog_refresh() {