/** * @brief Configures the main internal regulator output voltage. * @param VoltageScaling: specifies the regulator output voltage to achieve * a tradeoff between performance and power consumption. * This parameter can be one of the following values: * @arg PWR_REGULATOR_VOLTAGE_SCALE1: Regulator voltage output range 1 mode, * typical output voltage at 1.4 V, * system frequency up to 216 MHz. * @arg PWR_REGULATOR_VOLTAGE_SCALE2: Regulator voltage output range 2 mode, * typical output voltage at 1.2 V, * system frequency up to 180 MHz. * @arg PWR_REGULATOR_VOLTAGE_SCALE3: Regulator voltage output range 2 mode, * typical output voltage at 1.00 V, * system frequency up to 151 MHz. * @note To update the system clock frequency(SYSCLK): * - Set the HSI or HSE as system clock frequency using the HAL_RCC_ClockConfig(). * - Call the HAL_RCC_OscConfig() to configure the PLL. * - Call HAL_PWREx_ConfigVoltageScaling() API to adjust the voltage scale. * - Set the new system clock frequency using the HAL_RCC_ClockConfig(). * @note The scale can be modified only when the HSI or HSE clock source is selected * as system clock source, otherwise the API returns HAL_ERROR. * @note When the PLL is OFF, the voltage scale 3 is automatically selected and the VOS bits * value in the PWR_CR1 register are not taken in account. * @note This API forces the PLL state ON to allow the possibility to configure the voltage scale 1 or 2. * @note The new voltage scale is active only when the PLL is ON. * @retval HAL Status */ HAL_StatusTypeDef HAL_PWREx_ControlVoltageScaling(uint32_t VoltageScaling) { uint32_t tickstart = 0; assert_param(IS_PWR_REGULATOR_VOLTAGE(VoltageScaling)); /* Enable Power ctrl clock */ __HAL_RCC_PWR_CLK_ENABLE(); /* Check if the PLL is used as system clock or not */ if(__HAL_RCC_GET_SYSCLK_SOURCE() != RCC_CFGR_SWS_PLL) { /* Disable the main PLL */ __HAL_RCC_PLL_DISABLE(); /* Get Start Tick */ tickstart = HAL_GetTick(); /* Wait till PLL is disabled */ while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) != RESET) { if((HAL_GetTick() - tickstart ) > PLL_TIMEOUT_VALUE) { return HAL_TIMEOUT; } } /* Set Range */ __HAL_PWR_VOLTAGESCALING_CONFIG(VoltageScaling); /* Enable the main PLL */ __HAL_RCC_PLL_ENABLE(); /* Get Start Tick */ tickstart = HAL_GetTick(); /* Wait till PLL is ready */ while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) == RESET) { if((HAL_GetTick() - tickstart ) > PLL_TIMEOUT_VALUE) { return HAL_TIMEOUT; } } /* Get Start Tick */ tickstart = HAL_GetTick(); while((__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY) == RESET)) { if((HAL_GetTick() - tickstart ) > PWR_VOSRDY_TIMEOUT_VALUE) { return HAL_TIMEOUT; } } } else { return HAL_ERROR; } return HAL_OK; }
/** * @brief Configures the main internal regulator output voltage. * @param PWR_Regulator_Voltage: specifies the regulator output voltage to achieve * a tradeoff between performance and power consumption when the device does * not operate at the maximum frequency (refer to the datasheets for more details). * This parameter can be one of the following values: * @arg PWR_Regulator_Voltage_Scale1: Regulator voltage output Scale 1 mode, * System frequency up to 168 MHz. * @arg PWR_Regulator_Voltage_Scale2: Regulator voltage output Scale 2 mode, * System frequency up to 144 MHz. * @retval None */ void PWR_MainRegulatorModeConfig(uint32_t PWR_Regulator_Voltage) { /* Check the parameters */ assert_param(IS_PWR_REGULATOR_VOLTAGE(PWR_Regulator_Voltage)); if (PWR_Regulator_Voltage == PWR_Regulator_Voltage_Scale2) { PWR->CR &= ~PWR_Regulator_Voltage_Scale1; } else { PWR->CR |= PWR_Regulator_Voltage_Scale1; } }
/** * @brief Configures the main internal regulator output voltage. * @param PWR_Regulator_Voltage: specifies the regulator output voltage to achieve * a tradeoff between performance and power consumption when the device does * not operate at the maximum frequency (refer to the datasheets for more details). * This parameter can be one of the following values: * @arg PWR_Regulator_Voltage_Scale1: Regulator voltage output Scale 1 mode, * System frequency up to 168 MHz. * @arg PWR_Regulator_Voltage_Scale2: Regulator voltage output Scale 2 mode, * System frequency up to 144 MHz. * @arg PWR_Regulator_Voltage_Scale3: Regulator voltage output Scale 3 mode, * System frequency up to 120 MHz (only for STM32F42xxx/43xxx devices) * @retval None */ void PWR_MainRegulatorModeConfig(uint32_t PWR_Regulator_Voltage) { uint32_t tmpreg = 0; /* Check the parameters */ assert_param(IS_PWR_REGULATOR_VOLTAGE(PWR_Regulator_Voltage)); tmpreg = PWR->CR; /* Clear VOS[15:14] bits */ tmpreg &= CR_VOS_MASK; /* Set VOS[15:14] bits according to PWR_Regulator_Voltage value */ tmpreg |= PWR_Regulator_Voltage; /* Store the new value */ PWR->CR = tmpreg; }