본문 바로가기

STM32

STM32 clock

STM32의 Clock Configuration 에 대해 정리해봅니다.

보유중인 STM32F446xC/E 기준.

Clock 소스

HSE (High Speed External)

외부에서 입력되는 고주파 Clock으로, Crystal, Resonator, 또는 외부 Clock source나 Oscillator를 사용합니다.

PLL을 거쳐 System Clock으로 입력됩니다.

HSE

 

HSI (Hight Speed Internal)

STM32에 내장된 RC 발진 회로로, 전원 인가 시 처음 동작하는 Clock입니다.

일반적으로 8MHz 또는 16MHz 주파수를 가집니다.

HSI

 

LSE (Low Speed External)

RTC(Real-Time Clock)에 사용되며 정확한 시간을 맞추기 위한 용도로, 주로 32.768kHz Crystal을 사용합니다.

LSE

 

LSI (Low Speed Internal)

내장 RC 발진 회로의 Clock으로, 저전력 모드에서 사용됩니다.

Independent Watchdog, AWU(Auto Wakeup)의 Clock으로 사용될 수 있습니다.

RTC의 Clock으로 사용될 수 있으나 정확도가 낮습니다. (아래의 그림과 표 참조)

LSI

 

community.st.com

Clock의 구성 요소

PLL (Phase-Locked Loop)

선택된 Clock 소스의 주파수를 조정하여 시스템에 필요한 주파수를 생성합니다.

 

SYSCLK (System Clock)

시스템의 주 Clock으로, HSI, HSE, two main PLL 소스에서 나올 수 있습니다.


HCLK (AHB Clock)

코어와 메모리에 공급되는 Clock입니다.

 

PCLK1, PCLK2 (APB Clocks)

주변 장치에 공급되는 Clock입니다.

AHB HCLK APB PCLK
RM0390 Clock tree

Clock 설정 과정

  1. HSE, HSI 등에서 Clock 소스를 선택합니다.
  2. 선택된 소스를 기반으로 PLL을 구성하여 원하는 주파수를 생성합니다.
  3. SYSCLK, HCLK, PCLK 등의 시스템 Clock을 설정합니다.
  4. 필요한 주변장치의 Clock을 활성화 합니다.

STM32CubeMX 툴을 사용하면 Clock Configuration 탭에서 시각적으로 Clock Tree를 확인하고 설정할 수 있습니다.

 

  1. HSE를 사용할 경우 외부 Clock의 주파수를 입력합니다.
  2. PLL Source Mux에서 PLL에 사용할 Source를 선택합니다.
  3. System Clock Mux에서 System Clock에 사용할 Source를 선택합니다.
  4. HCLK에 원하는 동작 주파수를 입력하면 Main PLL의 설정 값이 자동으로 계산되어 변경됩니다.

 

Clock Configuration code

/**
  * @brief System Clock Configuration
  * @retval None
  */
void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

  /** Configure the main internal regulator output voltage
  */
  __HAL_RCC_PWR_CLK_ENABLE();
  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);

  /** Initializes the RCC Oscillators according to the specified parameters
  * in the RCC_OscInitTypeDef structure.
  */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLM = 4;
  RCC_OscInitStruct.PLL.PLLN = 180;
  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
  RCC_OscInitStruct.PLL.PLLQ = 2;
  RCC_OscInitStruct.PLL.PLLR = 2;
  
  /** 필요한 Clock enable, ready 상태 대기, 필요한 PLL 설정
  */
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }

  /** Activate the Over-Drive mode
  */
  if (HAL_PWREx_EnableOverDrive() != HAL_OK)
  {
    Error_Handler();
  }

  /** Initializes the CPU, AHB and APB buses clocks
  */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;

  /** CPU initialize, AHB, APB bus prescaler 설정, 
  * system clock source 선택, systick timer 시작
  */
  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK)
  {
    Error_Handler();
  }
}

 

STM32의 Clock Tree의 구성할 때 주의점

  • 애플리케이션의 요구사항에 맞는 적절한 Clock 소스를 선택해야 합니다. 예를 들어, 높은 정확도가 필요한 경우 HSE를 사용하고, 저전력 응용에는 LSI를 고려할 수 있습니다.
  • PLL을 사용하여 원하는 시스템 Clock 주파수를 생성할 때, 입력 주파수와 분주비를 신중하게 선택하여 원하는 출력 주파수를 정확히 얻어야 합니다.
  • 각 주변장치(USART, I2C 등)의 요구사항에 맞는 Clock 주파수를 제공해야 합니다. 특히 통신 인터페이스의 경우 정확한 baud rate 설정을 위해 주의가 필요합니다.
  • 불필요한 Clock을 비활성화하고, 저전력 모드 사용 시 적절한 저속 Clock 소스를 선택하여 전력 소비를 최소화해야 합니다.
  • HSE 사용 시 외부 Crystal의 안정화 시간을 고려해야 하며, PLL lock 시간도 고려해야 합니다.
  • 복잡한 시스템에서는 Clock Tree 구성 시 각 컴포넌트에 도달하는 Clock 신호의 시간 차이(Skew)를 최소화해야 합니다.
  • HSI와 같은 내부 RC 발진기 사용 시 온도 변화에 따른 주파수 변동을 고려해야 합니다.
  • USB 통신을 사용하는 경우 48MHz의 정확한 Clock이 필요하므로, 이를 위한 적절한 PLL 설정이 필요합니다.
  • 리셋 후 기본적으로 HSI가 활성화되어 있음을 인지하고, 원하는 Clock 소스로 전환하는 과정을 올바르게 구현해야 합니다.
  • 검증 및 테스트: Clock 설정 후 실제 동작을 검증하고, 다양한 조건에서 안정성을 테스트해야 합니다.

참고

https://community.st.com/t5/stm32-mcus/part-1-introduction-to-the-stm32-microcontroller-clock-system/ta-p/605369

https://community.st.com/t5/stm32-mcus/part-2-introduction-to-the-stm32-microcontroller-clock-system/ta-p/624125

 

'STM32' 카테고리의 다른 글

OLED display 128x32  (0) 2025.02.28
FreeRTOS - STM32F4 포팅 정보 확인  (0) 2025.01.14
FreeRTOS 와 Zephyr 비교  (0) 2025.01.13
STM32CubeIDE 에서 FreeRTOS 선택 시 차이  (0) 2025.01.13
FreeRTOS Task priority  (0) 2025.01.13