stm32/powerctrl: Improve standby mode entry code for H7 MCUs.
Changes in this commit: - Clear and mask D2 EXTIs. - Set correct voltage scaling level for standby mode. - Disable debug MCU (if debugging is disabled), for all MCU series.
This commit is contained in:
parent
564945a2a0
commit
5b7f71882b
|
@ -875,6 +875,18 @@ void powerctrl_enter_standby_mode(void) {
|
||||||
MICROPY_BOARD_ENTER_STANDBY
|
MICROPY_BOARD_ENTER_STANDBY
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(STM32H7)
|
||||||
|
// Note: According to ST reference manual, RM0399, Rev 3, Section 7.7.10,
|
||||||
|
// before entering Standby mode, voltage scale VOS0 must not be active.
|
||||||
|
uint32_t vscaling = POWERCTRL_GET_VOLTAGE_SCALING();
|
||||||
|
if (vscaling == PWR_REGULATOR_VOLTAGE_SCALE0) {
|
||||||
|
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE3);
|
||||||
|
// Wait for PWR_FLAG_VOSRDY
|
||||||
|
while (!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
// We need to clear the PWR wake-up-flag before entering standby, since
|
// We need to clear the PWR wake-up-flag before entering standby, since
|
||||||
// the flag may have been set by a previous wake-up event. Furthermore,
|
// the flag may have been set by a previous wake-up event. Furthermore,
|
||||||
// we need to disable the wake-up sources while clearing this flag, so
|
// we need to disable the wake-up sources while clearing this flag, so
|
||||||
|
@ -926,8 +938,14 @@ void powerctrl_enter_standby_mode(void) {
|
||||||
// Restore EWUP state
|
// Restore EWUP state
|
||||||
PWR->CSR2 |= csr2_ewup;
|
PWR->CSR2 |= csr2_ewup;
|
||||||
#elif defined(STM32H7)
|
#elif defined(STM32H7)
|
||||||
EXTI_D1->PR1 = 0x3fffff;
|
// Clear and mask D1 EXTIs.
|
||||||
PWR->WKUPCR |= PWR_WAKEUP_FLAG1 | PWR_WAKEUP_FLAG2 | PWR_WAKEUP_FLAG3 | PWR_WAKEUP_FLAG4 | PWR_WAKEUP_FLAG5 | PWR_WAKEUP_FLAG6;
|
EXTI_D1->PR1 = 0x3fffffu;
|
||||||
|
EXTI_D1->IMR1 &= ~(0xFFFFu); // 16 lines
|
||||||
|
// Clear and mask D2 EXTIs.
|
||||||
|
EXTI_D2->PR1 = 0x3fffffu;
|
||||||
|
EXTI_D2->IMR1 &= ~(0xFFFFu); // 16 lines
|
||||||
|
// Clear all wake-up flags.
|
||||||
|
PWR->WKUPCR |= PWR_WAKEUP_FLAG_ALL;
|
||||||
#elif defined(STM32G0) || defined(STM32G4) || defined(STM32L4) || defined(STM32WB)
|
#elif defined(STM32G0) || defined(STM32G4) || defined(STM32L4) || defined(STM32WB)
|
||||||
// clear all wake-up flags
|
// clear all wake-up flags
|
||||||
PWR->SCR |= PWR_SCR_CWUF5 | PWR_SCR_CWUF4 | PWR_SCR_CWUF3 | PWR_SCR_CWUF2 | PWR_SCR_CWUF1;
|
PWR->SCR |= PWR_SCR_CWUF5 | PWR_SCR_CWUF4 | PWR_SCR_CWUF3 | PWR_SCR_CWUF2 | PWR_SCR_CWUF1;
|
||||||
|
@ -952,6 +970,11 @@ void powerctrl_enter_standby_mode(void) {
|
||||||
PWR->CSR1 |= PWR_CSR1_EIWUP;
|
PWR->CSR1 |= PWR_CSR1_EIWUP;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(NDEBUG)
|
||||||
|
// Disable Debug MCU.
|
||||||
|
DBGMCU->CR = 0;
|
||||||
|
#endif
|
||||||
|
|
||||||
// enter standby mode
|
// enter standby mode
|
||||||
HAL_PWR_EnterSTANDBYMode();
|
HAL_PWR_EnterSTANDBYMode();
|
||||||
// we never return; MCU is reset on exit from standby
|
// we never return; MCU is reset on exit from standby
|
||||||
|
|
Loading…
Reference in New Issue