brunch

You can make anything
by writing

C.S.Lewis

by 이경종 Mar 26. 2020

Ch4-2. PIO와 pin muxing

주변기기 및 통신 I/O

모든 IC들은 외부와 인터페이스하기 위한 핀(Pin)을 가지고 있다. 입력으로 쓰이는 핀들도 있고, 출력으로 쓰이는 핀들도 있으며, 그 용도가 정해지지 않은 핀들도 있다. 고정된 기능만을 하는 핀들이 있는 반면, IC가 설계될때부터 복수 이상의 용도로 사용가능하도록 만들어진 핀들이 존재한다. 회로를 다양한 방법으로 구성할 수 있으므로, 보통 칩셋들은 각 핀들을 여러 용도로 활용할 수 있는 옵션을 제공한다. 예를 들어 옵션 선택에 따라 특정 핀을 네트워크의 입력핀으로 쓸수도 있고, 플래쉬 메모리의 데이터핀으로 쓸 수도 있다는 얘기다.


용도가 고정되지 않은 핀들을 어떻게 쓸 것인지 정하는 것을 pin muxing이라고 한다. 

보통 pin muxing은 시스템이 시작할 때 가장 초기에 이루어진다. 그렇게 하지 않으면 핀들을 못 쓰니깐....당연한 얘기다. 이 얘기는 해당 핀들의 사용이 필요할 때 pin muxing을 해도 된다는 얘기다. 하지만, pin muxing은 가장 초기에 한번 이루어지는 것이 통상적이다. 


시스템에서 쓸 수 있는 특정용도가 아닌 사용자 맘대로 임의로 핀을 쓰는 것이 GPIO(General Purpose Input Output)다. 사용자가 정하는 옵션에 따라 출력으로 쓸 수도 있고, 입력으로 쓸수도 있다.


아래는 특정 SoC의 데이터시트에서 Pin Mux 설명부분의 일부다. 

위 그림에 나온 두 Pin 모두 GPIO로 사용가능하다. 

시스템에서 Pin Mux를 어떻게 설정하느냐에 따라, 일반기능(위 그림에서는 NAND 플래쉬 관련 Pin)으로 사용될수도 있고, GPIO로 사용될수도 있는 것이다.


이미 설명했듯이, Pin Mux는 대게 부팅시 맨처음 수행되는 소프트웨어코드에서 설정가능하다. 

Pin Mux 코드를 통해 GPIO로 쓸 수 있도록 설정한 다음에 GPIO 관련 설정을 한다.


GPIO 설정이란 해당 핀을 입력으로 쓸것인지 아니면 출력으로 쓸 것인지 결정하는 것이다. 이를 pin direction을 설정한다고 말한다.


입력이나 출력으로 설정하고 나서는 이제 해당 pin을 사용하면 된다. 끝이다.

입력이면 해당 핀으로부터 들어오는 값을 필요한 경우 읽으면 되는 것이고, 

출력이면 필요할 때 해당 핀에 특정값(물론 0 또는 1이 될 것이다)을 쓰면 된다.


이 동작들은 대부분 칩셋에서 지원하는 GPIO controller의 기능을 사용하여 수행하게 된다.

GPIO로 쓰게 되는 경우 해당 핀이 시스템의 GPIO controller에 매핑되게 되므로, GPIO controller의 해당 레지스터에 값(비트)를 쓰거나 해당 레지스터로부터 값을 읽으면 출력이나 입력동작을 수행할 수 있게 된다.


한번 입력으로 설정했다고 계속 입력만으로 쓸 수 있는 것은 아니다. 출력으로 direction을 바꾸면 출력으로 바꿀수 있고, 그 반대도 물론 가능하다. 입력으로 설정해서 인터럽트 핀(interrupt Pin) 용도로도 쓸 수 있는데, 인터럽트에 대해서는 차후 다루기로 하자.


마지막으로 GPIO를 입력으로 설정하는 경우, 해당 Pin으로 아무 입력이 들어오지 않은 경우 해당 Pin을 초기값을 고정값으로 사용해야 하는 경우가 있다. GPIO로 pin을 할당하는 경우, 보통 초기값은 칩셋의 데이터시트에 나와있다(통상 0(low)이거나 정해지지 않은 경우도 있다)


예를 들어, 스위치(Switching) 기능을 위해 GPIO를 하나 할당해서 입력으로 지정했다고 치자. 그리고 이 GPIO 핀의 초기값은 0이라고 하자. 이 스위치 입력을 받아들여서 처리하는 소프트웨어에서 해당 pin이 0이 되면 어떤 특정한 동작을 시작한다고 가정하자.

그럼 이 GPIO 핀의 초기값을 1(high)로 만들어 놓는 것이 필요하다.  그래야 진짜 외부적인 동작에 의해 해당 pin이 0으로 가는 경우를 감지할 수 있게 된다. 해당 GPIO의 초기값을 high로 만들기 위해서는  풀업저항을 달면 된다. 결론적으로 소프트웨어의 개입없이 pin의 초기값을 임의로 만들어내기 위해서는 해당 pin에 풀업 저항(pull-up register)나 풀다운 레지스터(pull-down register)를 달면 된다. 회로도 시간에 배운 거다.


졸저 <개발자 오디세이아> 가 책으로 나왔습니다. 개발자들의 애환과 희망을 담으려 최선을 다했습니다. 많은 사랑 부탁드립니다^^








작가의 이전글 Ch4-1. 데이터통신방식
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari