STM32는 외부에서 입력된 Clock과 내부 발진회로에서 생성된 Clock을 사용하여 동작 될 수 있습니다.
System clock과 Peripheral에 정확한 Clock을 설정 하기 위해 STM32 내부에서 Clock이 어떻게 공급되는지 확인할 필요가 있습니다.
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을 제공합니다.
STM32에서 사용할 수 있는 Clock의 종류는 아래와 같습니다.
HSE (High Speed External) : STM32의 외부에서 입력되는 높은 주파수의 Clock으로 PLL을 거쳐 System Clock으로 입력됩니다. Crystal, Resonator와 같은 발진 소자를 사용하거나 외부 Clock Source 또는 Oscillator를 사용합니다.
HSI (High Speed External) : 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으로 사용할 경우 정확한 시간을 맞출 수 없습니다. 따라서 대략적인 시간을 확인하는 용도로만 사용하여야 합니다.
STM32CubeMX에서 Clock Source를 선택하고 System Clock을 설정하는 방법을 알아보겠습니다.
먼저 사용할 Clock Source를 선택하여야 합니다.
STM32CubeMX의 Pinout탭에서 RCC를 선택하여 HSE에 사용할 Clock Source를 선택합니다.
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의 설정 값이 자동으로 계산되어 변경됩니다.
STM32CubeMX에서 Code를 생성하면 아래와 같이 Clock 설정이 완료된 것을 확인할 수 있습니다.
/** System Clock Configuration
*/
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct;
RCC_ClkInitTypeDef RCC_ClkInitStruct;
__PWR_CLK_ENABLE();
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
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 = 15;
RCC_OscInitStruct.PLL.PLLN = 216;
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
RCC_OscInitStruct.PLL.PLLQ = 4;
HAL_RCC_OscConfig(&RCC_OscInitStruct);
HAL_PWREx_ActivateOverDrive();
RCC_ClkInitStruct.ClockType = 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;
HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5);
HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);
HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
/* SysTick_IRQn interrupt configuration */
HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
}
STM32를 사용하여 개발을 시작할 때 가장 먼저 설정해야 하는 부분이 Clock입니다.반대로 USART와 같은 통신 Peripheral의 동작이 올바르지 않을 경우 System Clock을 가장 먼저 확인 하시기 바랍니다.
PLM-100 RF Module (6) | 2016.12.12 |
---|---|
STM32F103VCT6 for MPU-9250 자이로 센서 StartUp (0) | 2016.09.26 |
[STM32F103VCT6] USART/FT232RL (0) | 2016.09.21 |
[STM32F103VCT6] LED on & off/Delay (0) | 2016.09.21 |
STM32F407VET6 UART (RS-232) (0) | 2016.09.12 |