summaryrefslogtreecommitdiff
path: root/ports/stm32/powerctrl.c
diff options
context:
space:
mode:
authoriabdalkader <i.abdalkader@gmail.com>2020-12-02 23:33:56 +0200
committerDamien George <damien@micropython.org>2020-12-07 16:58:38 +1100
commit463a275bc4e99a1d37d523a120fe45976ea021fe (patch)
tree580af578ecab77c59687256afd1ab58e11dde63c /ports/stm32/powerctrl.c
parent3e5dd2dbcc87710f9f3f3bf4cd732ecdcc922b1f (diff)
stm32/powerctrl: On H7, re-enable disabled OSCs/PLLs on exit from STOP.
This commit saves OSCs/PLLs state before STOP mode and restores them on exit. Some boards use HSI48 for USB for example, others have PLL2/3 enabled, etc.
Diffstat (limited to 'ports/stm32/powerctrl.c')
-rw-r--r--ports/stm32/powerctrl.c39
1 files changed, 36 insertions, 3 deletions
diff --git a/ports/stm32/powerctrl.c b/ports/stm32/powerctrl.c
index 7d3681697..c36351e31 100644
--- a/ports/stm32/powerctrl.c
+++ b/ports/stm32/powerctrl.c
@@ -517,6 +517,9 @@ void powerctrl_enter_stop_mode(void) {
#endif
#if defined(STM32H7)
+ // Save RCC CR to re-enable OSCs and PLLs after wake up from low power mode.
+ uint32_t rcc_cr = RCC->CR;
+
// Save the current voltage scaling level to restore after exiting low power mode.
uint32_t vscaling = POWERCTRL_GET_VOLTAGE_SCALING();
@@ -607,9 +610,39 @@ void powerctrl_enter_stop_mode(void) {
#endif
#if defined(STM32H7)
- // Enable PLL3 for USB
- RCC->CR |= RCC_CR_PLL3ON;
- while (!(RCC->CR & RCC_CR_PLL3RDY)) {
+ // Enable HSI
+ if (rcc_cr & RCC_CR_HSION) {
+ RCC->CR |= RCC_CR_HSION;
+ while (!(RCC->CR & RCC_CR_HSIRDY)) {
+ }
+ }
+
+ // Enable CSI
+ if (rcc_cr & RCC_CR_CSION) {
+ RCC->CR |= RCC_CR_CSION;
+ while (!(RCC->CR & RCC_CR_CSIRDY)) {
+ }
+ }
+
+ // Enable HSI48
+ if (rcc_cr & RCC_CR_HSI48ON) {
+ RCC->CR |= RCC_CR_HSI48ON;
+ while (!(RCC->CR & RCC_CR_HSI48RDY)) {
+ }
+ }
+
+ // Enable PLL2
+ if (rcc_cr & RCC_CR_PLL2ON) {
+ RCC->CR |= RCC_CR_PLL2ON;
+ while (!(RCC->CR & RCC_CR_PLL2RDY)) {
+ }
+ }
+
+ // Enable PLL3
+ if (rcc_cr & RCC_CR_PLL3ON) {
+ RCC->CR |= RCC_CR_PLL3ON;
+ while (!(RCC->CR & RCC_CR_PLL3RDY)) {
+ }
}
#endif