본문 바로가기
dev, tech/embedded

<img src="http://blogimgs.naver.com/nblog/ico_scrap01.gif" class="i_scrap" width="50" height="15" alt="본문스크랩" /> PORT

by 구띵 2006. 6. 2.

 

1. Port 란?

~ 포트라는 것은 반도체 칩에 배선을 할 수 있도록 조그맣게 나와있는 핀(pin)들을 단위로 묶어놓은 것입니다.

 

PC의 프린터포트를 예로 들면 25개의 핀을 한 단위로 묶어서 각 핀의 신호들을 특정한 약속으로 정해놓고 표준화 시켜서 사용합니다.

 

모든 CPU는 하나의 핀들을 개별적으로 제어해 주는 것이 아니라 그 핀들을 일정 개수로 묶어서 포트라는 이름을 붙여주고 포트를 제어한다(또는 사용한다)는 표현을 사용하게 되는 것입니다.

 

2. ARM의 Port는?

~ ARM에는 많은 핀들이 있으며 비슷한 기능 또는 한 가지 기능을 위한 여러개의 핀을 묶어서 포트로 표현하고 있습니다. 그 중에서 토요일에 한 것은 일반적으로 사용자 정의의 입출력에 쓰이는 I/O port를 제어하는 것을 하였습니다.

GPIO라고 표현하고 A~H까지의 Port가 있습니다.

그리고 각 포트는 제어용 레지스터와 데이터입출력을 위한 실제 핀들의 값인 데이터 레지스터 , 마지막으로 내부적으로 해당핀을 1로 만들것인를 설정하는 레지스터가 있습니다.

 

GPACON  => A포트의 모드를 설정하는 레지스터 입력으로 쓸 것인가 출력으로 쓸 것인가

GPADAT   => A포트의 실제 값이 저장되는 레지스터입니다.

                    A포트에 사용자가 원하는 신호를 출력하고자 할때는 이 레지스터에 원하는 값

                    을 넣어주는 것이고, A포트에 신호가 어떻게 들어오는지 알고 싶을때는 레

                    지스터의 값을 읽어오는 것입니다.

GPAUP    => A포트의 핀을 내부적으로 1로 만들어 줄것인지 그냥 0으로 할 것인지를 결정하

                    는  레지스터입니다.

 

위의 A를 각 포트 이름으로 바꾸면서 해당 포트를 제어하게 됩니다.

 

3. CPU 메뉴얼을 보고 포트 찾는 법

~ 모든 CPU의 메뉴얼에는 자신이 가지고 있는 포트를 제어할 수 있는 레지스터를 가지고 있습니다.

그리고 그 레지스터가 있는 메모리의 주소도 테이블 형태로 제공하고 있습니다.

내가 원하는 레지스터에 값을 읽거나 쓰고자 할 경우에는 해당 메모리 주소에 접근하여 할 것입니다.

 

메모리 주소로의 접근은 여러분이 알고있듯이 C의 포인터로 접근합니다.

 

메뉴얼의 GPACON 레지스터의 주소가 0x56000000 이라고 명시되어 있다면...

 

============================================================================

volatile unsigned int *rGPACON; //레지스터 명의 포인터 변수를 선언

 

rGPACON = 0x56000000; // 메모리의 주소를 넘겨줌

 

*rGPACON = 0x00000000; //제어하고자 하는 핀의 값을 대입함

============================================================================

위의 예는 A포트를 입력으로 쓸것이라고 명시한 내용입니다.

그럼 A 포트의 값을 읽어야 하겠죠

============================================================================

volatile unsigned int *rGPADAT; //레지스터 명의 포인터 변수를 선언

int portB;

 

rGPADAT = 0x56000010; // 메모리의 주소를 넘겨줌

 

portB = *rGPADAT; // 포트 값을 읽어 옴

============================================================================

 

정리하면

일반 입출력 포트를 제어하기 위해서는 우선 제어레지스터에서 해당 포트를 설정한 후에 포트의 데이터레지스터를 읽거나 쓰게 된다는 것입니다.

 

집에서 버튼을 찾아보는 실습은 못할 것이라는 생각이 들기에...

대략적으로 적었습니다.

 

추신: 현재 보드에 대해 이게 뭐야 하는 분들이 있지 않을까 싶은 노파심에....

현재 여러분의 보드는 제가 제대로 파악하지 못하고 있는 상태에서 교육이 되고 있기에 불편한 점도 있고, 불만이 있을 것으로 생각됩니다. 보드 자체는 실제 솔루션 개발에서도 사용될 수 있도록 설계되고 만들어진 것이기에 입문자 교육에는 무리가 있을 수도 있지만 현재 보드에 익숙해 지시면 많은 것을 배울 수 있으리라 생각됩니다.

광고 글일 수도 있지만 내심 여러분에게 좀더 좋은 교육을 해주지 못하는 점도 미안하고 저희 보드에 대한 평가도  안 좋을까 싶어 덧붙입니다. ^^

 

 

댓글