summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--stmhal/modmachine.c42
1 files changed, 40 insertions, 2 deletions
diff --git a/stmhal/modmachine.c b/stmhal/modmachine.c
index 1e4862044a..0b01058fa5 100644
--- a/stmhal/modmachine.c
+++ b/stmhal/modmachine.c
@@ -190,6 +190,10 @@ STATIC mp_obj_t machine_freq(mp_uint_t n_args, const mp_obj_t *args) {
// set
mp_int_t wanted_sysclk = mp_obj_get_int(args[0]) / 1000000;
+ #if defined(MCU_SERIES_L4)
+ nlr_raise(mp_obj_new_exception_msg(&mp_type_NotImplementedError, "machine.freq set not supported yet"));
+ #endif
+
// default PLL parameters that give 48MHz on PLL48CK
uint32_t m = HSE_VALUE / 1000000, n = 336, p = 2, q = 7;
uint32_t sysclk_source;
@@ -310,9 +314,12 @@ STATIC mp_obj_t machine_freq(mp_uint_t n_args, const mp_obj_t *args) {
// set PLL as system clock source if wanted
if (sysclk_source == RCC_SYSCLKSOURCE_PLLCLK) {
+ #if !defined(MICROPY_HW_FLASH_LATENCY)
+ #define MICROPY_HW_FLASH_LATENCY FLASH_LATENCY_5
+ #endif
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
- if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK) {
+ if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, MICROPY_HW_FLASH_LATENCY) != HAL_OK) {
goto fail;
}
}
@@ -344,6 +351,35 @@ STATIC mp_obj_t machine_freq(mp_uint_t n_args, const mp_obj_t *args) {
MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(machine_freq_obj, 0, 4, machine_freq);
STATIC mp_obj_t machine_sleep(void) {
+ #if defined(MCU_SERIES_L4)
+
+ // Enter Stop 1 mode
+ __HAL_RCC_WAKEUPSTOP_CLK_CONFIG(RCC_STOP_WAKEUPCLOCK_MSI);
+ HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
+
+ // reconfigure system clock after wakeup
+ // Enable Power Control clock
+ __HAL_RCC_PWR_CLK_ENABLE();
+
+ // Get the Oscillators configuration according to the internal RCC registers
+ RCC_OscInitTypeDef RCC_OscInitStruct = {0};
+ HAL_RCC_GetOscConfig(&RCC_OscInitStruct);
+ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_MSI;
+ RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
+ HAL_RCC_OscConfig(&RCC_OscInitStruct);
+
+ // Get the Clocks configuration according to the internal RCC registers
+ RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
+ uint32_t pFLatency = 0;
+ HAL_RCC_GetClockConfig(&RCC_ClkInitStruct, &pFLatency);
+
+ // Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2 clock dividers
+ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK;
+ RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
+ HAL_RCC_ClockConfig(&RCC_ClkInitStruct, pFLatency);
+
+ #else
+
// takes longer to wake but reduces stop current
HAL_PWREx_EnableFlashPowerDown();
@@ -366,6 +402,8 @@ STATIC mp_obj_t machine_sleep(void) {
while (__HAL_RCC_GET_SYSCLK_SOURCE() != RCC_CFGR_SWS_PLL) {
}
+ #endif
+
return mp_const_none;
}
MP_DEFINE_CONST_FUN_OBJ_0(machine_sleep_obj, machine_sleep);
@@ -373,7 +411,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)
+#if defined(MCU_SERIES_F7) || 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