[STM32] GPIO

CS·2025년 3월 1일

STM32

목록 보기
2/8

GPIO

General Purpose Input Output의 약어로 입출력을 담당한다.

외부에서 신호가 들어오면, Input driver Block을 거치고,
MCU에서 신호를 출력시, Output driver Block을 거친다.
이런 과정을 통해 MCU와 외부 소자간 신호를 주고 받을 수 있다.

GPIO Output

보통 프로젝트를 생성하고 CubeMX를 실행하면 PA 5가 (GPIO OUT)LED로 Default 설정되어 있다.
GPIO Input은 CubeMX 설정 내용 그대로라 생략한다. mode로 Interrupt나 event, edge 그리고 Pull-up/Pull-down 설정이 가능하다.

몇가지 설정 내용을 보자면,

  • GPIO output level :
    출력 모드의 GPIO의 초기 상태로, Low(0), High(1) 전압 level을 설정한다.

  • GPIO mode :
    Push Pull과 Open Drain을 결정할 수 있다.

    Push Pull = Out pin이 High일때, VCC를 연결해 Out하고, Low일 때, GND를 연결해 출력하는 일반적인 방식이다. LED 점등 등에 쓰이며, VCC와 GND를 직접 연결한다.

    Open Drain = Low일때 핀을 GND에 연결하고, High일때 Floating(신호가 애매한 상태)상태가 된다. 이때 외부에 Pull-up 저항을 연결해 High상태를 보장해 주어야 한다.
    주로 I2C통신 같이, 여러 장치가 동일한 bus를 공유하는 경우에 사용하며, Pull-up 저항에 따라 갖는 값들이 변하게 된다.

  • GPIO Pull-up/Pull-down

    GPIO에서 Floating 상태 방지를 위해 쓰는 저항 기법

    Pull-up = 내부 저항을 통해, pin을 VCC로 방향으로 당김. 기본 High상태에서 button같이 특정 신호가 입력된다면, GND 방향으로 당겨 Low상태로 바뀜.

    Pull-down = Pull-up의 반대 개념. 기본이 Low상태, Input시 High로

    No pull-up and no pull-down = 별도 풀업, 풀다운 저항 사용하지 않음. Floating에 주의해야 함.

  • Maximum output speed

    pin의 전압 전환 속도를 결정함.
    PWM같이 신호 level이 빈번히 바뀌는 경우엔 이 옵션을 사용하려는 port pin의 driving frequency에 맞게 설정하여야 한다. 대신 빠를수록 기울기가 증가하기 때문에 EMI noise가 증가하고, 전력 소비도 증가한다.

입력 신호의 종류

  1. Digital 입력 신호 :
    I2C, SPI 등의 규격화 된 입력 신호(alterante function)와 GPIO 일반 bit 신호가 존재
    GPIO 일반 bit 신호는 GPIOx_IDR(Input Data Register)에 저장된다.

  2. Analog 입력 신호

출력 신호의 종류

  1. GPIOx_ODR(Output Data Register)를 GPIO bit 신호로 출력
  2. Alternate function를 선택하여 출력

레지스터

바로 위에서 설명했듯, GPIOx_IDR과 GPIOx_ODR 레지스터를 갖고 있고, 이들은 각각 32bit다.

  1. IDR의 경우, [15:0]이 모두 Read Only로 설정되어 있다. 나머지 bits는 반드시 reset value로 유지하여 reserved로 둬야한다.

  2. ODR의 경우, [15:0]이 SW에 의해 Read/Write되도록 되어 있다. 마찬가지로 나머지 bits는 Reserved.
    GPIOx_BSRR(Bit Set, Reset Register)에 의해 bit단위 set/reset 가능하다.

  3. 1개의 32 bit BSRR
    빠른 GPIO를 조작할 수 있게끔 한다.
    예를 들어, GPIOA -> BSRR = ( 1 << 5 )를 통해 PA5를 1로 Set(Set)할 수 있다.
    반대로, GPIOA -> BSRR = ( 1 << (16+5))를 통해 PA5를 0으로 Set(Reset)할 수 있다.

Reset 구간 동안, 혹은 Reset 이후 JTAG pins를 제외한 나머지 I/O pin들은 특별한 설정이 없다면, Floating 상태이다. 즉 Interrupt를 받을 수가 없다.

이런 내용들을 고려하여, 설정 후 framework 위에서 원하는 내용을 작성하면 된다. 직접 레지스터를 조작하여도 좋지만, HAL 이라는 좋은 API가 있음을 기억하자.

관련 HAL 라이브러리

GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)

// GPIOx는 MCU에 따라 A to H까지 지정 가능함.
// GPIO_Pin은 해당 Port에서 0 to 15까지 지정 가능함.

/*
GPIO_Pinstate는 다음과 같이 열거형으로 선언되어 있다.

typedef enum {
	GPIO_PIN_RESET = 0U, // 0
    GPIO_PIN_SET // 1
}GPIO_PinState;


그러니까 pin을 읽어 현재 상태 즉, 0 아니면 1을 return한단 얘기다.
자세한 내용은 CubeIDE에서 원하는 정보를 드래그 하고 F3하면 찾아볼 수 있다.
*/

//예를 들면, HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_13); 으로 Blue button을 입력으로 받을 수 있다.
//대소문자 구별에 주의하자

--------------------------------------------------------------------

void HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)

//지정한 PinState값을 선택한 Port의 Pin으로 설정해준다
// 예를 들면, HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET); 으로 PA5의 LED를 ON시킬 수 있다
// 앞서 기본으로 Push-Pull에, Low 설정을 해놨다.


profile
학습

0개의 댓글