STM32L4xx_HAL_Driver  1.14.0
UTILS Private functions

Functions

static uint32_t UTILS_GetPLLOutputFrequency (uint32_t PLL_InputFrequency, LL_UTILS_PLLInitTypeDef *UTILS_PLLInitStruct)
 Function to check that PLL can be modified. More...
 
static ErrorStatus UTILS_SetFlashLatency (uint32_t HCLK_Frequency)
 Update number of Flash wait states in line with new frequency and current voltage range. More...
 
static ErrorStatus UTILS_EnablePLLAndSwitchSystem (uint32_t SYSCLK_Frequency, LL_UTILS_ClkInitTypeDef *UTILS_ClkInitStruct)
 Function to enable PLL and switch system clock to PLL. More...
 
static ErrorStatus UTILS_PLL_IsBusy (void)
 Function to check that PLL can be modified. More...
 

Detailed Description

Function Documentation

◆ UTILS_EnablePLLAndSwitchSystem()

static ErrorStatus UTILS_EnablePLLAndSwitchSystem ( uint32_t  SYSCLK_Frequency,
LL_UTILS_ClkInitTypeDef UTILS_ClkInitStruct 
)
static

Function to enable PLL and switch system clock to PLL.

Parameters
SYSCLK_FrequencySYSCLK frequency
UTILS_ClkInitStructpointer to a LL_UTILS_ClkInitTypeDef structure that contains the configuration information for the BUS prescalers.
Return values
AnErrorStatus enumeration value:
  • SUCCESS: No problem to switch system to PLL
  • ERROR: Problem to switch system to PLL

Definition at line 805 of file stm32l4xx_ll_utils.c.

806 {
807  ErrorStatus status = SUCCESS;
808  uint32_t hclk_frequency;
809 
810  assert_param(IS_LL_UTILS_SYSCLK_DIV(UTILS_ClkInitStruct->AHBCLKDivider));
811  assert_param(IS_LL_UTILS_APB1_DIV(UTILS_ClkInitStruct->APB1CLKDivider));
812  assert_param(IS_LL_UTILS_APB2_DIV(UTILS_ClkInitStruct->APB2CLKDivider));
813 
814  /* Calculate HCLK frequency */
815  hclk_frequency = __LL_RCC_CALC_HCLK_FREQ(SYSCLK_Frequency, UTILS_ClkInitStruct->AHBCLKDivider);
816 
817  /* Increasing the number of wait states because of higher CPU frequency */
818  if(SystemCoreClock < hclk_frequency)
819  {
820  /* Set FLASH latency to highest latency */
821  status = UTILS_SetFlashLatency(hclk_frequency);
822  }
823 
824  /* Update system clock configuration */
825  if(status == SUCCESS)
826  {
827  /* Enable PLL */
830  while (LL_RCC_PLL_IsReady() != 1U)
831  {
832  /* Wait for PLL ready */
833  }
834 
835  /* Sysclk activation on the main PLL */
836  LL_RCC_SetAHBPrescaler(UTILS_ClkInitStruct->AHBCLKDivider);
837  LL_RCC_SetSysClkSource(LL_RCC_SYS_CLKSOURCE_PLL);
838  while (LL_RCC_GetSysClkSource() != LL_RCC_SYS_CLKSOURCE_STATUS_PLL)
839  {
840  /* Wait for system clock switch to PLL */
841  }
842 
843  /* Set APB1 & APB2 prescaler*/
844  LL_RCC_SetAPB1Prescaler(UTILS_ClkInitStruct->APB1CLKDivider);
845  LL_RCC_SetAPB2Prescaler(UTILS_ClkInitStruct->APB2CLKDivider);
846  }
847 
848  /* Decreasing the number of wait states because of lower CPU frequency */
849  if(SystemCoreClock > hclk_frequency)
850  {
851  /* Set FLASH latency to lowest latency */
852  status = UTILS_SetFlashLatency(hclk_frequency);
853  }
854 
855  /* Update SystemCoreClock variable */
856  if(status == SUCCESS)
857  {
858  LL_SetSystemCoreClock(hclk_frequency);
859  }
860 
861  return status;
862 }
__STATIC_INLINE void LL_RCC_PLL_Enable(void)
Enable PLL CR PLLON LL_RCC_PLL_Enable.
__STATIC_INLINE void LL_RCC_SetAPB2Prescaler(uint32_t Prescaler)
Set APB2 prescaler CFGR PPRE2 LL_RCC_SetAPB2Prescaler.
__STATIC_INLINE void LL_RCC_SetAHBPrescaler(uint32_t Prescaler)
Set AHB prescaler CFGR HPRE LL_RCC_SetAHBPrescaler.
__STATIC_INLINE uint32_t LL_RCC_GetSysClkSource(void)
Get the system clock source CFGR SWS LL_RCC_GetSysClkSource.
void LL_SetSystemCoreClock(uint32_t HCLKFrequency)
This function sets directly SystemCoreClock CMSIS variable.
__STATIC_INLINE uint32_t LL_RCC_PLL_IsReady(void)
Check if PLL Ready CR PLLRDY LL_RCC_PLL_IsReady.
__STATIC_INLINE void LL_RCC_SetAPB1Prescaler(uint32_t Prescaler)
Set APB1 prescaler CFGR PPRE1 LL_RCC_SetAPB1Prescaler.
static ErrorStatus UTILS_SetFlashLatency(uint32_t HCLK_Frequency)
Update number of Flash wait states in line with new frequency and current voltage range...
__STATIC_INLINE void LL_RCC_PLL_EnableDomain_SYS(void)
Enable PLL output mapped on SYSCLK domain PLLCFGR PLLREN LL_RCC_PLL_EnableDomain_SYS.
__STATIC_INLINE void LL_RCC_SetSysClkSource(uint32_t Source)
Configure the system clock source CFGR SW LL_RCC_SetSysClkSource.
assert_param(IS_RTC_WAKEUP_CLOCK(WakeUpClock))

