STM32L4xx_HAL_Driver  1.14.0
RCC Private Functions

Functions

static HAL_StatusTypeDef RCC_SetFlashLatencyFromMSIRange (uint32_t msirange)
 Update number of Flash wait states in line with MSI range and current voltage range. More...
 
static uint32_t RCC_GetSysClockFreqFromPLLSource (void)
 Compute SYSCLK frequency based on PLL SYSCLK source. More...
 

Detailed Description

Function Documentation

◆ RCC_GetSysClockFreqFromPLLSource()

static uint32_t RCC_GetSysClockFreqFromPLLSource ( void  )
static

Compute SYSCLK frequency based on PLL SYSCLK source.

Return values
SYSCLKfrequency

Definition at line 1807 of file stm32l4xx_hal_rcc.c.

1808 {
1809  uint32_t msirange = 0U;
1810  uint32_t pllvco, pllsource, pllr, pllm, sysclockfreq; /* no init needed */
1811 
1812  if(__HAL_RCC_GET_PLL_OSCSOURCE() == RCC_PLLSOURCE_MSI)
1813  {
1814  /* Get MSI range source */
1815  if(READ_BIT(RCC->CR, RCC_CR_MSIRGSEL) == 0U)
1816  { /* MSISRANGE from RCC_CSR applies */
1817  msirange = READ_BIT(RCC->CSR, RCC_CSR_MSISRANGE) >> RCC_CSR_MSISRANGE_Pos;
1818  }
1819  else
1820  { /* MSIRANGE from RCC_CR applies */
1821  msirange = READ_BIT(RCC->CR, RCC_CR_MSIRANGE) >> RCC_CR_MSIRANGE_Pos;
1822  }
1823  /*MSI frequency range in HZ*/
1824  msirange = MSIRangeTable[msirange];
1825  }
1826 
1827  /* PLL_VCO = (HSE_VALUE or HSI_VALUE or MSI_VALUE) * PLLN / PLLM
1828  SYSCLK = PLL_VCO / PLLR
1829  */
1830  pllsource = READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC);
1831 
1832  switch (pllsource)
1833  {
1834  case RCC_PLLSOURCE_HSI: /* HSI used as PLL clock source */
1835  pllvco = HSI_VALUE;
1836  break;
1837 
1838  case RCC_PLLSOURCE_HSE: /* HSE used as PLL clock source */
1839  pllvco = HSE_VALUE;
1840  break;
1841 
1842  case RCC_PLLSOURCE_MSI: /* MSI used as PLL clock source */
1843  default:
1844  pllvco = msirange;
1845  break;
1846  }
1847  pllm = (READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLM) >> RCC_PLLCFGR_PLLM_Pos) + 1U ;
1848  pllvco = (pllvco * (READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos)) / pllm;
1849  pllr = ((READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLR) >> RCC_PLLCFGR_PLLR_Pos) + 1U ) * 2U;
1850  sysclockfreq = pllvco / pllr;
1851 
1852  return sysclockfreq;
1853 }

◆ RCC_SetFlashLatencyFromMSIRange()

static HAL_StatusTypeDef RCC_SetFlashLatencyFromMSIRange ( uint32_t  msirange)
static

Update number of Flash wait states in line with MSI range and current voltage range.

Parameters
msirangeMSI range value from RCC_MSIRANGE_0 to RCC_MSIRANGE_11
Return values
HALstatus

Definition at line 1716 of file stm32l4xx_hal_rcc.c.

1717 {
1718  uint32_t vos;
1719  uint32_t latency = FLASH_LATENCY_0; /* default value 0WS */
1720 
1721  if(__HAL_RCC_PWR_IS_CLK_ENABLED())
1722  {
1723  vos = HAL_PWREx_GetVoltageRange();
1724  }
1725  else
1726  {
1727  __HAL_RCC_PWR_CLK_ENABLE();
1728  vos = HAL_PWREx_GetVoltageRange();
1729  __HAL_RCC_PWR_CLK_DISABLE();
1730  }
1731 
1732  if(vos == PWR_REGULATOR_VOLTAGE_SCALE1)
1733  {
1734  if(msirange > RCC_MSIRANGE_8)
1735  {
1736  /* MSI > 16Mhz */
1737  if(msirange > RCC_MSIRANGE_10)
1738  {
1739  /* MSI 48Mhz */
1740  latency = FLASH_LATENCY_2; /* 2WS */
1741  }
1742  else
1743  {
1744  /* MSI 24Mhz or 32Mhz */
1745  latency = FLASH_LATENCY_1; /* 1WS */
1746  }
1747  }
1748  /* else MSI <= 16Mhz default FLASH_LATENCY_0 0WS */
1749  }
1750  else
1751  {
1752 #if defined(STM32L4R5xx) || defined(STM32L4R7xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx)
1753  if(msirange >= RCC_MSIRANGE_8)
1754  {
1755  /* MSI >= 16Mhz */
1756  latency = FLASH_LATENCY_2; /* 2WS */
1757  }
1758  else
1759  {
1760  if(msirange == RCC_MSIRANGE_7)
1761  {
1762  /* MSI 8Mhz */
1763  latency = FLASH_LATENCY_1; /* 1WS */
1764  }
1765  /* else MSI < 8Mhz default FLASH_LATENCY_0 0WS */
1766  }
1767 #else
1768  if(msirange > RCC_MSIRANGE_8)
1769  {
1770  /* MSI > 16Mhz */
1771  latency = FLASH_LATENCY_3; /* 3WS */
1772  }
1773  else
1774  {
1775  if(msirange == RCC_MSIRANGE_8)
1776  {
1777  /* MSI 16Mhz */
1778  latency = FLASH_LATENCY_2; /* 2WS */
1779  }
1780  else if(msirange == RCC_MSIRANGE_7)
1781  {
1782  /* MSI 8Mhz */
1783  latency = FLASH_LATENCY_1; /* 1WS */
1784  }
1785  /* else MSI < 8Mhz default FLASH_LATENCY_0 0WS */
1786  }
1787 #endif
1788  }
1789 
1790  __HAL_FLASH_SET_LATENCY(latency);
1791 
1792  /* Check that the new number of wait states is taken into account to access the Flash
1793  memory by reading the FLASH_ACR register */
1794  if(__HAL_FLASH_GET_LATENCY() != latency)
1795  {
1796  return HAL_ERROR;
1797  }
1798 
1799  return HAL_OK;
1800 }
return HAL_OK
uint32_t HAL_PWREx_GetVoltageRange(void)
Return Voltage Scaling Range.