본문 바로가기
기타/정리되지 못한 임시 글

RCC(Reset Clock Controller) 기초 (1)

by [Akashic Records] 개발의선지자 2024. 4. 28.

※ 해당 글은 개인 공부 기록을 남겨놓는 것이 목적임으로 오류가 발생할수 있습니다.

    오류 또는 업데이트된 사항이 있다면 댓글로 알려주시면 감사하겠습니다.

    아래 글은 STM32F429ZI datasheet와 Reference manual를 기준으로 작성되었습니다.

  

RCC(Reset Clock Controller)는 STM32의 Reset과 Clock을 관장하는 장치이다.

 

RCC는  두 부분으로 나뉜다,

 

1.RTCCLK

2.SYSCLK : WATCHDOG 공급되는 2차 클럭과 GPIO, USART, TIM 등과 관련된  HCLK, PCLK , AHA, AHB에

공급되는 시스템 클럭

 

1) SYSCLK은 아래와 같이 대부분 HSI, HSE 사용한다.

HSI(High Speed Internal) clock

HSE(High Speed External) clock

 

HSI와 HSE는 PLL  또는 Prescaler를 통해 원하는 주파수로 변경 후 SYSTEM CLOCK(SYSCLK)으로 사용 한다.

 

SYSCLK 값을 이용하여 FCLK, HCLK, PCLK 값을 구할 수 있다.

 

  • FCLK : CPU에서 사용되는 Clcok
  • HCLK : AHB 버스에 사용되는 Clock으로 memory controller, interrrupt controller에 사용
  • PCLK : APB 버스에 사용되는 Clock으로 GPIO, UART, SPI 등에 사용된다.

2) SYSCLK가 아니라 부가 목적으로 사용되는 LSI, LSE clock이 있다. 일반적으로 RTC와 watchdog용도로 쓰인다.

 

LSI(Low Speed Internal) RC clock

LSE(Low Speed External) crystal clock 

 

3) 주요 내부 버스 

AHB( Advanced High Performance Bus ) - DMA, RCC, Flash Memory I/F, OTG 등이 연결됨. 사용 클럭 HCLK

APB2( Advanced Peripheral Bus 2 ) - UART1, ADC, TIM1, SPI1, GPIO, AFIO 등이 연결됨. 공급 클럭 PCLK 

APB1​( Advanced Peripheral Bus 1 ) - UART2, 3, TIM2, 3, 4, I2C, SPI2, 3 등이 연결됨. 공급 클럭 PCLK1

 

 

여기서는 RCC 레지스터 중 RCC_CFGR와 RCC_CR 레지스터를 다룰 것이다.

 

부가적으로 RCC_PLLCFGR , RCC_CIR , RCC_APB1RSTR,    RCC_APB1ENR, RCC_AHB1LPENR,   RCC_BDCR, RCC_CSR, RCC_SSCGR, RCC_PLLI2SCFGR 등 더 많은 레지스터들이 존재한다. 추가적으로 궁금하다면

레퍼런스를 참고 바란다.

 

1. RCC_CFGR 레지스터(RCC clock configuration register)

: 해당 레지스터를 어떻게 설정하느냐에 따라 어떤 클럭을 쓰고, 클럭 주파수와 분주비를 결정할수 있다.

 

비트 이름(위치) 설명 비트 설정
MCO2[31:30] Microcontroller clock output 2 00: System clock (SYSCLK) selected
01: PLLI2S clock selected
10: HSE oscillator clock selected
11: PLL clock selected
MCO2 PRE[29:27] MCO2 prescaler 0xx: no division
100: division by 2
101: division by 3
110: division by 4
111: division by 5
MCO1 PRE[26:24] MCO1 prescaler 0xx: no division
100: division by 2
101: division by 3
110: division by 4
111: division by 5
I2SSR[23] I2S clock selection 0: PLLI2S clock used as I2S clock source
1: External clock mapped on the I2S_CKIN pin used as I2S clock source
MCO[22:21] Microcontroller clock output 1 00: HSI clock selected
01: LSE oscillator selected
10: HSE oscillator clock selected
11: PLL clock selected
RTCPRE[20:16] HSE division factor for RTC clock 00000: no clock
00001: no clock
00010: HSE/2
00011: HSE/3
00100: HSE/4
11110: HSE/30
11111: HSE/31
PPRE2[15:13] APB high-speed prescaler (APB2) 0xx: AHB clock not divided
100: AHB clock divided by 2
101: AHB clock divided by 4
110: AHB clock divided by 8
111: AHB clock divided by 1
PPRE1[12:11] APB Low speed prescaler (APB1) 0xx: AHB clock not divided
100: AHB clock divided by 2
101: AHB clock divided by 4
110: AHB clock divided by 8
111: AHB clock divided by 16
HPRE[7:4] AHB prescaler 0xxx: system clock not divided
1000: system clock divided by 2
1001: system clock divided by 4
1010: system clock divided by 8
1011: system clock divided by 16
1100: system clock divided by 64
1101: system clock divided by 128
1110: system clock divided by 256
1111: system clock divided by 512
SWS[3:2] System clock switch status 00: HSI oscillator used as the system clock
01: HSE oscillator used as the system clock
10: PLL used as the system clock
11: not applicable
SW[1:0] System clock switch 00: HSI oscillator used as the system clock
01: HSE oscillator used as the system clock
10: PLL used as the system clock
11: not applicable

 

1) 내부 클럭 / 외부 클럭 선택

STM32는 클럭이 내부(HSI)/외부(HSE)로 나누어 진다. SYSCLK는 프로그래머가 어떻게 설정하느냐에 따라 3가지에

하드웨어적으로 자동 연결된다.

클럭 클럭 주파수 설명
HSI 16 MHZ 내부 RC 클
HSE 4 ~ 26MHZ 외부 오실레이터 클
PLLCLK ~ 180MHZ 프로그래머가 HSE 또는 HSI 둘 중 하나를 선택하여 파생된 클럭

 

 

2) SW 비트를 통해 SYSCLK 소스를 어떤 것을 사용할지 설정한다.

일반적으로 PLLCLK을 사용하므로 RCC_CFGR 레지스터의 SW 비트는 '10'으로 설정한다.

 

​3) AHB에 입력되는 클럭 분주는 1/1로 설정한다고 가정 시 ,  RCC_CFGR 레지스터의 HPRE 비트를 '0000'으로 설정한다.

 

4) APB1에 입력되는 클럭 분주는 1/2로 설정한다고 가정 시 , RCC_CFGR 레지스터의 PPRE1 비트를 '100'으로 설정한다.

5) APB2에 입력되는 클럭 분주는 1/1로 설정 가정 시,  RCC_CFGR 레지스터의 PPRE2 비트를  '000'으로 설정한다.

 

2. RCC_CR(RCC_Clock_control_register) :  클럭 온 오프 제어 레지스터

 

: 해당 레지스터를 제어함으로써

HSI와 HSE (0 bit - HSI) / (16 bits - HSE) 하고 enable 된 HSE 또는 HSI가 준비 될 때까지 기다리게 설정할수 있다.

 

또한 HSI 또는 HSE가 활성화 되면 PLL를 Enable 시킨 후, 준비가 될 때까지 기다리게 설정할수 있다.