임베디드에서 가장 많이 접하게 되는 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)란?
인터럽트 개요 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 |