◆ UTILS_GetPLLOutputFrequency()

static uint32_t UTILS_GetPLLOutputFrequency ( uint32_t  PLL_InputFrequency,
LL_UTILS_PLLInitTypeDef UTILS_PLLInitStruct 
)
static

Function to check that PLL can be modified.

Parameters
PLL_InputFrequencyPLL input frequency (in Hz)
UTILS_PLLInitStructpointer to a LL_UTILS_PLLInitTypeDef structure that contains the configuration information for the PLL.
Return values
PLLoutput frequency (in Hz)

Definition at line 733 of file stm32l4xx_ll_utils.c.

734 {
735  uint32_t pllfreq;
736 
737  /* Check the parameters */
738  assert_param(IS_LL_UTILS_PLLM_VALUE(UTILS_PLLInitStruct->PLLM));
739  assert_param(IS_LL_UTILS_PLLN_VALUE(UTILS_PLLInitStruct->PLLN));
740  assert_param(IS_LL_UTILS_PLLR_VALUE(UTILS_PLLInitStruct->PLLR));
741 
742  /* Check different PLL parameters according to RM */
743  /* - PLLM: ensure that the VCO input frequency ranges from 4 to 16 MHz. */
744  pllfreq = PLL_InputFrequency / (((UTILS_PLLInitStruct->PLLM >> RCC_PLLCFGR_PLLM_Pos) + 1U));
745  assert_param(IS_LL_UTILS_PLLVCO_INPUT(pllfreq));
746 
747  /* - PLLN: ensure that the VCO output frequency is between 64 and 344 MHz.*/
748  pllfreq = pllfreq * (UTILS_PLLInitStruct->PLLN & (RCC_PLLCFGR_PLLN >> RCC_PLLCFGR_PLLN_Pos));
749  assert_param(IS_LL_UTILS_PLLVCO_OUTPUT(pllfreq));
750 
751  /* - PLLR: ensure that max frequency at 120000000 Hz is reached */
752  pllfreq = pllfreq / (((UTILS_PLLInitStruct->PLLR >> RCC_PLLCFGR_PLLR_Pos) + 1U) * 2U);
753  assert_param(IS_LL_UTILS_PLL_FREQUENCY(pllfreq));
754 
755  return pllfreq;
756 }
assert_param(IS_RTC_WAKEUP_CLOCK(WakeUpClock))

