ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [전자공학] GPIO mode
    공학/전자공학 2023. 12. 17. 00:46

    글의 참고

    - https://wiki.st.com/stm32mcu/wiki/Getting_started_with_GPIO#bs-sidebar-toc

    - https://blog.stratifylabs.dev/device/2013-10-21-Understanding-Microcontroller-Pin-Input-Output-Modes/

    - https://elinux.org/images/b/b6/Pin_Control_Subsystem_Overview.pdf

    - https://embetronicx.com/tutorials/tech_devices/understanding-the-microcontroller-gpio-gpio-working-explained/

    - https://suketushah.medium.com/gpio-as-fast-as-possible-f78cbb9db50e

    - https://github.com/google/periph/issues/239


    글의 전제

    - 밑줄로 작성된 글은 강조 표시를 의미한다.

    - 그림 출처는 항시 그림 아래에 표시했다.


    글의 내용

    - Overview

    " 임베디드 프로그래밍을 하다보면, pin configuration 을 맞춰야 하는 경우가 많다. 특히나, 리눅스 디바이스 드라이버를 작업할 때, GPIO 는 거의 무조건 사용하게 된다. 이 때, `방향 및 값` 만 설정해도 크게 문제가 되지 않는 경우가 많다. 그러나, 좀 더 최적화 작업을 진행하기 위해서는 pin 의 전기적 특성을 이해하고 사용 시나리오에 맞게 pin configuration 을 적절하게 진행하는 것이 좋다.

     

     

    - GPIO port

    " SoC 에는 굉장히 많은 GPIOs 들이 존재한다. 여기서 모든 GPIOs 들이 같은 power domain 을 사용하는 것은 아니다. 심지어, 특정 GPIOs 들만 interrupt pin 으로 사용이 가능하고, 또 ADC 용으로 사용이 가능한 핀들도 있다. 즉, 모든 GPIOs 들이 전기적 및 기능적으로 동일하지는 않다는 것이다. 하드웨어적으로 GPIO controller 는 전기적 및 기능적으로 GPIOs 들을 하나의 그룹으로 묶어서 관리한다. 이 때, 이 그룹을 `GPIO 포트` 라고 한다. Exynos4412 datasheet 를 보면, 총 37 개의 GPIO ports(GPA, GPB, GPC ...) 가 있고, 각 포트마다 GPIOs 들의 개수가 다르고, 기능적으로도 다르다는 것으 알 수 있다.

     


    Exynos4212

     

     

    " 그러나, 무조건 GPIO port 가 있다고 볼 수는 없다. bcm2835 같은 경우는 모든 GPIOs 들을 개별적으로 관리한다. bcm2835 의 GPIOs 개수는 54 개다. 여기서 GPIO 의 signal level 은 `1` 혹은 `0` 이다. 그러므로, 1 비트만 있어도 signal level 은 설정이 가능하다. pull-up / pull-down 또한 마찬가지다. 그래서, 54 개의 GPIOs 들을 configuration 하기 위해서 32 비트 레지스터 2 개면 충분하다.

     


    BCM2835 ARM Peripherals

     

     

    " 그런데, bcm2835 는 GPIO 마다 최소 2개의 alternate functions 들을 갖는다. 최대 6 개까지 갖는 경우도 있기 때문에, 한 개의 GPIO 의 alternate function 을 표현하기 위해서는 3 비트가 필요하게 된다. 그래서, GPFSELx 레지스터는 6 개가 필요한 것이다(GPIO 한 개당 3 비트 필요. 54 * 3 => 162 비트 필요. 32 * 5 => 160, 32 * 6 => 192).

     


    BCM2835 ARM Peripherals

     

     

     

    - GPIO Modes

    " GPIO 는 `general purpose input/output` 의 약자로 특정 기능에 fixed 되지 않은 pin 을 의미한다. 즉, SDA, CS, VDD1.8V 와 같이 특정 기능으로 mapping 되지 않은 pin 을 의미한다. GPIO 는 software 에 의해서 customizable 하다는 것이 가장 큰 장점이다. GPIO 는 일반적으로 총 3가지 모드로 설정이 가능하다.

    1. Input or Output
    2. Analog
    3. Alternate function

    Figure - 1

     

     

    " 먼저, 간단하게 Analog & Alternate function mode 에 대해 알아보자.

    1. Analog
    " GPIO 를 ADC 핀으로 사용하는 경우가 있다. 예를 들어, HW revision 을 읽는 다거나, thermistor 와 연결해서 온도를 측정하는 경우들이 있다. 이게 가능한 이유는 내부적으로 ADC 를 내장하고 있기 때문이다. 즉, 말이 GPIO 일뿐이지, 실제는 Analog 핀으로 동작하는 것이다. 이 analog 핀이 ADC 에 연결되서 resolution 값을 기준으로 digital 화 되는 것이다. 당연히, ADC 의 resolution 이 높을 수 록, 더 정확한 analog 전압값을 측정할 수 있다.  

    " GPIO 가 analog mode 로 설정되면, input pull-up/pull-down register 들은 disconnected 된다. 즉, floating 상태가 된다. 당연한 얘기겠지만, 모든 GPIOs 들이 analog mode 로 설정 가능한 것은 아니다. analog mode 를 지원하지 않는 SoC 또한 존재하다. 그러므로, 반드시 SoC 의 datasheet 를 참고해야 한다.

    2. Alternate function
    " GPIO 는 UART, I2C, SPI 등과 같이 특정 기능을 수행할 수 있는 핀으로 converted 가 가능하다. 이 또한 SoC 의 datasheet 를 참고해야 한다. 아래 Alternate function 은 bcm2835(raspberry pi 3 b+) 의 datasheet 다.


    BCM2835 ARM Peripherals

     

     

    " 그리고, 각 mode 당 설정 가능한 전기적 특성이 서로 다르다. 이 글에서는 크게 2가지 모드만 확인한다.

    1. Input
    2. Output

     

     

    " 실제 GPIO 핀 구조는 아래와 같다. 각 GPIO 핀들은 2개의 buffer 를 가지고 있다. enable line 이 `0` 일 경우, output buffer 가 active 가 되고, input buffer 는 de-actived 된다. 즉, GPIO 가 ouput mode 로 사용되는 것이다. 만약, enable line 이 `1` 이라면, output buffer 가 de-actived 가 되고, input buffer 는 active 된다. 즉, GPIO 가 input mode 로 사용되는 것이다. 

    1. Input buffer
    2. Output buffer with enable line

    Figure - 2

     

     

    " 위 구조에서 GPIO output mode 와 input mode 의 signal flow 는 다음과 같다. 이 내용을 조금만 더 세부적으로 알아보자. 

     

    GPIO Output Mode GPIO Input Mode

     

     

     

    1. GPIO Output mode

    " 먼저 GPIO 가 output mode 에서 어떻게 동작하는지 알아보자. 위에서 이미 언급했다시피, enable line 이 `0` 이 되면, output  buffer 가 active 되면서 GPIO 는 output mode 로 동작할 수 있게 된다. output buffer 는 2 개의 `CMOS transistors(NMOS & PMOS)`에 연결된다. CMOS 란 logic function 을 구현하기 위해 N-type(NMOS) 과 P-type(PMOS) 트랜지스터를 이용하는 MOFSET 의 한 종류다.

     

     

     

    " 위 그림에서 T1 은 PMOS 트랜지스터, T2 는 NMOS 트랜지스터를 의미한다. NMOS 에 전압 `high` 가 인가되면, On 되고 `low` 가 인가되면, Off 된다. PMOS 는 완전 반대라고 생각하면 된다. 즉, `high` 가 인가되면, Off 가 되고, `low` 가 인가되면, On 된다.

     

     

    `1` 을 출력하려면, 어떻게 해야할까? inverted buffer 에 1 을 인가하면 된다. inverted buffer 에 1 을 인가하면, 출력은 0 이 나온다. PMOS 는 0 을 받으면, switch on 되는 성질이 있다. 그리고, PMOS 와 complementary 관계인 NMOS 는 0 이 된다. PMOS 가 On 되므로, T1 에 Vdd 가 흐르게 되고 GPIO Pin 에는 1 이 출력된다.

     

    " 그렇다면, `0` 은 어떻게 출력해야 할까? inverted buffer 에 0 을 인가하면 된다. inverted buffer 에 0 을 인가하면, 출력은 1 이 나온다. PMOS 는 1 을 받으면, switch off 되는 성질이 있다. 그리고, PMOS 와 complementary 관계인 NMOS 는 1 이 된다. NMOS 가 On 되므로, T2 가 GND 와 연결되면서, GPIO Pin 에는 0 이 출력된다.

     

     

     

    " GPIO 가 output mode 로 설정될 때, 사용할 수 있는 configuration 은 2 가지가 있다.

    1. Push-Pull
    2. Open-Drain(Open-Collector, Open-emitter, Open-source)

     

     

    1.1 Push-Pull

    " GPIO 가 output mode 로 설정될 경우, 기본적으로 설정되는 모드가 Push-Pull 이다. Push-Pull 구조는 PMOS & NMOS 트랜지스터를 이용해서 `Push` 시에 `1` 을 출력하고, `Pull` 시에 `0` 을 출력한다.  모두 달려있기 때문에, pull-up / pull-down 저항은 필요없다. 왜냐면, PMOS & NMOS 트랜지스터가 pull-up / pull-down 의 역할을 하기 때문이다. 위에서 본 예시들이 Push-Pull 회로다.

     

     

    1.2 Open-Drain [참고1]

    " 이 글에서는 Open-Drain 회로만 설명하지만, 이것말고도 Open-collector, Open-emitter, Open-source 등의 output 이 있다. 이 회로들을 통합해서 `open output` 이라고 부른다. 왜냐면, 구조가 모두 동일하기 때문이다. open outputs 들의 구조는 모두 transistor 를 하나만 사용한다. 그래서, transistor 가 Off 라면, GPIO 는 Hi-Z 상태가 된다. 각, open outputs 들의 차이는 BJT or MOFSET 을 사용하느냐의 차이다.

    1. MOFSET - Open drain & Open source
    2. BJT - Open emitter & Open collector

     

    " Push-Pull 회로에서 위쪽 PMOS 를 제거하면, Open-Drain 회로가 된다. NMOS 에 HIGH 가 인가되면, GND 와 연결되면서 0 을 출력한다. 만약, NMOS 에 LOW 가 인가되면, GPIO 는 Vdd & GND 모두와 연결되어 있지 않기 때문에 floating 상태가 된다. 즉, GPIO 의 출력 결과가 low 및 high impedance 가 될 수 있다는 뜻이다. 결국, 자기 스스로는 HIGH 를 만들 수 없는 회로다. Open-Drain 구조에서 GPIO output 으로 HIGH 를 출력하려면, 반드시 external pull-up register 가 추가되어야 한다. Open-Drain 의 좀 더 세부적인 내용은 이 글을 참고하자.

     

    " `Open-Drain` 이라는 이름은 MOFSET`s drain 이 내부적으로 아무것도 연결되어 있지 않다(open) 는 것에서 유래된다. 만약, MOFSET 이 아닌 BJT 를 사용할 경우, Open-Collector 가 된다.

     

     

     

    1.3 Slew rate & Drive strength [참고1 참고2 참고3 참고4 참고5]

    " drive-strength 는 말 그대로 current source 에서 attached load 로 얼마나 많은 양의 current 를 흘릴 수 있는지를 나타낸다. 그런데, drive-strength 를 단순히 전류의 양이라고만 보면 의미를 제대로 이해하지 못한 것이다. drive-strength 를 이해하기 위해서는 먼저 slew-rate 를 이해해야 한다. slew-rate 란, digital signal 이 한 번 HIGH -> LOW 혹은 LOW -> HIGH 시에 발생한 최대 변화율을 의미한다.

     

    low slew rate fast slew rate

     

    " slew rate 가 낮을 수 록, clock 은 높아진다. 이 부분은 조금만 생각해보면 바로 알 수 있다. 예를 들어, 8MHz 란 1 초 동안 800,000 번 frequency 가 발생한다는 뜻이다. frequency 의 발생은 결국 LOW -> HIGH 와 HIGH -> LOW 의 조합이다. 이게 빠르다는 것은, 즉, slew-rate 가 빠를 경우 frequency 가 더 비번하게 발생할 수 있고, frequency 가 증가한다는 것은 clock 이 증가한다는 것과 같다. 여기서 slew rate 와 drive strength 의 관계를 알아볼 필요가 있다.

     

    " output drive current(drive strength) 값은 `final output MOFSET 의 저항` 과 깊은 관련이 있다. 왜냐면, 높은 output drive 를 가진 GPIO 일 수록, low switch resistances 를 갖고 fast slew rate 를 갖기 때문이다. 결론적으로, output drive 가 높을 수 록, slew rate 가 더 높아진다고 볼 수 있다. 그렇다면, 이 내용을 하드웨어적으로는 어떻게 적용해야 할까?

     

    " PandaBoard 및 BeagleBoard 와 같은 오픈소스 하드웨어들은 대개 굉장히 낮은 output drive 를 갖는다. 예를 들어, 거의 대부분의 핀이 4mA 이하의 drive strength 만을 지원한다. 이렇게 drive strength 가 낮은 핀들은 slew rate 도 낮을 수 밖에 없다. 그래서, PandaBoard 및 BeagleBoard 는 UART or I2C 와 같은 low speed protocol 를 주로 사용한다. 그런데, USB or SPI 와 같은 high speed protocol 에서 low slew rate 를 갖는 pin 을 사용하게 될 경우, data corruption 이 발생할 수 있다. 왜냐면, high speed protocol 은 높은 slew rate 를 요구하기 때문이다. 즉, high speed protocol 은 사용하려면, 결국 높은 drive strength 가 필요하다는 뜻이고, 동시에 높은 slew rate 가 필요하다는 뜻이기도 하다.

     

    " 참고로, 16MHz Arduino 가 100 MHz slew rate 를 인지할 수 는 없다. 반드시, maximum frequency limitation 을 확인해야 한다. 

     

     

     

    2. GPIO Input mode

    " `Figure - 2` 에서 enable line 에 1 을 인가하면, output buffer 가 de-actived 되고, 대신에 input buffer 가 active 된다. GPIO input buffer 또한 output buffer 와 마찬가지로 CMOS 구조를 따르고 있다. 그런데, 약간에 차이가 있다. GPIO input 은 gate 가 GPIO Pin 쪽에 연결되어 있고, drain 은 Processor 와 연결되는 구조다.

     

     

     

    " 만약, extenal devce 에서 GPIO Pin 에 1 을 인가하면, inverted buffer 를 거쳐 0 이 된다. 이 시그널은 PMOS 를 On 시키고, NMOS 는 Off 시킨다. T1 이 switch on 되면서, drain 으로 HIGH 시그널이 흐르게 된다. 0 을 인가했을때는 PMOS 와 NMOS 가 complementary 관계임을 고려해서 결과값은 반대가 된다.

     

    GPIO Input == 1 GPIO Input == 0

     

     

    " GPIO 가 input mode 로 설정될 때, 사용할 수 있는 configuration 은 3 가지가 있다.

    1. High-impedance or Floating
    2. Pull-up
    3. Pull-down

     

     

     

    2.1 High-impedance or Floating

    " 회로적으로 High-impedance, Floating or Open 은 모두 동일한 의미로 사용된다. floating 상태가 되는 이유는 pin 이 Vcc(HIGH) 혹은 GND(LOW) 중에 어디에도 연결되어 있지 않기 때문이다. 결국 이 말은 pin 이 open 되어있다는 뜻이된다. 일반적으로 SoC 가 Power-On 되면, 대부분의 GPIO 들은 input mode 로 동작하며, configuration 은 High-impedance 로 설정된다. 

     

    " 일반적으로, High-impedance 는 외부에서 컨트롤 되도록 하기 위해서 사용된다. 이 용도로 사용하지 않을 것이라면, leakage current 를 줄이기 위해 반드시 unused pins 들은 pull-up 혹은 pull-down 으로 설정하는 것이 권고된다. floating 상태는 noise 를 쉽게 받아들이기 때문에, leakage current 를 유발하기 쉽다.

     

     

     

    2.2 Pull-up

    " High-impedance or Floating 피하기 위해서 pull-up 저항이 사용된다. 아래 구조에서 볼 수 있다시피, GPIO input mode 에서 설정되는 pull-up 저항은 internal pull-up registor 을 의미한다. GPIO output 가 다르게, input 은 자신이 값을 컨트롤할 수 없기 때문에 언제든 floating 값이 들어올 수 있다는 것을 항시 주의해야 한다(왜냐면, 상대편쪽에서 floating 상태로 둘 수 있기 때문이다). GPIO input mode 로 pull-up configuration 을 설정되면, 상대편쪽에서 GND 로 내리거나 혹은 external pull-down registor 를 사용하지 않는한 계속 HIGH 를 유지한다.

     

     

     

     

    2.3 Pull-down

    " pull-up resistor 와 마찬가지로 High-impedance or Floating 피하기 위해서 pull-down 저항이 사용된다. 아래 구조에서 볼 수 있다시피, GPIO input mode 에서 설정되는 pull-down 저항은 internal pull-down registor 을 의미한다. GPIO output 가 다르게, input 은 자신이 값을 컨트롤할 수 없기 때문에 언제든 floating 값이 들어올 수 있다는 것을 항시 주의해야 한다(왜냐면, 상대편쪽에서 floating 상태로 둘 수 있기 때문이다). GPIO input mode 로 pull-down configuration 을 설정되면, 상대편쪽에서 Vdd 로 당기거나 혹은 external pull-up registor 를 사용하지 않는한 계속 LOW 를 유지한다.

     

     

     

     

    2.4 Hysteresis & Bus-hold(Repeater) [참고1]

    " 지금까지는 GPIO input mode 설정 시, signal level 을 기준으로 `HIGH` or `LOW` 를 판단하는 회로를 살펴봤다. 이번에는 GPIO input mode 중에 조금 독특한 전기적 특성을 갖는 Bus-hold mode 에 대해 알아보려고 한다(Hysteresis 는 이 글을 참고하자).

     

    " bus-keeper 회로는 직전 signal level 을 유지하는 성질을 가지고 있다. 그렇다면, 이 회로를 사용하는 이유가 뭘까? bus line 을 floating state 로 두지 않기 위함이다. 일반적으로, unused input pins 들은 모두 pull-up or pull-down resistor 를 달아서 leakage current 가 발생하지 않도록 해야한다. 그러나, 이 방식은 결국 외부에 도움이 필요하다는 뜻이다(pull-up / pull-down 사용). 그러나, bus-keeper 회로가 추가되면 extenal resistor 의 도움을 받지 않고도, 내부적으로 input level 을 HIGH 혹은 LOW 로 고정할 수 있다. 예를 들어, 일반적인 input pins 들은 외부 회로가 powered-off 되면, floating state 가 될 것이다. 이 때, bus-keeper circuit 를 사용하면 이전 상태를 유지할 수 있다(HIGH or LOW). 이렇게 함으로써, stable 한 signal 을 유지할 수 있기 때문에 전력 소비를 줄일 수 있다.

     

     

     

     

    '공학 > 전자공학' 카테고리의 다른 글

    [전자공학] Camera & Display - Basic 1  (0) 2024.01.06
    [전자 공학] Set-up time vs Hold-up time  (0) 2023.08.16
    [전자공학] Clock gating  (0) 2023.08.13
    [전자공학] Power gating  (0) 2023.08.13
    [전자공학] 전압강하  (0) 2023.08.07
Designed by Tistory.