티스토리 뷰

GPIO (General Pupose Input Output)

마이크로프로세서가 주변장치와 통신하기 위해 범용으로 사용되는 입출력 포트이다. 설계자가 마음대로 변형하면서 제어할 수 있도록 제공해 주는 I/O(입출력) 포트이다. I/O포트를 제어하기 위해서 각 포트당 3개의 I/O 레지스터 (DDRx, PORTx, PINx)를 가진다. 



GPIO 특징

입력과 출력을 마음대로 선택할 수 있고, 0과 1의 출력 신호를 임의로 만들어줄 수 있는 구조를 가진다. 입력으로 사용할 때는 외부 인터럽트를 처리할 수 있도록 하는 경우가 많다. 입출력 방향 전환용 레지스터와 입출력용 데이터 레지스터 등이 필요하다. 참고로 마이크로컨트롤러에서는 대부분의 핀들을 GPIO로 설정하는 경우가 많다.

각 포트에는 대한 데이터 출력용 레지스터(PORTx)와 데이터 입출력 방향 지정용 레지스터(Data Direction Register : DDRx), 그리고 데이터 입력용 레지스터(PINx)가 있을 것이다.


gpio.pdf



* DDRx 레지스터

- 입출력 방향설정을 하기 위한 레지스터

- DDRA ~ DDRG 레지스터의 해당 비트에 1을 쓰면 출력, 0을 쓰면 입력으로 설정.


* PORTx 레지스터

- 데이터를 출력하기 위한 레지스터

- 출력을 원하는 데이터값을 PORTx 레지스터에 넣어주면 된다.


* PINx 레지스터

- 데이터 입력용 레지스터

- PINx 레지스터에 해당하는 값을 읽으면 해당 핀의 값이 읽어진다.


* SFIOR 레지스터

- Special Function IO Register

- 입출력 포트의 특수 기능을 제어하기 위한 레지스터

- SFIOR 비트2(PUD:Pull-Up Disable)를 1로 세트하면 풀업 저항을 비활성화 시킨다.


GPIO의 출력을 보다 보면 풀업(pull-up) 저항, 풀다운(pull-down) 저항, open-drain 뭐 이런말이 따라 나온다. 어떤 것인지 잠깐 짚고 넘어가자. 흠... 예를들어 어떤 칩의 1번 핀을 핵폭탄 발사 단추 입력 핀으로 설정했다고 치자. 자 그런데 이 핀에 스위치를 달아서 스위치를 누를 때에만 입력 핀에 5V(High)의 전압이 연결되도록 하였다. 그러면 스위치를 누르지 않은 상태는 High도 Low도 연결되지 않은 끊긴 상태가 되는데 아무런 문제가 없을까?


일단 이렇게 입력 핀에 High 혹은 Low 어떤 입력도 안 되는 상태를 플로팅(Floating) 되었다고 한다. 이 핀을 사용하지 않는다면 문제 없겠지만 지금의 가정에서 처럼 핵폭탄 단추와 연결되면 심각한 문제를 야기한다. 왜냐면 주변 전기장 상태에 따라 불안정하게 부정전압이 생겨서 입력으로 엉뚱한 전압이 들어갈 수 있기 때문이다. 운이 좋으면 발사되지 않는것이고 운이 나쁘면 발사된다. ㅡ..ㅡ)



그럼 이런 오작동을 막기 위해서 어떻게 해줘야 할까? 입력이 없을 땐 전압을 항상 High 또는 Low로 묶어주면 될 것이다. 이를 해주는 것이 풀업 저항 또는 풀다운 저항이다. 풀업 저항은 입력이 없으면 항상 High이고 풀다운 저항은 입력이 없으면 항상 Low이다. (참고로 전류는 저항이 낮은쪽으로 흐르는 성질을 갖는다.)


아.. 조금만 적을려고 했는데 점점 길어진다... 하이임피던스(High-impedance)는 방해물, 장애물이라는 임피던스의 영어뜻에서 알 수 있듯이 어떤 출력 신호선이 전기적으로 절연된 상태를 하이 임피던스라고 부른다. 하이도 로우도 아닌 제3의 상태로 취급한다.


open drain (또는 open collector)은 흠... 다른 분의 포스팅 ( http://eslectures.blog.me/80137762936 )을 참조하자. 이야기가 너무 길어졌네 그려~ ㅡ..ㅡ