◆ UTILS_PLL_IsBusy()

static ErrorStatus UTILS_PLL_IsBusy ( void  )
static

Function to check that PLL can be modified.

Return values
AnErrorStatus enumeration value:
  • SUCCESS: PLL modification can be done
  • ERROR: PLL is busy

Definition at line 764 of file stm32l4xx_ll_utils.c.

765 {
766  ErrorStatus status = SUCCESS;
767 
768  /* Check if PLL is busy*/
769  if(LL_RCC_PLL_IsReady() != 0U)
770  {
771  /* PLL configuration cannot be modified */
772  status = ERROR;
773  }
774 
775 #if defined(RCC_PLLSAI1_SUPPORT)
776  /* Check if PLLSAI1 is busy*/
777  if(LL_RCC_PLLSAI1_IsReady() != 0U)
778  {
779  /* PLLSAI1 configuration cannot be modified */
780  status = ERROR;
781  }
782 #endif /*RCC_PLLSAI1_SUPPORT*/
783 #if defined(RCC_PLLSAI2_SUPPORT)
784 
785  /* Check if PLLSAI2 is busy*/
786  if(LL_RCC_PLLSAI2_IsReady() != 0U)
787  {
788  /* PLLSAI2 configuration cannot be modified */
789  status = ERROR;
790  }
791 #endif /*RCC_PLLSAI2_SUPPORT*/
792 
793  return status;
794 }
__STATIC_INLINE uint32_t LL_RCC_PLLSAI2_IsReady(void)
Check if PLLSAI2 Ready CR PLLSAI2RDY LL_RCC_PLLSAI2_IsReady.
__STATIC_INLINE uint32_t LL_RCC_PLL_IsReady(void)
Check if PLL Ready CR PLLRDY LL_RCC_PLL_IsReady.
__STATIC_INLINE uint32_t LL_RCC_PLLSAI1_IsReady(void)
Check if PLLSAI1 Ready CR PLLSAI1RDY LL_RCC_PLLSAI1_IsReady.

◆ UTILS_SetFlashLatency()

static ErrorStatus UTILS_SetFlashLatency ( uint32_t  HCLK_Frequency)
static

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

Parameters
HCLK_FrequencyHCLK frequency
Return values
AnErrorStatus enumeration value:
  • SUCCESS: Latency has been modified
  • ERROR: Latency cannot be modified

Definition at line 602 of file stm32l4xx_ll_utils.c.

