STM32 강좌

STM32CubeMX - Clock Configuration 사용하기

plainy 0 8,847 2017.04.05 22:37

Clock Configuration은 STM32에서 사용되는 다양한 Clock을 생성할 수 있도록 PLL과 Prescaler의 설정을 도와주는 기능입니다.

 

STM32의 내부 Clock Tree는 복잡한 구조를 가지고 있습니다.

그중 가장 간단한 STM32F030의 Clock Tree입니다.

7853e8ee7dd1bfb2b9648e25dcc8e3e2_1491399393_0164.png
 

다양한 입력 Source가 있으며 이러한 Clock이 PLL을 거쳐 System Clock으로 사용되고 System Clock이 Prescaler를 거쳐 각 Peripheral의 Clock으로 사용되는 것을 알 수 있습니다.

이러한 PLL과 Prescaler의 값을 적절히 계산하여 알맞은 Clock이 사용되도록 설정하여야 STM32가 원활히 동작할 수 있습니다.

잘못된 계산으로 원하는 주파수보다 높거나 낮은 주파수가 입력되면 Peripheral이 정상적으로 동작하지 않을 수 있습니다.

 

 

 

STM32CubeMX이전에 사용하던 Standard Peripheral Library에서는 사용자가 직접 계산하여 Source Code의 값을 변경하였습니다.

 

아래는 Standard Peripheral Library의 Clock 설정 예입니다.

 

#ifdef STM32F10X_CL

    /* Configure PLLs ------------------------------------------------------*/

    /* PLL2 configuration: PLL2CLK = (HSE / 5) * 8 = 40 MHz */

    /* PREDIV1 configuration: PREDIV1CLK = PLL2 / 5 = 8 MHz */

        

    RCC->CFGR2 &= (uint32_t)~(RCC_CFGR2_PREDIV2 | RCC_CFGR2_PLL2MUL |

                              RCC_CFGR2_PREDIV1 | RCC_CFGR2_PREDIV1SRC);

    RCC->CFGR2 |= (uint32_t)(RCC_CFGR2_PREDIV2_DIV5 | RCC_CFGR2_PLL2MUL8 |

                             RCC_CFGR2_PREDIV1SRC_PLL2 | RCC_CFGR2_PREDIV1_DIV5);

  

    /* Enable PLL2 */

    RCC->CR |= RCC_CR_PLL2ON;

    /* Wait till PLL2 is ready */

    while((RCC->CR & RCC_CR_PLL2RDY) == 0)

    {

    }

    

   

    /* PLL configuration: PLLCLK = PREDIV1 * 9 = 72 MHz */ 

    RCC->CFGR &= (uint32_t)~(RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLSRC | RCC_CFGR_PLLMULL);

    RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLSRC_PREDIV1 | 

                            RCC_CFGR_PLLMULL9); 

#else    

    /*  PLL configuration: PLLCLK = HSE * 9 = 72 MHz */

    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE |

                                        RCC_CFGR_PLLMULL));

    RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL9);

#endif /* STM32F10X_CL */

 

    /* Enable PLL */

    RCC->CR |= RCC_CR_PLLON;

 

    /* Wait till PLL is ready */

    while((RCC->CR & RCC_CR_PLLRDY) == 0)

    {

    }

    

    /* Select PLL as system clock source */

    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));

    RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;    

 

    /* Wait till PLL is used as system clock source */

    while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x08)

    {

    }

 

이러한 작업을 편리하게 하기 위해 ST에서는 Clock값을 자동으로 계산해주는 Excel파일을 제작하여 배포하였습니다.

Clock Configuration 파일은 Crystal의 주파수와 원하는 Clock을 입력하면 중간의 PLL, Prescaler값을 계산해 주는 기능이 있습니다.

 

7853e8ee7dd1bfb2b9648e25dcc8e3e2_1491399409_331.png


 

 

 

STM32CubeMX 역시 이와 같이 Clock설정을 편리하게 할 수 있는 Clock Configuration 기능을 포함하고 있습니다.

 

Clock Configuration은 System Clock에 사용될 Source를 선택할 수 있으며 PLL값을 자동으로 계산해 주고 사용 범위를 벗어나는 Clock을 확인하여 수정할 수 있도록 도와줍니다.

또한 사용자가 설정한 내용은 Source Code로 만들어 지기 때문에 사용자는 Clock설정을 위한 Code를 작성할 필요가 없습니다.

 

 

Clock Configuration의 사용 방법은 다음과 같습니다.

 

 

Clock Source 설정

MCU에 사용될 Clock의 종류를 선택합니다.

외부 Crystal과 내부에 있는 HSI, PLL등을 선택할 수 있습니다. PLL은 HSE와 HSI를 입력 Source로 사용할 수 있습니다.

일반적으로 외부 Crystal을 PLL의 입력으로 사용하므로 PLL Source Mux는 HSE, System Clock Mux는 PLLCLK를 선택합니다.

(HSE는 RCC에서 Crystal로 선택해야 활성화 됩니다.

 

7853e8ee7dd1bfb2b9648e25dcc8e3e2_1491399417_6592.png



 

 

Clock 설정

사용하는 Crystal의 주파수를 입력합니다.

HCLK (Mhz)에는 사용하고자 하는 주파수를 입력합니다. 파란색으로 선택한 STM32에서 사용할 수 있는 최대 Clock속도가 표시됩니다. STM32F030의 최대 Clock인 48Mhz를 입력합니다.

원하는 Clock을 입력하면 PLL과 Prescaler의 값들이 자동으로 계산되어 변경되는 것을 확인할 수 있습니다.

사용자가 계산해야 하는 것을 STM32Cubemx가 대신해주고 있는 것입니다.

 

7853e8ee7dd1bfb2b9648e25dcc8e3e2_1491399425_4561.png



 

 

설정 오류 및 수정

Prescaler값 등이 잘못 되어 설정된 Clock이 사용범위를 벗어날 경우 오류가 발생된 부분을 빨간색으로 표시하여 잘못된 부분을 알려줍니다.

상세한 오류 내용을 확인하기 위해서는 오류가 발생된 부분에 마우스를 올려놓으면 내용을 확인할 수 있습니다.

STM32CubeMX V4.11.0 이상의 버전에서는 이와 같이 Clock설정이 잘못 되었을 경우 오류를 자동을 수정해 주는 기능이 추가되었습니다.

툴바의 빨간색 체크버튼을 누르거나 Clock Configuration 메뉴에서 Resolve Clock Issues​를 선택하면 자동으로 오류를 수정해 줍니다.

 


7853e8ee7dd1bfb2b9648e25dcc8e3e2_1491399433_029.png


 

 

Clock 값 변경 방지

Clock을 설정하다 보면 다른 Clock설정에 의해 먼저 설정된 값이 변경되는 경우가 있습니다.

이러한 문제를 방지하기 위해 먼저 설정된 값에 Lock을 설정할 수 있습니다.

Lock을 걸 Clock에서 마우스 오른쪽 버튼을 누르면 Lock, Unlock 메뉴가 나타나며 Lock을 걸 경우 해당 Clock은 회색으로 표시되어 변경할 수 없게 됩니다.

7853e8ee7dd1bfb2b9648e25dcc8e3e2_1491399440_581.png

 


Comments

Category
Facebook Twitter GooglePlus KakaoStory NaverBand