오늘의 질문
  • GPIO가 뭔가요?
  • 별2개

제너럴퍼포즈아이오 (Genrel Purpose IO) . 영문뜻대로 일반적인 IO 를 말하죠
입력,출력 가능한 IO 인거죠. 하지만 여기서 약간의 어려움이 있습니다.
하나의 하드웨어 핀이 입력도 되고 출력도 될수는 없다는 점입니다.

하드웨어적으로 출력핀은 프로그램에서 출력값을 변경하지 않는이상 항상 동일한 값
즉 1 또는 0 의 값을 갖습니다. 이런 핀을 우리는 latch 라는 말로 표현하죠. 사실 메모리 또는
레지스터 이런 것들도 모두 래치형입니다. 값을 변경하지 않는이상은 이전의 값을 동일하게 갖고 있으니까요.
좀더 어려운 말로는 flipflop 이라고도 하죠.

반대로 입력의 하드웨어 상태는 래치가 되면 안됩니다. 입력이 1또는 0으로 고정되어 있다면 데이타를 주는
상대방이 값을 주는 순간 내가 출력한 값하고 충돌이 일어나게 됩니다. 이런상태는 하드웨어마다 다른 상황이 발생
합니다. 출력이 서로 만나면 어떤 파형이 되는지는 나중에 "오실로스코프 사용방법" 에서 좀더 설명하도록 하겠습니다.
입력핀의 경우는 상대방의 입력을 받을 수 있는 상태인 High impedeance(하이임피던스)상태가 되어야 합니다.

High-Z (하이임피던스)란 상대방의 출력을 그대로 받아들이는 상태를 말합니다.

설명하자면 상대편이 High를 주면 나도 High가 되고 Low를 주면 나도 Low 가 되는 상태입니다.
참고적으로 디지탈은 3개의 상태가 존재합니다. High, Low, High-Z(하이임피던스)

다시 GPIO에 대해 설명하죠.

GPIO 라고 말한다면 그 핀에 대해 보통은 입력과 출력 2가지 모드의 핀상태가 존재합니다. 물론 동시에 존재하지는 않죠.
입력이냐 출력이냐를 프로그래머가 설정하는게 일반적입니다. 그러므로 프로그래머는 사용할 GPIO에 대한 설정을 반드시
하여야 합니다.

제어 흐름을 한번 보겠습니다.

{ 
   GPIO_3 번을 출력으로 설정
   
   while(1)
   {
      GPIO_3 = 1;
      sleep 1초
      GPIO_3 = 0;
      sleep 1초
   }
}

위의 샘플에서 중요한 내용은 출력에 대한 설정은 한번만 하면 된다는 점입니다.

다른 분들의 디바이스드라이버를 볼 기회가 종종있는데 입/출력 설정을 빈번하게 하는경우가 많더군요.
문제가 발생하지는 않지만 어딘지 모르게 껄끄럽지 않나요? ^^

지금 설명드린 GPIO가 입력과 출력을 지원한다면 우리는 GPIO가 2개의 펑션을 지원한다고 말합니다.
IN-function, OUT-function 일케 말이죠.
요즘 사용되는 32bit MCU 들은 GPIO가 적게는 30개에서 많게는 200개까지를 지원합니다.
고작 핀이 400개 밖에 없는데도 200개를 지원한다면 좀 이상한 생각이 드시죠.

이런 MCU 들은 GPIO 하나가 여러개의 펑션을 지원하기 때문에 가능합니다.

예를 들어보죠. 일반적인 MCU 들은 TFT-LCD 포트를 지원합니다.
그리고 데이타쉬트를 보면 이 TFT-LCD 포트가 GPIO 로도 사용할수 있다는것을
보실 수 있습니다. 이런경우 이 GPIO는 펑션을 3개 지원한다고 말할수 있습니다.
IN/OUT/LCD_R0 이렇게 예를 들수 있겠네요
실제 데이타 쉬트의 내용을 보죠


<그림 1>

위의 그림은 AU1200 의 데이타 쉬트중 일부입니다.
첫번재 내용을 풀이하자면 MCU의 C20번핀은 GPIO-20 번으로 사용 할수도 있고
SyncSerial 통신의 SYNC 신호로도 사용됩니다.


<그림 2>

위의 그림은 PXA270의 데이타 쉬트중 일부입니다.
첫번재 내용을 풀이하자면 GPIO-33 번은 UART 의 RXD 핀이나 로컬버스의 nCS5
또는 외부 DMA를 위한 Grant 신호로 사용된다라고 나와 있네요

위에 제시된 MCU뿐 아니라 32비트 모든 MCU의 대부분의 하드웨어핀은 모두 이렇게 여러펑션을 지원합니다.
이런 펑션을 Alternate Function 이라고 말하기도 합니다.
프로그래머가 어려운 부분은 그 IO에 출력을 쓰거나 또는 입력을 읽는게 아니죠.
바로 GPIO 펑션의 기능을 내가 원하는 입력또는 출력으로 변경하거나
또는 제3의 기능으로 설정하는 것입니다.
그나마 다행인것은 리눅스 커널 2.6.x 대에서는 이런 기능들이 arch 함수로써 제공된다는 점입니다.
(요건 드라이버 영역이니 자세히 설명하지는 않겠습니다.)

참 그리고 하드웨어 초보분들이 어려워하는 부분이 데이타쉬트를 보는 것이겠죠.
이부분도 꼭 강좌를 쓰도록 하겠습니다. ^^