コンテンツにスキップ

GPIO

GPIOとは

GPIO(General Purpose Input Output)は、マイコンのピンを入力や出力として自由に利用できる機能である。

STM32やRaspberry Piなどのマイコンには多数のGPIOピンが搭載されている。

例えばSTM32では

PA0
PA1
PA2

PB0
PB1
PB2

などのピンがGPIOとして利用できる。


GPIOでできること

GPIOを利用すると様々な機器と接続できる。

入力

  • ボタン
  • DIPスイッチ
  • リミットスイッチ
  • センサ出力

出力

  • LED
  • リレー
  • MOSFET
  • ブザー

InputとOutput

GPIOには大きく分けて2つのモードがある。

モード 説明
Input 入力
Output 出力

Inputモード

外部からの信号を読み取る。

ボタン
 ↓
GPIO
 ↓
STM32

状態を読むと

押されていない → 0

押された → 1

のように判定できる。


Outputモード

GPIOから信号を出力する。

STM32
 ↓
GPIO
 ↓
LED

状態

0 → 消灯

1 → 点灯

HighとLow

GPIOは基本的に2つの状態しか持たない。


High

3.3V

または

5V

Low

0V

STM32の場合は通常

High = 3.3V

Low = 0V

となる。


GPIO入力例

回路

3.3V
 │
SW
 │
GPIO
 │
10kΩ
 │
GND

状態

押していない → 0

押した → 1

GPIO出力例

回路

GPIO
 │
330Ω
 │
LED
 │
GND

状態

GPIO = High
 ↓
LED点灯

GPIO番号

STM32では

PA0

PA1

PA2

のような名前が付いている。


意味

P = Port

A = Port A

0 = 0番ピン

例えば

PB7

なら

Port B の 7番ピン

となる。


GPIOの電流制限

GPIOは直接大電流を流せない。


例えばSTM32では

数mA〜数十mA程度

しか出力できない。


そのため

モータ

LEDテープ

ソレノイド

などは直接接続してはいけない。


代わりに

GPIO
 ↓
MOSFET
 ↓
負荷

のように接続する。


Pull-up / Pull-down

GPIO入力にはPull-upやPull-downがよく利用される。


Pull-up

通常 → High

押す → Low

Pull-down

通常 → Low

押す → High

入力を安定させるために必要である。


オープンドレイン

GPIOにはオープンドレインモードが存在する。


通常出力

High

Low

両方出力可能。


オープンドレイン

Lowのみ出力可能

I2C通信で利用される。


GPIO速度

STM32では出力速度を設定できる。

Low

Medium

High

Very High

LED程度なら

Low

で十分。


SPIなど高速通信では

High

Very High

が利用される。


GPIO割り込み

GPIOは入力変化を検出できる。


ボタン押下
 ↓
割り込み発生
 ↓
処理実行

ポーリングより効率的である。


ポーリングとの違い

ポーリング

while(1)
{
    ボタン確認
}

CPU負荷が高い。


割り込み

ボタン押下
 ↓
自動通知

CPU負荷が少ない。


STM32での利用

CubeMXで簡単に設定できる。


PA0

GPIO_Input

または

PA5

GPIO_Output

コード例

出力をHighにする

HAL_GPIO_WritePin(
    GPIOA,
    GPIO_PIN_5,
    GPIO_PIN_SET
);

出力をLowにする

HAL_GPIO_WritePin(
    GPIOA,
    GPIO_PIN_5,
    GPIO_PIN_RESET
);

入力を読む

HAL_GPIO_ReadPin(
    GPIOA,
    GPIO_PIN_0
);

LED点滅例

while(1)
{
    HAL_GPIO_TogglePin(
        GPIOA,
        GPIO_PIN_5
    );

    HAL_Delay(500);
}

結果

0.5秒点灯

0.5秒消灯

を繰り返す。


Asterでの利用例

ALEOではGPIOが大量に利用される。


DIPスイッチ

DIP SW
 ↓
GPIO入力

モータドライバ制御

GPIO
 ↓
DRV8871

LED表示

GPIO
 ↓
LED

割り込み入力

センサ
 ↓
GPIO
 ↓
Interrupt

よくあるトラブル

フローティング

Pull-upやPull-downが無い。


電流超過

GPIOから直接モータを駆動している。


ピン設定ミス

InputとOutputを逆にしている。


電圧超過

STM32へ5Vを直接入力している。


GPIOと他機能の関係

STM32のピンはGPIO以外にも利用できる。

GPIO

UART

SPI

I2C

ADC

PWM

そのため

PA9

をUARTに設定すると、

GPIOとしては利用できなくなる。


まとめ

GPIOはマイコンの最も基本的な機能である。

  • 入力と出力ができる
  • ボタンやLEDの制御に利用される
  • Pull-up/Pull-downで入力を安定化する
  • 割り込みに対応している
  • STM32のほぼ全ての機能の基礎となる

組み込み開発では最初に学ぶべき重要な機能であり、UART、SPI、I2C、PWMなども最終的にはGPIOピンを利用して実現されている。