안녕하세요.
오늘은 TC275의 Clock을 설정을 확인하고 직접 보드에서 Test해 보는 시간을 가져 보도록 하겠습니다.
Clock을 설정한다는 내용은 2가지를 의미하고 있습니다.
- PLL(Phase-Locked Loop)를 이용하여 외부오실레이터 주파수 20MHz를 200MHz로 높이는 설정수행
- 200MHz로 높여진 Clock을 주변기기들에 맞추어 알맞게 나누어 배분하는 설정 수행
참고로 이 글은 개발의 전체적인 내용을 연재하고 있는 글이 중에 하나입니다.
그래서, 앞에쓴 글을 보시면 더욱 도움이 되실것 같습니다.
아래 글을 링크 걸어둘께요. 필요하신 분은 한번 읽어 보세요.
(물론 이 글만 보셔도 크게 문제는 없습니다.)
1) 임베디드 SW, MCU에 대한 정리 (feat. 임베디드 SW 비전)
https://embeddedchallenge.tistory.com/210
2) MCU 개발 장비 구매 방법 정리 (인피니언 MCU TC275 Lite)
https://embeddedchallenge.tistory.com/211
3) 임베디드 SW 개발 환경 세팅 방법 정리 (소스코드 편집기, 컴파일러, 디버거 환경 설정 방법)
https://embeddedchallenge.tistory.com/212
4) 인피니언 IDE Tool 사용방법 정리 (프로젝트 생성 및 다운로드 수행)
https://embeddedchallenge.tistory.com/219
5) 인피니언 MCU LED Blinking (TC275 GPIO 설정)
https://embeddedchallenge.tistory.com/225
6) 인피니언 MCU Clock, 오실레이터 에 대한 이해 (TC275 보드에서 확인)
https://embeddedchallenge.tistory.com/226
그럼 지금부터 Clock을 PLL을 통해서 높여 보도록 하겠습니다.
그전에 PLL에 대해서 먼저 알아보는 시간을 가지도록 하겠습니다.
이전글에서 Clock과 오실레이터에 대해서 설명을 드렸습니다.
이제 TC275에 달린 20MHz의 외부 Clock을 어떻게 200MHz의 Clock으로 높이려고합니다.
이때 필요한 모듈이 PLL(Phase-Locked Loop)입니다.
1. PLL(Phase-Locked Loop)이란 무엇인가?
먼저 PLL을 위키에서 찾으면 내용은 아래와 같습니다.
https://ko.wikipedia.org/wiki/%EC%9C%84%EC%83%81%EB%8F%99%EA%B8%B0%ED%9A%8C%EB%A1%9C 위상동기회로(영어: Phase-Locked Loop, PLL)은 입력 신호와 출력신호에서 되먹임된 신호와의 위상차를 이용해 출력신호를 제어하는 시스템을 말한다. 입력된 신호에 맞추어 출력 신호의 주파수 조절이 목적이다. 되먹임 루프 인 현재 출력 신호의 주파수 디바이더 결과와 입력된 신호와의 위상차를 검출하고, 검출된 위상차를 오차로 판단하여 오차가 줄도록 VCO의 입력전압을 조절함으로써 출력 주파수를 변경하도록 조절한다. 입력과 출력의 되먹임 위상차가 동기되면 위상 잠금이 되고, 잠금 상태가 유지되도록 입력에 대한 출력의 주파수를 조절한다. 입력과 출력의 주파수 차이는 결국 주파수 디바이더 N에 따라 달라진다. N의 배수에 따라, 출력신호의 주파수는 입력신호의 주파수의 N배가 된다. 대부분의 PLL에서 입력에 비해 출력의 주파수가 높게 발진한다. |
내용이 조금 복잡해 보이네요. 조금 쉽게 설명해 보도록 하겠습니다.
FI는 Input 주파수 입니다. 우리 오실레이터는 20MHz를 만들어서 MCU에게 주고 이것인 PLL 모듈로 들어옵니다.
따라서 FI는 20MHz입니다.
Fo는 목표 주파수 입니다. 우리는 Clock을 200MHz로 만들려고 합니다.
Fo를 목표 주파수로 200MHz를 맞추기 위해서는 N을 10이라고 하면 될것 같습니다.
그렇다면 200MHz / 10 = 20MHz가 나오게 됩니다.
이것을 아래와 같이 Fd라고 하겠습니다.
위의 PLL Feedback 제어기는 FI의 값과 Fd의 값의 차이가 0이되도록 VCO서 계산하여 Fo를 발생시킬 것입니다.
그렇기 위해서는 Fo의 값을 200MHz로 만들것입니다.
피드백 제어기의 원리입니다.
그렇다면 우리는 PLL 레지스터에 N 과같은 값에 10을 넣어주면
200MHz가 나오게 될것이라는 생각이 듬니다.
그러면 이제 직접적으로 MCU안에 PLL 레지스터를 설정해 보도록 하겠습니다.
그렇다면 실제 아래와 같이 인피니언 Aurix MCU안에 들어가 있는 PLL 회로를 확인해 보도록 해요!
위의 그림을 보면 20MHz의 외부 오실레이터를 input으로 받아서 200MHz의 주파수를 만들어 내는 것을 볼수 있습니다.
수식은 아래와 같습니다.
결국 위의 회로는 피드백 회로 입니다.
이제 코드를 살펴 보도록 하겠습니다.
이전에 만들어진 프로젝트를 실행시켜 보시면
Configurations폴더안에 Ifx_Cfg.h 파일이 있는것을 확인하실 수 있습니다.
이 헤터파일에서 PLL의 Input과 Output값 설정이 가능합니다.
현재 AURIX Development Studio에서는
프로젝트를 생성하면 ILLD도 같이 생성이되어 연동이 됩니다.
ILLD는 Infineon Low Level Driver의 약자입니다.
Driver를 설게하기 위해서는 레지스터에 적절한 값을 넣어야 합니다.
수동으로 넣을수 있고, 위와 같이 인피니언에서 제공하는 Driver API를 이용하여 넣을수도 있습니다.
수동으로 넣는다는 것은
SCU_PLLCON0과 SCU_PLLCON1의 레지스터에 적절한 값을 넣어야 합니다.
이때 수동으로 하나하나씩 레지스터에 넣는 방법이 있습니다.
또는 Driver코드에서 우리가 원하는 input과 output값만 넣어주면
알아서 Driver코드에서 적절하게 넣어주는 방법이 있습니다.
ILLD는 후자를 지원합니다. 지금부터 어떻게 PLL이 설정이 되는지를 확인해 보도록 하겠습니다.
2. PLL(Phase-Locked Loop) 설정 수행
AURIX Development Studio를 설치하고 프로젝트를 생성하면
ILLD가 추가된 상태로 프로젝트가 생성이 됩니다.
따라서, 위의 input과 output값을 Ifx_Cfg.h 파일에서 설정하면
cfg 설정을 매개변수로 받아서, 적절하게 PLL레지스터를 초기화해 줍니다.
그렇다면 이제 PLL 레지스터가 어떻게 값을 초기화 했는지 확인해 보도록 하겠습니다.
Main 함수에 진입을 하였을떄, 아래와 같은 값을 가지는 것을 확인 할 수 있습니다.
그렇다면 이 값이 잘 설정이 되었는지를 확인해 보도록 하겠습니다.
위의 레지스터설정값을 보고 계산을 해면
200MHz = 60/(2*3)*20 = 200MHz가 됩니다.
N = NDIV + 1
P = PDIV + 1
K2 = K2DIV + 1
위에서 1씩 더하는 이유는 아래 내용에 근거합니다.
드디어 PLL 회로를 통하여 우리는 200MHz의 주파수를 만들어 낼수 있습니다.
Clock이 200MHz로 빠르니,
Clock에 맞추어 코드를 CPU가 가지고 오고, 해석하여 실행하는 속도가 더 빠를 것입니다.
그렇다면 이제 PLL로 만든 200MHz의 Clock을 CPU와 각각의 모듈에 연결하는 과정이 필요합니다.
이렇게 PLL로 만들게 되면,
이 200MHz를 적절히 나누고 주변기기로 분배하여 각각의 주변기기들이 Clock을 사용할수 있도록 합니다.
예를 들어 Clock들이 아래와 같이 나와 있네요.
모듈(주변기기)에서 사용할수 있는 최대 Clock이 있으니, 200MHz를 잘 나누어서 사용해야 합니다.
결국 아래와 같은 흐름으로 Clock이 분배 됩니다.
20MHz(외부 OSC) -> PLL을 거쳐 200MHz -> 이것을 CPU에서 사용하도록 연결, 그리고 200MHz를 적절히 나누어 주변기기가 사용할수 있는 Clock으로 나누어 분배
그렇다면 이제 Clock 분배를 직접 수행해 보도록 하겠습니다.
3. Clock 분배는 어떻게 설계가 되는 것일까?
Clock의 분배는 CCU (Clock Control Unit)이라는 모듈을 통해서 이루어 집니다.
따라서 CCU안에 적절한 레지스터 설정이 필요합니다.
모듈마다 사용가능한 최대 주파수가 존재합니다.
따라서, 이 주파수에 맞추어서 설정을 해주어야 합니다.
이것은 위의 ILLD Driver를 이용하여 주변기기가 사용할수 있는 최대 주파수 Clock에 맞추어
설정을 자동적으로 해줍니다.
아래 코드에서 자동적으로 설정을 해주고 있는것을 확인 할 수 있습니다.
해당된 최대 설정값은 아래와 같습니다.
fsource = 200MHz
fSRI = 200MHz
fSPB = 100MHz
fCPU0 = 200MHz
fCPU1 = 200MHz
fCPU2 = 200MHz
fFSI = 100MHz
fFSI2 = 200MHz
fSTM = 100MHz
fGTM = 100MHz
fCAN = 100MHz
그리고 ILLD는 역으로 레지스터값을 이용하여
적절하게 Clock값이 세팅이 되었는지도 확인이 가능합니다.
그것을 지금부터 확인해 보도록 하겠습니다.
아래와 같이 확인할 structure를 만들었습니다.
그리고 변수를 만들고
ILLD에서 제공하는 API를 통해서 Clock값이 제대로 세팅이 되었는지를 확인해 보도록 하겠습니다.
이제 값을 Debugger를 통해서 확인해 보도록 하겠습니다.
위에서 우리가 설정한 값과 동일한 값이 나오고 있는것을 알수 있습니다.
즉, ILLD Dirver에서 주변기기가 사용할수 있는 최대 Clock을 이미
CCU에 설정을 하여 최적화 한것을 확인 할 수 있습니다.
이제 Clock 세팅이 다 되었습니다.
이제부터 다음단계로 넘어가도록 하겠습니다.
'Embedded SW > [Infineon] TC275 Lite Project' 카테고리의 다른 글
스케줄링(scheduling)에 대한 정리, 인피니언 MCU Scheduler 설계 정리 (2) | 2021.11.18 |
---|---|
인피니언 MCU 인터럽트/Interrupt 설정 (TC275 동작 확인) (4) | 2021.11.17 |
인피니언 MCU Clock, 오실레이터 에 대한 이해 (TC275 보드에서 확인) (2) | 2021.11.15 |
인피니언 MCU LED Blinking (TC275 GPIO 설정) (0) | 2021.11.13 |
인피니언 IDE Tool 사용방법 정리 (프로젝트 생성 및 다운로드 수행) (0) | 2021.11.07 |
댓글