From e3dd8164a423a12d88232475a529233144d775b0 Mon Sep 17 00:00:00 2001 From: Constantine Date: Tue, 12 Aug 2025 19:23:34 +0300 Subject: [PATCH] nRF52840 promicro deepsleep fix with some additions (#7407) * Pro-Micro DeepSleep Quick Fix It is noticed that some nRF52840 boards (pro-micro in particular) stopped waking up from the deep sleep state (shutdown state) with a press of a button. The problem is in a Serial1.end() call. * Clear GPREGRET before setting There are some troubles with that register: it is recommended to clear it with 0xFF mask and only after that perform a setting. * Pro-Micro button SENSE signal Added SENSE signal on the user button. It is explicitly enabled now for this platform. * nRF52 pre-sleep main serial check Added another usage check for the main Serial. It could save some nerves in case the port is not in use by any means. Applied trunk fmt to the file. --------- Co-authored-by: Ben Meadors --- src/platform/nrf52/main-nrf52.cpp | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/platform/nrf52/main-nrf52.cpp b/src/platform/nrf52/main-nrf52.cpp index 1bf9a39fd..590d2f0ae 100644 --- a/src/platform/nrf52/main-nrf52.cpp +++ b/src/platform/nrf52/main-nrf52.cpp @@ -282,10 +282,14 @@ void cpuDeepSleep(uint32_t msecToWake) #if SPI_INTERFACES_COUNT > 1 SPI1.end(); #endif - // This may cause crashes as debug messages continue to flow. - Serial.end(); + if (Serial) // Another check in case of disabled default serial, does nothing bad + Serial.end(); // This may cause crashes as debug messages continue to flow. + + // This causes troubles with waking up on nrf52 (on pro-micro in particular): + // we have no Serial1 in use on nrf52, check Serial and GPS modules. #ifdef PIN_SERIAL1_RX - Serial1.end(); + if (Serial1) // A straightforward solution to the wake from deepsleep problem + Serial1.end(); #endif setBluetoothEnable(false); @@ -362,6 +366,7 @@ void cpuDeepSleep(uint32_t msecToWake) // Resume on user button press // https://github.com/lyusupov/SoftRF/blob/81c519ca75693b696752235d559e881f2e0511ee/software/firmware/source/SoftRF/src/platform/nRF52.cpp#L1738 constexpr uint32_t DFU_MAGIC_SKIP = 0x6d; + sd_power_gpregret_clr(0, 0xFF); // Clear the register before setting a new values in it for stability reasons sd_power_gpregret_set(0, DFU_MAGIC_SKIP); // Equivalent NRF_POWER->GPREGRET = DFU_MAGIC_SKIP // FIXME, use system off mode with ram retention for key state? @@ -378,6 +383,12 @@ void cpuDeepSleep(uint32_t msecToWake) nrf_gpio_cfg_sense_set(PIN_BUTTON2, sense1); #endif +#ifdef PROMICRO_DIY_TCXO + nrf_gpio_cfg_input(BUTTON_PIN, NRF_GPIO_PIN_PULLUP); // Enable internal pull-up on the button pin + nrf_gpio_pin_sense_t sense = NRF_GPIO_PIN_SENSE_LOW; // Configure SENSE signal on low edge + nrf_gpio_cfg_sense_set(BUTTON_PIN, sense); // Apply SENSE to wake up the device from the deep sleep +#endif + auto ok = sd_power_system_off(); if (ok != NRF_SUCCESS) { LOG_ERROR("FIXME: Ignoring soft device (EasyDMA pending?) and forcing system-off!");