본문 바로가기
Embedded SW/[NXP] Embedded SW Project

[NXP] 07. LED를 점등해 보도록 하자! (DIO 제어)

by 방구석 임베디드 2021. 5. 7.
반응형

먼저 아래 첨부한 파일을 열어보면 구매한 보드 TRK-USB-MPC5643L 보드의 전체 회로도를 볼 수 있습니다.

TRKUSBMPC5643LSCH.pdf
0.08MB

회로도를 열어서 LED 관련 회로를 보면 아래와 같이 찾아 볼 수 있습니다.

어떻게하면 LED를 킬수 있을까요?

회로의전체 구성은 아래와 같이 되어 있습니다.

저기 PTG3이라는 라인이 MCU로 들어오게 되고

MCU안에 주변기기(Peripheral)인 DIO(Digital Input Outpu) 모듈로 들어오게 됩니다.

그리고 PTG3이랑 연결되 모듈에서 우리는 아래 희미하게 그렸지만

스위치를 열고 닫음으로써 Ground와 연결을 수행할수 있습니다.

Ground와 연결이 되면 아래와 같이 전류가 흘러서 LED가 켜지게 됩니다.

그렇다면 지금부터 한번 설정을 해보도록 하겠습니다.

그래서 DIO 모듈의 PTG3 pin Output을 0으로 설정해야 합니다.

0은 Ground를 의미합니다.

아래 첨부한 파일을 엽니다.

TRKUSBMPC5643L.pdf
0.42MB

여기서 PTG3이라는 Pin은 MCU의 104번 Pin이라는 것을 확인할수있습니다.

MCU를 잘 보면 핀이 많이 달려 있습니다.

그렇다면 이렇게 연결이 되어 있는 것이겠군요!

그렇다면 Reference Manual에 104번은 어떤 pin인지 확인을 해보자

MPC5643LRM.pdf

파일을 열어서 112 page를 봄니다.

104번 pin은 G[3]이라는 이름의 pin인것을 확인 할 수 있고, 이 모듈은

1) Output function 일 경우

- GPIO

- PWM 으로 사용할수 있고

2) Input function일 경우에는

- GPIO

- PWM

-eTimer로 사용할수 있군요

이것은 나중에 하나하나 자세히 다루어 보겠습니다.

현재, 우리는 이 pin을 Output으로 사용할것이고

GPIO로 사용할것입니다.

더 정확히 말하면 GPO로 사용할 것입니다.

GPIO는 General Purpose I/O 라는 약자인데

I/O는 Input/Output을 뜻합니다.

그래서 우리는 이 핀을 GPO로 사용할 것입니다.

그리고 Output 설정을 0 (Ground)로 만들것이고

그로 인하여 전류를 흐려서 LED에 빨강 불이 들어오도록 할것 입니다.

다시한번 아래 메뉴얼을 봅시다.

아래 PCR이라고 보이시나요?

이 G[3]이라는 pin의 설정은 PCR레지스터 99번에서 수행하라고 나와 있습니다.

그렇다면 PCR레지스터를 살펴 보도록 하겠습니다.

Reference Manual 1354 page를 보도록 하겠습니다.

위와 같이 16비트 레지스터로 설정되어 있습니다.

여기서 우리는 PA를 00으로 설정하여 이 Pin을 GPIO 목적으로 사용할것이며

OBE를 1로 설정하여 이 GPIO를 GPO로 설정할 것입니다.

이제 마지막으로 이 GPO의 값을 0으로 설정해야합니다. (Ground로 설정을 해야합니다.)

그렇게 하기 위해서 GPDO레지스터 중 99번 배열의 값을 0으로 설정해야합니다.

reference manual 1358page를 확인해 봅시다.

여기서 우리는 0을 설정할것입니다. 그렇다면 Gound값이 출력되게 되고

만일 1을 설정하면 3.3V의 전압이 나가게 될것입니다.

0과 1은 항상 전압으로 표현된다는 것을 아시면 도움이 되실 것입니다.

그렇다면 이제 코드상에 어떻게 표현이 되어야 할까요?

아래와 같이 PCR 99번의 값을 설정하였습니다.

그리고 GPDO 99번 배열의 값에 0을 설정하였습니다.

이제 한번 확인해 볼까요?

위와 같이 LED에 불이 점등이 된것을 확인할수 있습니다.

그러면 지금부터 디버거를 이용하여 확인해 보도록 하겠습니다.

아래와 같이 디버거 창을보시면 EmbSys Register 창에서 SIUL에서 PCR99번을 찾을 수 있습니다.

그곳에 우리가 초기화시 설정한 값을 확인할수 있습니다.

물론 현재 이 OSBDM 디버거를 통해서 이 값을 바로 변경할수도 있습니다.

저는 개인적으로 임베디드랑 친해지기 위해서

레지스터와 메모리랑 친해져야 한다고 생각합니다.

이 부분에 대해서도 나중에 조금 자세히 포스팅 해볼게요!!!

지난 시간에 LED를 켜보았습니다.

그리고 그 소스에서 아래와 같이 소스를 추가하였습니다.

이코드를 수행시키면 아래와 같은 동영상이 동작하는 것을 확인 할 수 있습니다.

 

LED Blinking

LED가 Blinking 하는 것을 확인 할 수 있습니다.

일정 시간이 되면 GPO를 Ground로 그리고 3.3V로 변경해 가면서 LED는 켜졌다 꺼졌다를 반복합니다.

그런데, 시간을 점등하는 시간은 어떻게 맞춘걸까요?

그냥 감으로 맞추었습니다.

LED가 Blinking 하는 시간은 대략 맞춘것입니다.

만일 1초마다 점등을 수행하고 싶다면 어떻게 해야할까요?

정확하게요 ㅎㅎ

우리는 어떠한 기준이 필요하다는 것을 확인 할수 있습니다.

단지 무한 반복문안에서 counter를 이용하여 동작하는 것이 아닌!

절대적인 기준이 필요합니다.

이러한 기준을 세울때, Interrupt를 사용하곤합니다.

그리고 이러한 시간적인 기준이 세울때

우리는 Scheduler를 만들어서, Task를 할당할수 있는 방법을 사용할수 있습니다.

이러한 것들은 전부 뒤에서 다시 다룰것입니다. (맨날 뒤에서 다룬데 ㅋㅋ)

그렇다면 이제 Interrupt를 이용하여 1초마다 LED를 점등하는 방법을 확인해 보도록 하겠습니다.

반응형

댓글