소프트웨어/C

[펌웨어] GPIO 분석하기_1

Nerd Dog 2022. 10. 4. 00:03

 

필요한 이유

 

GPIO (General Purpose Input Output)의 약자로 마이크로 프로세서에서 범용으로 사용되는 입출력 포트라는 뜻입니다.

마이크로 프로세서가 이 포트를 이용해 통신도 하고 스위치가 올라갔는지 내려갔는지 판단을 하고 LED ON/OFF 도 가능하게 합니다.

 

STM 은 보드명_hal.h로 AVR은 avr/io.h 로 GPIO 관련 라이브러리를 가져옵니다.

각 라이브러리에 GPIO를 제어 가능한 명령어를 만들어 놨는데

 

//STM 경우

//포트 입력여부
HAL_GPIO_ReadPin(GPIOx,GPIO_Pin);//해당 포트, 해당 포트 핀

//포트 출력여부
HAL_GPIO_WritePin(GPIOx,GPIO_Pin,Status);//해당 포트, 해당 포트 핀, 상태(1이면 High 0이면 LOW)

//AVR 경우

//포트 입력 세팅
PORTx.DIRCLR = PORT_Pin; //해당포트 해당핀 입력
//포트 출력 세팅
PORTx.DIRSET = PORT_Pin; //해당포트 해당핀 입력

//포트 출력
PORTx.OUTSET = PORT_Pin;//해당 핀 HIGH
PORTx.OUTCLR = PORT_Pin;//해당 핀 LOW
//포트 입력
PORTx.IN&(PORT_Pin); //해당 포트 레지스터를 출력 PORT_Pin과 AND연산을 수행하면 값이 나온다.

해당 칩 회사가 라이브러리를 잘 만들어놔서 해당 명령어만 입력해도 알아서 GPIO를 제어 가능합니다.

물론 그냥 사용해도 무방하지만 이번 기회에 자세히 어떻게 마이크로컨트롤러가 GPIO포트를 제어를 하는지 알아보기로 하자

 

분석

 

펌웨어를 처음 시작하면 제일 먼저 해보는 것이 GPIO 포트로 LED를 제어하는 것인데

STM 보드 - CUBE IDE를 사용하면 다음과 같은 화면이 익숙할 것이다.

 

(STM32f103rbt6) Nucleo-f103RB보드

이는 STM에서 제공하는 테스트보드 Nucleo-F103RB 보드에 사용되는 칩 STM32f103rbt6 칩으로

해당 보드 모양은 다음과 같다.

 

중앙에 해당 칩이 있고 해당 핀을 하나하나 왼쪽 오른쪽에 확장한 모습이다.

여기서 PORTC에 0번핀을 이용해 LED를 제어하고 싶다면 CUBE IDE에선 다음과 같이 설정을 하고 LED와 저항을 회로도 모양으로 구성해주면 된다.

PC0를 OUT으로 설정한 모습

다음과 같이 설정을 변경하면 해당 IDE에서 자동으로 해당 포트를 설정한 내용대로 코드를 작성해준다.

설정된 코드는 MX_GPIO_Init()에서 적용되며 만약 GPIO를 제어할 생각이라면 해당 코드 아래에 작성해야만 한다.

LED 연결 예시

위와 같이 회로도를 구성하면

 

아래는

HAL_GPIO_WritePin(GPIOC,GPIO_PIN0,1); //POWER이기에 HIGH여야 켜진다.

위는 

HAL_GPIO_WritePin(GPIOC,GPIO_PIN0,0); // GND이기에 LOW여야 켜진다.

 

명령어를 수행하는 순간 두 LED는 켜질 것이다.

 

두 회로의 차이라면 GPIO 핀이 GND 쪽이냐 아니면 POWER 쪽이냐 하는 차이지만

가장 이상적인 형태는 GPIO 핀이 GND인 회로일 것이다.

그 이유는 마이크로 프로세서는 일정 이상 전류를 가져오지 못하기 때문이다.

해당 내용은 Datasheet를 찾아보면 나오는데 전류 Max 값이 정해져 있는 모습을 볼 수 있다.

GPIO 핀이 GND면 그냥 들어오는 전류를 밖으로 보내주면 되지만

만약 GPIO핀이 POWER 쪽이면 마이크로 프로세서가 직접적으로 전원을 LED 쪽으로 공급해줘야 하기에

마이크로 프로세서의 VCC 쪽에서 많은 전류를 공급받게 된다.

LED가 한두 개면 큰 이상이 없지만 더 많은 전류를 사용하면 마이크로 프로세서의 전류 용량을 넘어서고

마이크로 프로세서에 과전류가 흘러 손상을 입을 가능성이 존재한다.

하얀선은 PC0

다음 GPIO 분석하기_2에서는 INPUT과 설정값을 살펴보자