|
|
@ -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
|
|
|
|