본문 바로가기
임베디드SW/TC275 Lite Kit for 임베디드

PWM을 임베디드 SW 세계로 바라보자 - 구현편 (1)

by 바이너리 임베디드 2021. 12. 8.

PWM을 임베디드 SW 세계로 바라보자 - 구현편 (1)


저번 편에서는 PWM이 무엇인지 이론 편을 보았다면 오늘은 PWM 구현을 한번 해보도록 하겠습니다.
구현 방법은 Aurix에서 제공해주는 PWM Example Code를 Import 해보고 Code를 분석해보는 형태로 진행하겠습니다. 빠르게 지체하지 말고 바로 시작해보죠!! 고고!!

 


GTM_TOM_PWM_1_KIT_TC275_LK 프로젝트를 Import

 

 



File >> Import >> Infineon >>  AURIX Development Studio Project를 선택해봅시다.

PWM을 임베디드 SW 세계로 바라보자 - 구현편 (1)



GTM_TOM_PWM_1_KIT_TC275_LK를 입력하여 프로젝트를 생성해봅시다.

PWM을 임베디드 SW 세계로 바라보자 - 구현편 (1)



그럼 CPU0_Main.c에서 initGtmTomPwm() 함수가 보입니다.
GTM 모듈을 사용하기 위해 초기화해주는 함수라는 생각이 딱 듭니다.
보통 임베디드 SW를 짜기 위해 while (1) 문을 들어가기 전에 페리페럴을 초기화해주는 것이 일반적입니다.
이 예제 코드에서도 일반적인 형태를 띠고 있습니다.
그럼 한번 들어가 보겠습니다!!

PWM을 임베디드 SW 세계로 바라보자 - 구현편 (1)

 

 



GTM 클럭 세팅을 알아보자




초기화해주는 initGtmTomPwm() 함수는 GTM_TOM_PWM.c 파일에 정의가 되어있습니다.

PWM을 임베디드 SW 세계로 바라보자 - 구현편 (1)


IfxGtm_enable(&MODULE_GTM); 
 >> GTM 모듈을 Enable 시키는 API입니다. 

IfxGtm_Cmu_enableClocks(&MODULE_GTM, IFXGTM_CMU_CLKEN_FXCLK);
 >>  CMU의 Fixed Clock을 Enable 시키는 API라고 하는데 한번 깊숙이 후벼 파 봅시다.


PWM을 임베디드 SW 세계로 바라보자 - 구현편 (1)

 

PWM을 임베디드 SW 세계로 바라보자 - 구현편 (1)
PWM을 임베디드 SW 세계로 바라보자 - 구현편 (1)




IFXGTM_CMU_CLKEN_FXCLK은 0x00800000으로 정의되어있습니다.

이 값을 위에 보이는 레지스터에 Write 하고 있는 코드입니다.
의미를 살펴보니 모든 CMU_FXCLK을 Enable 시키는 것입니다.
CMU에 대해 한번 알아볼까요? 
아래에 CMU Block Diagram이 있습니다.
오른쪽 아래에 보이는 CMU_FXCLK0 ~ CMU_FXCLK4까지 5개 전부를 Enable 한다는 것이군요.

PWM을 임베디드 SW 세계로 바라보자 - 구현편 (1)



흠 그런데 말입니다... 그렇다고 해도 CMU_FXCLK0 ~ 4번의 Frequency가 MHz인지 도통 감이 오질 않습니다.
천천히 다시 한번 살펴보도록 하겠습니다.

SYS_CLK이 가장 원천수라고 보면 될 것 같습니다. 

이 녀석의 Frequency가 얼마인지 살펴보아야겠습니다.
Clocking System 다이어그램을 살펴보면 GTM 모듈에는 SPB와 GTM 두 가지 클럭이 들어가고 있습니다.

PWM을 임베디드 SW 세계로 바라보자 - 구현편 (1)


이 두 가지 클럭이 이전 글에서 100 MHz로 Frequency를 갖고 있는 것을 확인했습니다.
아래 링크를 참고하세요.

https://cookbook.tistory.com/23

그래서 SYS_CLK으로 들어오는 주파수는 100 MHz인 것을 확인했습니다.

그럼 두 번째 만나는 부분이 Global Clock Divider입니다. 100 MHz를 얼마로 나눠 주고 있는지 한번 확인해봅시다.
Global Clock Divider 세팅을 해줄 수 있는 레지스터는 CMU_GCLK_NUM이고 아래에 있습니다.
디버거로 while(1) 문 직전 Break를 잡아놓고 현재 GCLK_NUM값이 얼마인지 살펴보았습니다.
현재 1로 세팅되어 있는 것을 확인할 수 있었습니다.

PWM을 임베디드 SW 세계로 바라보자 - 구현편 (1)
PWM을 임베디드 SW 세계로 바라보자 - 구현편 (1)
PWM을 임베디드 SW 세계로 바라보자 - 구현편 (1)





그리고 FXCLK_SEL은 무엇으로 세팅되어 있는지 살펴보겠습니다.
디버거로 확인 결과 CMU_GCLK_EN으로 선택되어 있습니다.
그럼 결론적으로 CMU_GCLK_EN이 선택되어 Divider 1로 된 100 MHz가 사용되고 있다는 것을 알 수 있습니다.



PWM을 임베디드 SW 세계로 바라보자 - 구현편 (1)




다시 한번 정리를 해보면 아래와 같은 그림이 될 것 같습니다.
CMU_FXCLK0 ~ 4번을 모두 Enable 시키고 입력되는 주파수는 100 MHz를 각각의 Divider로 나눠주는 값을 갖게 될 것입니다. 우리는 다음 코드에서 CMU_FXCLK0를 사용하게끔 구현이 되어있습니다.
따라서 100 MHz / 2^0으로 계산하면 100 MHz인 CMU_FXCLK0를 사용하게 됩니다.


PWM을 임베디드 SW 세계로 바라보자 - 구현편 (1)
PWM을 임베디드 SW 세계로 바라보자 - 구현편 (1)





힘들게 힘들게 돌아와서 보면 SYS_CLK 100 MHz를 어떤 변형도 없어 CMU_FXCLK0에 넣어준 값을 사용하고 있는 것입니다. 놔참~~~ 똥개 훈련이구만!!ㅎㅎ
뭐 여하튼 오늘은 클럭이 어떻게 만들어졌는지만 분석하고 다음 시간에 더 살펴보기로 하겠습니다.

 

 

 

여기까지 진행하시면서 생기는 모든 질문과 답변은 아래 카페에서 해드립니다.
많이 많이 방문하셔서 실력을 업그레이드하세요.

https://cafe.naver.com/binaryembedded

 

임베디드 유니버스 : 네이버 카페

임베디드 유니버스 : 임베디드의 세계로 초대합니다.

cafe.naver.com

 

댓글