임베디드 레시피

Egloos | Log-in





GPIO (Tristate Buffer)의 정체와 GPIO ISR

지퍄요 Gernel Purpose I/O 이야기.
Embedded System에서 GPIO를 빼면 무슨 이야기가 되겠습니까. I/O는 Digital 회로와 외부 세계와의 통로이지요. Input/ Output이니까요. Digital회로는 혼자서도 잘 먹고 잘 살겠지만, 손발이 있어야겠죠. 그게 I/O라는 거에요.
 
보통 MCU에는 본연의 임무를 하는 pin들이 있는데요, 예를 들면, Hardware적으로 정해져 있는 CS라든가, WE라든가 하는 정해진 일을 하는 pin이 있는가 하면, 어떤 특별한 임무를 갖지 않고, User가 원하는 대로 I/O로 사용할 수 있는 pin들이 있어요. - 그런데, 재미 있는 건 GPIO가 특별한 functionality도 가질 수 있는 속성이 있어요. 예를 들면, 어떤 pin은 어떤 chip에 대한 CS로 사용할 수도 있지만, GPIO로도 쓸 수 있다 라는 건데, 이런걸 Alternative Functionality라고 부른답니다. 어떤 pin은 이런 Alternative Functionality를 갖는가 하면, GPIO 전용으로만 쓰이는 pin들도 있어요. 꼭 MCU의 User Manual을 잘 읽어 보세요 -
 
이런걸 일컬어 GPIO라고 부르는데, GPIO라는 건 GP + I/O라는 말이죠. GPIO는 말 그대로 , IO니까, Input을 받거나, Output을 내놓거나 하는 데 쓰여용. 이런 GPIO는 MCU하나에 적으면 10개 많으면 200개까지 준비되어 있다 카더라~요. 막상 Design 하려는 System에 GPIO는 넉넉하게 준비되어야지, 그렇지 않으면 망연자실 할 수 있으니까 MCU를 선정할 때 조심하세요. ARM base의 MCU입장에서의 GPIO는 AMBA bus에 연결된 SOC Peripheral 이에요. APB bus에 연결된 Slave라고 보시면 되는 거죠. 그러니까, 이런 GPIO들도 Register를 가지고 있고, CPU입장에서는 Register를 통해서 control 가능하답니다.
 
그 control이라는 게 I/O로 쓸 수 있다고 했으니까, 어쩔 때는 Input, 어쩔 때는 Output으로 써야 하니까, 이런 I/O는 Register를 통해서 Programmable하답니다. Input, Output으로 원하는 대로 사용 가능해야 하니까요. Register를 통해서 GPIO를 control해야 하는 것에는, 3가지가 있고요, 요 3가지가 모두 제대로 설정되어야 GPIO를 내 수족처럼 control할 수 있으니까 명심하세요.
 
1) Pin의 Mode를 정할 수 있어요.
   → GPIO로 쓸 꺼냐, Alternative Functionality로 쓸 꺼냐.
   → Alternative로 설정하게 되면 GPIO로는 못쓰니까, 여기서 게임 오바.
   → 게임 오바 되면 Hardware적으로 정해진 임무를 수행하게 됩니다요.
2) Pin의 상태 (Mode)를 활성화 하면서 Data Direction을 정할 수 있어요.
   → 지금부터 Pin이 사용 가능하도록 Init 하겠다.
   → Input이냐, Output이냐를 결정하겠다.
3) 자~ 읽어 보자 라든가, 자~ 값을 써보자를 할 수 있겠습니다.
 
요런 넘들이 모두 Register로 준비되어 있는 거죠. 게임오바인 Alternative Functionality는 제껴 두고요, 본격적으로 GPIO만 다뤄보도록 하시죠. 어차피 Alternative Functionality로 pin을 설정하게 되면 Hardware적으로 Path 자체가 해당 Alternative Function의 회로에 연결되므로, GPIO로서의 자격을 상실하게 되니까, 그닥 파고들 이유가 없지요.
 
