Pages List
List view
STM32 Peripheral
Clock & PLL
SYSCLK (System Clock)
System Clock은 HSI 오실레이터, HSE 오실레이터, PLL로부터 얻을 수 있다.
LSI/LSE Clock은 RTC나 Watchdog 등에 사용된다.
별도의 Clock을 설정하지 않으면, HSI(16MHz)가 System Clock source로 사용된다.
다음은 HSI를 System Clock Source로 사용할 때, 주의해야할 사항들이다.
STM32 Cube의 Clock Handling APIs는 RCC driver file에 모여있다.
Understanding Methods to Configure the SYSCLK
이제 System Clock을 Configuring하는 방법에 대해 알아보자.
SYSCLK Configuring은 다음 2개의 Clock Handling APIs로 수행된다.
HSE를 사용해서 SYSCLK, HCLK, PCLK를 설정하는 예제
[ STM32F407 ]
[ Arduino ]
[ 실행 결과 ]
① “stm32f4xx_hal_conf.h”에서 HSE_VALUE를 직접 입력해 주어야 한다.
Crystal 오실레이터의 주파수를 측정할 수 있는 하드웨어가 없기 때문에, User는 MCU에게 HSE의 값을 알려주어야 한다.
이 값을 기초로 “HAL_RCC_GetSysClockFreq”, “HAL_RCC_GetHCLKFreq” 등의 API가 수행된다.
② HAL_RCC_ClockConfig API의 Flash Latency는 다음과 같이 설정한다.
Flash memory로부터 정상적으로 data를 read하기 위해서는 wait states의 수(Latency)가 반드시 FLASH_ACR에 Program되어야 한다. Device 공급 전압과 HCLK에 따라서.(Flash memory는 HCLK로 동작하기 때문)
③ 변경된 HCLK에 알맞게 HAL_SYSTICK_Config API로 1ms에 대응하는 Tick값을 설정한다.
HAL_SYSTICK_Config의 인자는 TicksNumb인데, 이 값은 SysTick Interrupt의 발생 간격(Tick)을 의미한다.
앞에서 HCLK를 4MHz로 설정했으므로 1Tick에 해당하는 시간은 다음과 같이 계산할 수 있다.
0.25us (=1/4MHz) ←→ 1 Tick. 그러면, 1ms에 해당하는 Tick은 4000Tick (1ms → 4000 Tick)
4000을 그대로 API에 하드코딩해서 전달할 수 있지만, HAL_RCC_GetHCLKFreq API를 사용하면 쉽게 HCLK값을 얻을 수 있다.
HSI Calibration
HSI 오실레이터는 상온(25℃)에서 ±1%의 오차를 갖고, -40℃ ~ +105℃ 에서는 오차가 더 커진다.
System Clock의 Source에 오차가 커질 수록, MCU의 Peripheral들이 정상적으로 동작하지 못할 가능성이 커진다. (UART 송수신에 Error가 더 많이 발생한다던지 등등)
Run Time에서 HSI 오실레이터의 오차를 보정할 수 있는 방법이 존재한다.
다음 그림에서 처럼 RCC_CR 레지스터에서 HSI의 주파수를 보정할 수 있다.
HSITRIM[4:0]에는 상온(25℃)에서 16MHz±1%의 오차를 갖도록 공장 초기화 값인 16(0b1_0000)이 들어가 있다.
주파수의 정확도를 더 높이고 싶다면, 이 값을 더 크게 하거나 작게 하면 된다.
HSITRIM의 값을 바꾸면 나타나는 효과는 다음과 같다.
PLL (Phase Locked Loop)
HSI 또는 HSE를 PLL input으로 사용하여 다음과 같은 HCLK을 만드는 예제
① HSI를 PLL input으로 사용하는 경우
[ STM32F407 ]
[ Arduino ]
[ 실행 결과 ]
② HSE를 PLL input으로 사용하는 경우
[ STM32F407 ]
[ Arduino ]
[ 실행 결과 ]
HSI를 PLL input으로 테스트했을 때의 결과와 동일하다.
[ STM32F407의 경우 ]
STM32F407은 최고 주파수인 168MHz로 동작하기 위해서는 PWR_CR 레지스터의 VOS bit값이 1이어야 한다. 그러나 VOS bit의 Default value가 1이라서 따로 설정할 필요가 없다.
[ STM32F446의 경우 ]
그러나 STM32F446의 경우에는 최고 주파수인 180MHz로 동작하기 위해서는 PWR(Power Controller)에서 Over-drive를 Enable하고, VOS bit로 Power Scale 설정을 해주어야 한다.
< Kiran은 강의에서 STM32F446을 사용하므로 위와 같이 HAL Macro함수로 언급한 부분을 설정하였다. >
Clock & PLLSYSCLK (System Clock)Understanding Methods to Configure the SYSCLKHSE를 사용해서 SYSCLK, HCLK, PCLK를 설정하는 예제[ STM32F407 ][ Arduino ][ 실행 결과 ]HSI CalibrationPLL (Phase Locked Loop)HSI 또는 HSE를 PLL input으로 사용하여 다음과 같은 HCLK을 만드는 예제① HSI를 PLL input으로 사용하는 경우[ STM32F407 ][ Arduino ][ 실행 결과 ]② HSE를 PLL input으로 사용하는 경우[ STM32F407 ][ Arduino ][ 실행 결과 ][ STM32F407의 경우 ][ STM32F446의 경우 ]