From a74e031e1b9f3c5218f2e79ad333124cc887401d Mon Sep 17 00:00:00 2001 From: Alex Beal Date: Mon, 6 Jul 2026 23:28:21 -0600 Subject: [PATCH] Feed external hardware watchdog on Heltec Tower V2 The board has an external watchdog IC wired to HARDWARE_WATCHDOG_DONE/ WAKE, but nothing ever pulsed DONE to reset it, causing the board to hard-reset via the RESET pin roughly every 8-10 minutes. Start a periodic timer in begin() that toggles DONE well within the timeout. --- variants/heltec_tower_v2/HeltecTowerV2Board.cpp | 14 ++++++++++++++ variants/heltec_tower_v2/HeltecTowerV2Board.h | 4 ++++ 2 files changed, 18 insertions(+) diff --git a/variants/heltec_tower_v2/HeltecTowerV2Board.cpp b/variants/heltec_tower_v2/HeltecTowerV2Board.cpp index 04213bda8c..aa97e9adf1 100644 --- a/variants/heltec_tower_v2/HeltecTowerV2Board.cpp +++ b/variants/heltec_tower_v2/HeltecTowerV2Board.cpp @@ -58,6 +58,20 @@ void HeltecTowerV2Board::begin() { pinMode(PIN_GPS_STANDBY, OUTPUT); digitalWrite(PIN_GPS_STANDBY, HIGH); loRaFEMControl.init(); + +#ifdef HAS_HARDWARE_WATCHDOG + pinMode(HARDWARE_WATCHDOG_DONE, OUTPUT); + digitalWrite(HARDWARE_WATCHDOG_DONE, LOW); + pinMode(HARDWARE_WATCHDOG_WAKE, INPUT); + + watchdog_timer.begin(60000, [](TimerHandle_t xTimerID) { + (void)xTimerID; + MESH_DEBUG_PRINTLN("PWRMGT: Fed hardware watchdog (t=%lu ms)", millis()); + digitalWrite(HARDWARE_WATCHDOG_DONE, HIGH); + digitalWrite(HARDWARE_WATCHDOG_DONE, LOW); + }); + watchdog_timer.start(); +#endif } void HeltecTowerV2Board::onBeforeTransmit() { diff --git a/variants/heltec_tower_v2/HeltecTowerV2Board.h b/variants/heltec_tower_v2/HeltecTowerV2Board.h index 6912acdec7..816a88198b 100644 --- a/variants/heltec_tower_v2/HeltecTowerV2Board.h +++ b/variants/heltec_tower_v2/HeltecTowerV2Board.h @@ -21,4 +21,8 @@ class HeltecTowerV2Board : public NRF52BoardDCDC { uint16_t getBattMilliVolts() override; const char* getManufacturerName() const override; void powerOff() override; +#ifdef HAS_HARDWARE_WATCHDOG +private: + SoftwareTimer watchdog_timer; +#endif };