From fc483706d37b2e1a0829d14f019124ecb01f6d6e Mon Sep 17 00:00:00 2001 From: Damien George Date: Wed, 23 Aug 2017 17:00:02 +1000 Subject: [PATCH] stmhal/modmachine: Improve support for sleep/deepsleep on F7 MCUs. Changes for F7 are: - machine.reset_cause() now reports DEEPSLEEP_RESET correctly; - machine.sleep() is further optimised to reduce power consumption; - machine.deepsleep() is now implemented and working. --- stmhal/modmachine.c | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/stmhal/modmachine.c b/stmhal/modmachine.c index 407b62f525..bcbf43fded 100644 --- a/stmhal/modmachine.c +++ b/stmhal/modmachine.c @@ -77,6 +77,12 @@ void machine_init(void) { reset_cause = PYB_RESET_DEEPSLEEP; PWR->CR |= PWR_CR_CSBF; } else + #elif defined(MCU_SERIES_F7) + if (PWR->CSR1 & PWR_CSR1_SBF) { + // came out of standby + reset_cause = PYB_RESET_DEEPSLEEP; + PWR->CR1 |= PWR_CR1_CSBF; + } else #endif { // get reset cause from RCC flags @@ -455,7 +461,11 @@ STATIC mp_obj_t machine_sleep(void) { // takes longer to wake but reduces stop current HAL_PWREx_EnableFlashPowerDown(); + # if defined(MCU_SERIES_F7) + HAL_PWR_EnterSTOPMode((PWR_CR1_LPDS | PWR_CR1_LPUDS | PWR_CR1_FPDS | PWR_CR1_UDEN), PWR_STOPENTRY_WFI); + # else HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI); + #endif // reconfigure the system clock after waking up @@ -483,7 +493,7 @@ MP_DEFINE_CONST_FUN_OBJ_0(machine_sleep_obj, machine_sleep); STATIC mp_obj_t machine_deepsleep(void) { rtc_init_finalise(); -#if defined(MCU_SERIES_F7) || defined(MCU_SERIES_L4) +#if defined(MCU_SERIES_L4) printf("machine.deepsleep not supported yet\n"); #else // We need to clear the PWR wake-up-flag before entering standby, since @@ -505,8 +515,15 @@ STATIC mp_obj_t machine_deepsleep(void) { // clear RTC wake-up flags RTC->ISR &= ~(RTC_ISR_ALRAF | RTC_ISR_ALRBF | RTC_ISR_WUTF | RTC_ISR_TSF); + #if defined(MCU_SERIES_F7) + // disable wake-up flags + PWR->CSR2 &= ~(PWR_CSR2_EWUP6 | PWR_CSR2_EWUP5 | PWR_CSR2_EWUP4 | PWR_CSR2_EWUP3 | PWR_CSR2_EWUP2 | PWR_CSR2_EWUP1); + // clear global wake-up flag + PWR->CR2 |= PWR_CR2_CWUPF6 | PWR_CR2_CWUPF5 | PWR_CR2_CWUPF4 | PWR_CR2_CWUPF3 | PWR_CR2_CWUPF2 | PWR_CR2_CWUPF1; + #else // clear global wake-up flag PWR->CR |= PWR_CR_CWUF; + #endif // enable previously-enabled RTC interrupts RTC->CR |= save_irq_bits;