STM32 강좌

STM32 Clock - 클럭 소스와 클럭 설정

plainy 3 27,412 2017.04.05 23:52

STM32는 외부에서 입력된 Clock과 내부 발진회로에서 생성된 Clock을 사용하여 동작 될 수 있습니다.

 

System clock과 Peripheral에 정확한 Clock을 설정 하기 위해 STM32 내부에서 Clock이 어떻게 공급되는지 확인할 필요가 있습니다.

 

STM32 Clock Tree

Clock Tree는 STM32 내부의 Clock흐름을 보여줍니다.

다음은 STM32F42x, 43x의 Clock Tree입니다.

Clock Source에서 공급된 Clock은 PLL, Prescaler등을 거쳐 Core와 Ethernet등에 사용되며 AHB(Advanced High-performance Bus), APB(Advanced Peripheral Bus)에도 Clock을 제공합니다.

 

220f5d5b3a25fe3f18fc6ae70530e7a2_1491403896_2014.png

 

STM32 Clock Source

STM32에서 사용할 수 있는 Clock의 종류는 아래와 같습니다.

 

HSE (High Speed External) : STM32의 외부에서 입력되는 높은 주파수의 Clock으로 PLL을 거쳐 System Clock으로 입력됩니다. Crystal, Resonator와 같은 발진 소자를 사용하거나 외부 Clock Source 또는 Oscillator를 사용합니다.


HSI (High Speed Internal) : STM32에 내장되어 있는 RC발진 회로로 전원 인가 시 처음 동작하는 Clock입니다. 8Mhz 또는 16Mhz의 주파수를 가지고 있으며 출하 시 1%오차율을 가지도록 Calibration됩니다. 그러나 RC발진회로의 특성 상 온도에 따라 오차가 발생할 수 있습니다. 높은 정확성을 필요로 하지 않는 제품 개발 시 Main Clock으로 사용하면 외부 Crystal을 사용하지 않아도 되기 때문에 단가를 낮출 수 있습니다.

LSE (Low Speed External) : RTC에 사용되는 Clock으로 정확한 시간을 맞추기 위한 용도로 사용됩니다. 일반적으로 32.768kHz의 Crystal을 사용합니다.

LSI (Low Speed Internal) : LSI는 내장된 RC발진회로의 Clock으로 저전력 모드에서 동작할 수 있기 때문에 Independent Watchdog과 AWU(Auto Wakeup)의 Clock으로 사용될 수 있습니다. 또한 RTC의 Clock으로 사용될 수 있습니다.
HSI와 달리 오차율이 크기 때문에 RTC Clock으로 사용할 경우 정확한 시간을 맞출 수 없습니다. 따라서 대략적인 시간을 확인하는 용도로만 사용하여야 합니다.

 

220f5d5b3a25fe3f18fc6ae70530e7a2_1491403904_8801.png

 

 

STM32CubeMX에서 Clock 설정하기

STM32CubeMX에서 Clock Source를 선택하고 System Clock을 설정하는 방법을 알아보겠습니다.

먼저 사용할 Clock Source를 선택하여야 합니다. 

STM32CubeMX의 Pinout탭에서 RCC를 선택하여 HSE에 사용할 Clock Source를 선택합니다.

 

220f5d5b3a25fe3f18fc6ae70530e7a2_1491403912_6552.png



BYPASS Clock Source : Oscillator 또는 Pulse신호와 같은 외부 Clock Source를 사용할 경우

Crystal/Ceramic Resonator : Crystal과 Resonator를 사용할 경우

 

Clock Configuration탭에서는 STM32의 Clock Tree를 아래와 같은 그림으로 보여주어 쉽게 설정할 수 있도록 도와줍니다.

HSE를 사용할 경우 외부 Clock의 주파수를 입력합니다.

PLL Source Mux에서 PLL에 사용할 Source를 선택합니다.

System Clock Mux에서 System Clock에 사용할 Source를 선택합니다.

HCLK는 AHB Clock으로 내부 고속 BUS의 동작 주파수입니다. STM32가 동작되는 Clock과 동일합니다.

HCLK에 원하는 동작 주파수를 입력합니다. 

모든 설정을 마치고 HCLK에 동작 주파수를 입력하면 Main PLL의 설정 값이 자동으로 계산되어 변경됩니다.

220f5d5b3a25fe3f18fc6ae70530e7a2_1491403919_9293.png



 

 

 

STM32CubeMX에서 Code를 생성하면 아래와 같이 Clock 설정이 완료된 것을 확인할 수 있습니다.

 

  1. /** System Clock Configuration
  2. */
  3. void SystemClock_Config(void)
  4. {
  5. RCC_OscInitTypeDef RCC_OscInitStruct;
  6. RCC_ClkInitTypeDef RCC_ClkInitStruct;
  7. __PWR_CLK_ENABLE();
  8. __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
  9. RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  10. RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  11. RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  12. RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  13. RCC_OscInitStruct.PLL.PLLM = 15;
  14. RCC_OscInitStruct.PLL.PLLN = 216;
  15. RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
  16. RCC_OscInitStruct.PLL.PLLQ = 4;
  17. HAL_RCC_OscConfig(&RCC_OscInitStruct);
  18. HAL_PWREx_ActivateOverDrive();
  19. RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1
  20. |RCC_CLOCKTYPE_PCLK2;
  21. RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  22. RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  23. RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
  24. RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;
  25. HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5);
  26. HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);
  27. HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
  28. /* SysTick_IRQn interrupt configuration */
  29. HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
  30. }

STM32를 사용하여 개발을 시작할 때 가장 먼저 설정해야 하는 부분이 Clock입니다.

System Clock을 올바르게 설정하여야 I2C, USB, USART와 같은 ​통신 Peripheral과 Timer가 정상적으로 동작합니다.

반대로 USART와 같은 통신 Peripheral의 동작이 올바르지 않을 경우 System Clock을 가장 먼저 확인 하시기 바랍니다.

설정된 Clock의 확인은 MCO핀을 사용하면 쉽게 확인할 수 있습니다.

 

Comments

Embed 2017.04.25 13:16
2번째 HSI의 설명이 HSE와 똑같습니다. INTERNAL로바꾸셔야할거같아요
plainy 2017.04.27 09:41
아. 그러네요.. 감사합니다.
임베디드초보 03.18 15:02
큐브로 설정한거말고 설정된 소스만 보고 몇 Hz로 도는지 알수있는방법있을까요??
Category
Facebook Twitter GooglePlus KakaoStory NaverBand