이번 포스팅은 NXP사의 MK22F MCU의 Clock에 대한 내용이다. 모든 내용은 MK22F의 Reference manual을 참고했다. 세부 모델명은 MK22FX512AVMC12 이다. (매뉴얼 : K22P121M120SF5V2RM) 제조사의 하나의 MCU 매뉴얼을 보고 정확히 분석하면 나머지는 거의 대부분 비슷하기 때문에 같은 시리즈의 MCU 활용에 많은 도움이 된다. 클럭 부분은 Kinetis series 모두 동일하다. (아마도 공통적인 부분은 다 똑같을 것 같다.) 포스팅 순서는 기능 및 레지스터를 먼저 분석하고 코드 직접 구현해 보는 방식으로 진행하려 한다.
Clock의 Block diagram에서는 색깔별로 영역을 나눠놨다.
•System oscillator : 시스템에 공급되는 Clock을 선택/제어하는 부분이다. 외부클럭, 내부클럭을 선택할 수 있다.(577page)
•RTC oscillator : 현실세계와 똑같은(거의 유사한) Real Time Clock 타이머에 사용하는 클럭, 보통 32.768kHz를 사용한다.
•PMC : Power Management Controller, MCU 내부의 전원을 관리/제어한다. 여기에 조금 독특한(?) 기능이 하나가 있다. VLLS0 모드를 제외한 모든 동작 상태에서 1kHz의 클럭을 공급해 준다. (일단 이 부분은 생략)
•MCG : Multipurpose Clock Generator, MCU Peripheral에 공급되는 Clock을 제어한다.
•SIM : System Integration Module, MCG에서 넘어온 Clock을 Peripheral에 공급하기 전 제어한다.
MCG에 공급되는 클럭은 외부클럭과 내부클럭 두가지 중 선택할 수 있고, Fast라고 하는 MHz단위의 클럭과 Slow라고 하는 kHz단위의 클럭을 선택할 수 있다. 이 부분은 거의 대부분의 MCU가 공통적이다. 외부 클럭의 Fast 보통 8~32 Mhz까지 공급가능하다. 더 높은 클럭을 지원하는 MCU도 있지만 보통 8 Mhz, 16 Mhz를 많이 사용한다. 보통 Slow는 32kHz, 32.768kHz를 의미한다.
클럭은 사람으로 치면 "심장"과 같은 역할을 하기 때문에 매우 중요하다. 클럭이 MCU의 모든 동작에 기준이 되기 때문에 가장 먼저 내부클럭(Internal Clock)을 사용할지 외부클럭(External Clock)을 사용할지 결정하고 Fast와 Slow를 선택해야 한다. 내부클럭을 IRC(Internal Reference Clock)라고 한다.
•내부, 외부 클럭 선택
외부 클럭을 사용할 경우 OSC_CR 레지스터에서 ERCLKEN bit를 set 시키고, IRC를 사용할 경우 MCG_C1의 IRCLKEN bit를 set 시킨다.
내부클럭과 외부클럭의 선택은 정확도와 부품단가의 타협이라고 할 수 있다. 외부클럭을 사용하게 되면 그만큼의 생산단가가 올라가기 때문이다.(OSC 부품이 꽤 비쌈) 하지만 그만큼 정밀도가 높다. 반대로 내부클럭을 사용하게 되면 부품 비용이 줄어들게 되지만 그만큼 정밀도가 낮아지는 단점이 있다. 이 둘중 어떤 것이 더 우선시 되어야 하는지 타협하면 된다.
클럭을 선택하는 case는 총 4가지가 있을 수 있다.
case 1. Fast, Slow 모두 Internal로 설정
case 2. Fast, Slow 모두 External로 설정
case 3. Fast는 Internal로, Slow는 External로 설정
case 4. Slow는 Internal로, Fast는 External로 설정
상황에 맞게 설정해 주면된다.
•내부 클럭 설정(Internal Reference Clock)
내부클럭은 4MHz와 32MHz중 선택할 수 있다. 4Mhz를 Fast, 32khz를 Slow로 표현한다. MCG_C2에서 IRCS bit로 설정할 수 있다.
Fast(4Mhz)로 설정한 경우 MCG_SC에서 FCRDIV를 설정해줘야 한다. 최고 4MHz부터 최저 32.25kHz까지 설정 가능하다.
•외부 클럭 설정(External Clock)
외부클럭을 사용할 경우 별도의 OSC회로 구성이 필요하다. NXP에서 제시하는 회로구성 방법은 총 3가지다.
Oscillator Mode | Connections |
Low-frequency(32kHz), low-power | Connection 1 |
Low-frequency(32kHz), high-gain | Connection 2 / Connection 3 |
High-frequency(3~32MHz), low-power | Connection 1 / Connection 3 |
High-frequency(3~32MHz), high-gain | Connection 2 / Connection 3 |
Oscillator mode 선택에 따라 회로구성이 달라진다. 회로는 한번 구성하면 변경이 어렵기 때문에 이 부분은 미리 정해놓아야 한다. Low-Frequency(32kHz), low-power를 제외한 모든 Mode 대응이 가능한 Connection 3번으로(가장 오른쪽 그림) 회로 구성을 하는 것이 일반적이다. 여기에 달리는 Load cap과 feedback register는 OSC 또는 Crystal의 데이터시트를 보고 확인해야 한다. (이 부분은 Hardware영역)
외부클럭을 사용하기위해서는 외부클럭 전용핀에 연결하고 레지스터를 활성화시켜줘야 한다.
PORTA의 18번과 19번이 EXTAL0, XTAL0 핀으로 기본할당 되어있다. 해당 핀을 ALT0기능으로 사용하기 위해 레지스터 설정을 변경해줘야 한다. 각 핀의 설정을 변경해 주는 레지스터는 PORTx_PCRn 레지스터다, (x는 A부터 E까지, n은 0부터 31까지)
모든 핀들은 ATL0가 기본 값이고 ATL1~7까지 설정할 수 있다. PORTA의 18번과 19번을 ALT0로 사용하기위해서는 bit8~10(MUX) 값을 0으로 해준다. 핀을 설정해 준 다음 PORT에 공급되는 클럭을 활성화시켜줘야 한다.
PORTA에 해당하는 bit 9번을 1로 set 시켜주면 된다.
내부클럭과 마찬가지로 외부클럭도 Fast와 Slow중 MCG에 공급할 클럭을 선택해줘야 한다. MCG_C7에서 OSCSEL 설정
지금까지 작성한 부분을 Block diagram에서 표시하면,
다음 포스팅에서는 SIM으로 공급되는 클럭을 설정하는 방법에 대해 알아보겠다!
- 끝 -
'Hardware&Firmware > NXP' 카테고리의 다른 글
[NXP][Kinetis] Kinetis 개발환경 구성하기, NXP MCU 개발하기, MCUXpresso 설치하 (0) | 2023.04.08 |
---|