aboutsummaryrefslogtreecommitdiff
path: root/stmhal
diff options
context:
space:
mode:
authorDamien George2017-08-23 17:00:02 +1000
committerDamien George2017-08-23 17:00:02 +1000
commitfc483706d37b2e1a0829d14f019124ecb01f6d6e (patch)
tree03d4c291c12215179494f7d5313de53c8158ab18 /stmhal
parent49316b864b79220c2db481d18c253fda58301561 (diff)
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.
Diffstat (limited to 'stmhal')
-rw-r--r--stmhal/modmachine.c19
1 files changed, 18 insertions, 1 deletions
diff --git a/stmhal/modmachine.c b/stmhal/modmachine.c
index 407b62f52..bcbf43fde 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;