GPIO는 Hardware적으로 pin이 한 개 밖에 없는데, 이 pin을 Input과 Output 모두로 사용가능 하다는 것인데, 이런 GPIO는 Hardware적으로는 3 상태 버퍼 - Tristate Buffer -로 구현이 된답니다. 3상태 Buffer라는 건 1, 0, High impedance (Hi-Z) 요런 3가지 종류의 상태를 가질 수 있는 Buffer를 말해요. Tristate Buffer를 살펴 보면, Switch가 1일 때는 I값이 O에 그대로 전달되고요, Swtich가 0일 때는 I값이 O에 전달되지 않고 회로가 열려 버려서, 마치 회로가 Open 된 것처럼 되는 거죠. 보통 Tristate Buffer의 3상태가 Input/ Output/ High Impedance로 헷갈리는데, 그렇게 보시면 안되고, 1, 0 (Output), High impedance (Input)라고 보셔야 해요. 
 
  
 
 
이렇게 Open 된 것처럼 된 상태를 Hi-Impedance (Hi-Z)라고 읽고요, I (Input)와 O (Output)의 연결된 부분이 끊어져서 I와 O는 서로 연관성이 없어지게 되지요. I가 무신 값을 갖든 O와는 상관 없고요. O가 무신 값을 갖든 I에게도 영향을 미치지 못해요. 왜 Input으로 쓸 때는 High Impedance 상태 이어야 하는가를 파고 들어오는 분들을 위하여,더 쉽게 예를 든다면, Output으로 pin을 사용할 때는 S(witch)가 1이고요, 0이거나 1의 값을 갖겠죠. 이때 Input으로 pin을 만들어 놓고 읽으려고 보니까, 아까 Output으로 만들어 놓은 값이 읽힐 수 밖에 없어요. 그런다고 Output을 0으로 일부러 만들거나 해서 읽어 들이면 계속 0만 읽히겠죠. 우연찮게 Input이 0이면 다행인데, 외부 input이 1이라도 되는 날에는 0과 1이 서로 맞지 않아서 문제가 발생하고요. 그러면 내가 원하는 값을 읽지 못하니까, S(witch)를 0으로 만들어 놓고, I와 O를 isolation시키는 거죠. 결국 High impedance란 반대편의 Input을 그대로 받아들이는 상태라고 보시면 됩니다. 이 pin에 물려 있는 다른 편의 pin에 값이 1이면 이쪽도 1, 0이면 이쪽도 0 이런 식의 상태죠.
 
자, 이런 상태의 Buffer를 GPIO에 이용한다는 것은 S를 0으로 두었을 때 High Impedance 상태로 놓고, Read pin으로 이용할 수 있고요. S를 1로 두고서, 원하는 값을 O로 출력 가능하게 할 수 있겠죠. 이런 I, S, O를 차례로, GPIO_OUT, GPIO_OE, O는 GPIO PAD 출력 값이라고 하고, 자, input 부분까지 합쳐서 그리면, 이런 식이 되겠네요.
 
GPIO_OUT은 output 값 자체
GPIO_OE는 Output enable로서, S(witch)
GPIO PAD는 직접 MCU외부로 삐죽 나와 있는 pin
 
 
 
 
으흐흐. 참 쉽죠~ PAD나 Pin이나 같은 말입니다. pin으로 나와 있는 녀석은 pin, Ball type으로 된 녀석들은 pad 뭐 그런 거에요.
 
그러면, Spec에는 어떤 식으로 묘사가 될까요? 실제Pin number와 GPIO번호 그리고 Alternative Functionality가 나와 있네요. 그러니까, Default로는 GPIO로 사용되지만, Alternative Signal로 설정하면, GPIO로서가 아니고 PSC_SYNC0, PSC0_D1등의 Serial 통신의 Sync와 Data pin으로 사용 된다는 의미 이지요.
 
 
이런 GPIO는 Pull up과 Pull down도 설정을 통해 걸어줄 수 있는데요, 기본적으로 PU, PD가 모두 지원되는 pin도 있고 PU만, PD만 뭐 이런 식의 Hardware적인 기본 값들이 있는 녀석들도 있어요. 그러니까, 편리한 대로 Default PU/PD를 걸어줄 수도 있죠. 자세히 보기에는 긴~ 이야기가 있는데, GPIO에 Interrupt도 걸 수 있답니다. GPIO의 rising edge일 때, 또는 falling edge일 때 interrupt를 걸어서, 그런 일이 벌어질 때, 뭔가를 처리할 수도 있답니다. 와하하. 
 
 Qualcomm Solution중에 보면 BIO_TRISTATE()라는 Macro하고 BIO_OUT(), BIO_IN() 라는 MACRO가 있어요. BIO_TRISTATE가 Input/ Output으로 사용할 꺼다 라는 거고, BIO_OUT()이 output으로 사용했을 때, 출력 값. BIO_IN()이 input으로 사용했을 때, pin의 상태 값을 읽어 들이는 MACRO 랍니다. 
 
 Output으로 사용할 때, 1, 0으로 값을 내보낼 때는 Output Buffer에 1이나 0을 쓰고 나서 Output 설정을 하거나 (Output 설정하는 순간 값이 Pin에 나옴) Output 설정을 하고 Output Buffer에 1이나 0을 써도 상관없지만 (1이나 0을 쓰는 순간 값이 Pin에 나옴) Read로 사용할 때는 읽어 들인 후 Input 설정을 하게 되면 Read값은 당연히 정상적인 값이 아니겠죠. 머 당연한 이야기지만 실수 하는 경우도 있더라구요. 그냥 그렇다구요~

by 히언 | 2009/10/18 21:26 | Device컨트롤 | 트랙백 | 덧글(4)

Commented by 탱자 at 2009/10/21 11:02
정말 잘 쓰셨군요! 잘 보고 갑니다^_^
Commented by 히언 at 2009/10/29 11:29
>>ㅑ오~ 과찬의 말씀입니다~ 잘보고 가시기만하면 안돼요~ 또 오세요~
Commented by 구구 at 2009/10/31 14:05
와...이제 정리 되네요 감사합니다
Commented by 히언 at 2009/10/31 23:44
으흐흐~ 감사합니다~
잼난 얘기도 풀어주세요~
※ 이 포스트는 더 이상 덧글을 남길 수 없습니다.

◀ 이전 페이지          다음 페이지 ▶