603 {
604  ErrorStatus status = SUCCESS;
605 
606  uint32_t latency = LL_FLASH_LATENCY_0; /* default value 0WS */
607 
608  /* Frequency cannot be equal to 0 */
609  if(HCLK_Frequency == 0U)
610  {
611  status = ERROR;
612  }
613  else
614  {
615  if(LL_PWR_GetRegulVoltageScaling() == LL_PWR_REGU_VOLTAGE_SCALE1)
616  {
617 #if defined(STM32L4R5xx) || defined(STM32L4R7xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx)
618  if(HCLK_Frequency > UTILS_SCALE1_LATENCY5_FREQ)
619  {
620  /* 100 < HCLK <= 120 => 5WS (6 CPU cycles) */
621  latency = LL_FLASH_LATENCY_5;
622  }
623  else if(HCLK_Frequency > UTILS_SCALE1_LATENCY4_FREQ)
624  {
625  /* 80 < HCLK <= 100 => 4WS (5 CPU cycles) */
626  latency = LL_FLASH_LATENCY_4;
627  }
628  else if(HCLK_Frequency > UTILS_SCALE1_LATENCY3_FREQ)
629  {
630  /* 60 < HCLK <= 80 => 3WS (4 CPU cycles) */
631  latency = LL_FLASH_LATENCY_3;
632  }
633  else if(HCLK_Frequency > UTILS_SCALE1_LATENCY2_FREQ)
634  {
635  /* 40 < HCLK <= 20 => 2WS (3 CPU cycles) */
636  latency = LL_FLASH_LATENCY_2;
637  }
638  else
639  {
640  if(HCLK_Frequency > UTILS_SCALE1_LATENCY1_FREQ)
641  {
642  /* 20 < HCLK <= 40 => 1WS (2 CPU cycles) */
643  latency = LL_FLASH_LATENCY_1;
644  }
645  /* else HCLK_Frequency <= 10MHz default LL_FLASH_LATENCY_0 0WS */
646  }
647 #else
648  if(HCLK_Frequency > UTILS_SCALE1_LATENCY4_FREQ)
649  {
650  /* 64 < HCLK <= 80 => 4WS (5 CPU cycles) */
651  latency = LL_FLASH_LATENCY_4;
652  }
653  else if(HCLK_Frequency > UTILS_SCALE1_LATENCY3_FREQ)
654  {
655  /* 48 < HCLK <= 64 => 3WS (4 CPU cycles) */
656  latency = LL_FLASH_LATENCY_3;
657  }
658  else if(HCLK_Frequency > UTILS_SCALE1_LATENCY2_FREQ)
659  {
660  /* 32 < HCLK <= 48 => 2WS (3 CPU cycles) */
661  latency = LL_FLASH_LATENCY_2;
662  }
663  else
664  {
665  if(HCLK_Frequency > UTILS_SCALE1_LATENCY1_FREQ)
666  {
667  /* 16 < HCLK <= 32 => 1WS (2 CPU cycles) */
668  latency = LL_FLASH_LATENCY_1;
669  }
670  /* else HCLK_Frequency <= 16MHz default LL_FLASH_LATENCY_0 0WS */
671  }
672 #endif
673  }
674  else /* SCALE2 */
675  {
676 #if defined(STM32L4R5xx) || defined(STM32L4R7xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx)
677  if(HCLK_Frequency > UTILS_SCALE2_LATENCY2_FREQ)
678  {
679  /* 16 < HCLK <= 26 => 2WS (3 CPU cycles) */
680  latency = LL_FLASH_LATENCY_2;
681  }
682  else
683  {
684  if(HCLK_Frequency > UTILS_SCALE2_LATENCY1_FREQ)
685  {
686  /* 8 < HCLK <= 16 => 1WS (2 CPU cycles) */
687  latency = LL_FLASH_LATENCY_1;
688  }
689  /* else HCLK_Frequency <= 8MHz default LL_FLASH_LATENCY_0 0WS */
690  }
691 #else
692  if(HCLK_Frequency > UTILS_SCALE2_LATENCY3_FREQ)
693  {
694  /* 18 < HCLK <= 26 => 3WS (4 CPU cycles) */
695  latency = LL_FLASH_LATENCY_3;
696  }
697  else if(HCLK_Frequency > UTILS_SCALE2_LATENCY2_FREQ)
698  {
699  /* 12 < HCLK <= 18 => 2WS (3 CPU cycles) */
700  latency = LL_FLASH_LATENCY_2;
701  }
702  else
703  {
704  if(HCLK_Frequency > UTILS_SCALE2_LATENCY1_FREQ)
705  {
706  /* 6 < HCLK <= 12 => 1WS (2 CPU cycles) */
707  latency = LL_FLASH_LATENCY_1;
708  }
709  /* else HCLK_Frequency <= 6MHz default LL_FLASH_LATENCY_0 0WS */
710  }
711 #endif
712  }
713 
714  LL_FLASH_SetLatency(latency);
715 
716  /* Check that the new number of wait states is taken into account to access the Flash
717  memory by reading the FLASH_ACR register */
718  if(LL_FLASH_GetLatency() != latency)
719  {
720  status = ERROR;
721  }
722  }
723  return status;
724 }
__STATIC_INLINE uint32_t LL_PWR_GetRegulVoltageScaling(void)
Get the main internal regulator output voltage CR1 VOS LL_PWR_GetRegulVoltageScaling.
__STATIC_INLINE uint32_t LL_FLASH_GetLatency(void)
Get FLASH Latency FLASH_ACR LATENCY LL_FLASH_GetLatency.
__STATIC_INLINE void LL_FLASH_SetLatency(uint32_t Latency)
Set FLASH Latency FLASH_ACR LATENCY LL_FLASH_SetLatency.