Developer Document

Embedded Software 개발을 하면서 습득한 내용을 적은 시니어 개발자들의 글

코 독 코 독 CoderDocument

Embedded SW 기초

Peripheral과의 통신 - 1. GPIO

stdQ 2024. 6. 11. 19:52

임베디드에서 가장 많이 접하게 되는 peripheral과의 3가지 통신 방식이 있다. GPIO, UART, I2C 이다.

 

이 중 GPIO(범용 입출력: General Purpose Input/Output)는 개발자가 필요에 따라 입력/출력을 설정하여 사용할 수 있도록 한다. 단, 하나의 GPIO포트에 대해 입/출력을 동시에 설정할 수 없으며, 입력과 출력 중 한 가지 모드로 설정해서 사용해야한다.

 

Linux에서 /sys/class/gpio/ 에서 export 된 GPIO 목록을 볼 수 있다.

 

GPIO 입/출력 설정은 ‘direction’값에 ‘in’ 또는 ‘out’값을 넣어 설정한다. ‘in’이면 입력, ‘out’이면 출력이다.

GPIO 포트를 입력(in) 설정해야하는 경우의 예로는 버튼이 있고, 출력(out) 설정해야하는 경우는 LED를 예로 들 수 있다.

 

GPIO 포트를 통해 들어오거나 나가는 값은 ‘0’과 ‘1’ 둘 중 하나의 값으로 고정된다.

포트에서 입/출력하는 값은 ‘value’값을 통해 읽거나 쓸 수 있다.

 

예를 들어 알아보자.

버튼과 연결된 GPIO 핀을 입력으로 설정하였다. 버튼을 누르거나 뗄 때, 0또는 1 값을 읽을 수 있다. 이 때, 우리는 보통 버튼을 누르면 1, 떼면 0 값을 볼 수 있을 것이라고 생각한다. 그러나 이 값은 회로 구성에 따라 바뀔 수 있다. 즉, 눌렀을 때 값이, 무조건 1이 아니라는 것이다. 회로 구성이 Pull Up이냐 Pull Down이냐에 따라서 달라지는데, 각 회로 구성에 따라 아래와 같은 값을 볼 수 있다.

  Push Non-Push(Pop)
Pull Up 0 1
Pull Down 1 0

 

그래서 눌렀을 때 1이 되는지, 0이 되는지 설정하여 어떤 값일 때 눌린 상태인지를 알 수 있도록 설정하는 active_low값이 있다.

active_low가 1(true)로 설정이 되어있다면, 이 회로는 value가 0일 때 동작하는 회로라는 뜻이 된다.

 

 

더보기

command 정리

 

System-Product-Name:/sys/class/gpio : $ cd gpio[num]
System-Product-Name:/sys/class/gpio/gpio[num] : $ ls
active_low  direction   power/      uevent      
device/     edge        subsystem/  value 
System-Product-Name:/sys/class/gpio/gpio[num] : $ cat direction
in
System-Product-Name:/sys/class/gpio/gpio[num] : $ cat value
0
System-Product-Name:/sys/class/gpio/gpio[num] : $ cat active_low
1


 

위에서 GPIO 설정과 어떤값을 읽을 수 있는지 봤다면 이 다음은 어떻게 GPIO에서 들어오는 값을 처리할 수 있는지에 대한 내용이다.

GPIO Pin에서 들어오는 값을 인터럽트로 인식하기 위해 IRQ(interrupt request)를 등록하여 사용할 수 있다.

 

인터럽트(Interrupt)는 우선적으로 처리해야 할 일이 발생하였을 때 그것을 처리하고 원래 동작으로 돌아온다.

  • 각 interrupt는 interrupt vector table에 저장되어 우선순위가 결정된다.
  • interrupt vector table에는 각 interrupt가 발생했을 때 수행하는 ISR(Interrupt service routine)의 주소가 저장되어 있다.
  • ex) 스위치 입력→ 프로그램 상태 보관 PC(program counter), SR(status register) 저장 → 인터럽트 처리(ISR 수행)
  • → 프로그램 상태 복구 → 중단된 부분부터 main() 실행
  • 스위치 GPIO IRQ 등록 → main() 실행 중 스위치 Push 발생(인터럽트 요청 신호 발생) → 프로그램 중단

GPIO의 interrupt 설정은 none, falling edge, rising edge, both(falling edge, rising edge 둘 다 체크)하는 경우로 나뉜다.

 

 

 

참고 사이트  :  

[컴퓨터구조] 인터럽트(Interrupt)란?

 

[컴퓨터구조] 인터럽트(Interrupt)란?

인터럽트 개요 2017년 컴퓨터구조 과목을 수강하면서 가장 많이 나온 단어가 인터럽트가 아닐까 싶다. 외부 인터럽트, 내부 인터럽트 인터럽트 서비스, 인터럽트 서비스 루틴, 인터럽트 핸들러,

whatisthenext.tistory.com

https://rakuraku.tistory.com/148

 

GPIO(General Purpose Input Output) 란?

마이크로 프로세서가 주변장치와 통신하기 위해 범용으로 사용되는 입출력 포트이다. 설계자가 마음대로 변형하면서 제어할 수 있도록 제공해주는 I/O(입출력) 포트이다. I/O 포트를 제어하기 위

rakuraku.tistory.com

 

https://bruders.tistory.com/66

 

아두이노 기초 : 풀업저항과 풀다운저항 (ft. 스위치)

시작전에 함수 하나를 알고 가자. 저번에는 analogWrite 을 쓰느라 pinMode 함수를 이용하지 않았는데 이번에 digital 핀의 사용이 필요하니 pinMode 함수를 써보도록 하자. ( 디지털 핀 사용시 pinMode() 를

bruders.tistory.com

 

'Embedded SW 기초' 카테고리의 다른 글

리눅스 명령어 & rootfs  (0) 2024.06.13
Peripheral과의 통신 - 2. UART  (0) 2024.06.11
리눅스 커널& 디바이스 드라이버  (0) 2024.06.11
메모리 구조  (0) 2024.06.10
임베디드 리눅스 부팅 절차  (0) 2024.06.10