GPIOとは
GPIOポートは、General Purpose Input/Ouputの略で、いくつかのI/O(Input/Output)ピンの集まりです。GPIOポートはその名前の通り、設定により入力として扱うことも出力として扱うことも可能です。以下の図のGPIOポートAは16本のIOピンの集まりです。PAはポートAのピン番号0を表しています。このポートは16本のピンがあるため、16ビット幅となります。それぞれのピンはGPIOのポートレジスタに対応するビットを参照しています。他のマイコンではGPIOポートのピンの数(ビット幅)は異なる可能性がありますが、大まかにはこのような構成です。

GPIOの内部構成
GPIOは一般的には、下図のように構成されています。入力用のと出力用のバッファが存在し、それぞれのどちらか一方を有効にするイネーブル信号で構成されています。
イネーブルが0の場合、出力バッファが有効になり、入力バッファが無効になります。ポートは出力モードとなります。
イネーブルが1の場合、出力バッファが無効になり、入力バッファが有効になります。ポートは入力モードとなります。

出力バッファ
実際には、次の図のようにPMOS, NMOSの2つのトランジスタを利用して出力バッファは構成されています。このトランジスタはCMOSトランジスタとも呼ばれ、GPIOピンではこの2つのトランジスタを接続したものが存在しています。

上記の説明では、Enable=0であれば、出力バッファが有効になると説明しました。Enable=0として、出力ポートとして使用したい場合、Enable=0と設定します。このときに、外部に1(High)を出力したい場合、CMOS自体には最初の反転回路により1に変換されます。したがって、1を入力するとPMOSが有効になり、NMOSが無効になります。このことにより、Vccにピンが電圧が引き上げられます。それにより、出力は1が設定されます。

もし、0を出力する場合は以下のようになります。この場合は、NMOSが有効になりピンはグラウンドに接続されるため、0が出力されます。

以上が出力バッファの内部的な仕組みになっています。
入力バッファ
上記の説明では、Enable=0であれば、出力バッファが有効になると説明しました。Enable=1として、入力ポートとして使用したい場合、Enable=1と設定します。このときに、入力バッファは以下のように構成されています。先程の出力バッファの内部的な回路をそのまま左右反転させたような構成になっていることがわかります。

もし、入力ピンに1が入力されたとします。この場合、反転回路により0が入力されることになります。このとき、PMOS側が有効になり、Vccに引き上げられ、1となります。

一方で、0が入力された場合、反転回路により1となり、NMOS側が有効になりグラウンドと接続されるため、0となります。

以上が入力バッファの仕組みになります。
GPIO 入力モード
ハイインピーダンス(フローティング)
組込みシステムの世界では、よくハイインピーダンスあるいはピンが浮いているなどといった用語が利用されます。ハイインピーダンスとは、電源電圧にもグラウンドに接続されていない、何も接続されていない状態を言います。このような場合、どこにも接続されておらず浮いているといったりもします。
多くのMCUの電源を入れたあとは、デフォルトですべてのGPIOピンが入力モードで、ハイインピーダンス状態になります。ピンをフローティング状態状態であると、リーク電流が発生する可能性があるため、高消費電力に繋がり望ましくありません。これは、フローティング状態では、ノイズの影響を受けやすく、リークの原因となる可能性があるためです。したがって、未使用のGPIOピンをHigh, Lowどちらかに固定することでノイズに強くなり、安全なシステム設計となります。どちらに固定するかはアプリケーションに依存して、ケースバイケースとなります。

プルアップ
MCUでは、上記のようなフローティング状態に対策するため、内部にプルアップあるいはプルダウンレジスタを持っていることがあります。これらのプルアップ/ダウンは、GPIOポート用のレジスタによって設定できるようになっていることがほとんどです。
内部のプルアップ抵抗について解説します。内部プルアップレジスタを利用すると、次の図のように電源電圧と接続されるため、ピンがVccに引き上げられ、固定します。

プルダウン
内部のプルダウン抵抗について解説します。内部プルダウン抵抗を利用すると、次の図のように、グラウンドと接続されるためピンがグラウンドと同じ電圧に固定されます。

出力モード
実際には出力モードには2つの構成があります。オープンドレインとプッシュプルの2つです。それぞれの違いを説明していきます。
オープンドレイン
GPIOポートが出力モードに設定されている場合、上の図のようになることは説明しました。オープンドレイン設定では、PMOSトランジスタは無効になります。NMOSトランジスタのみが有効になるように設定されます。ゲート電圧がHighの場合(トランジスタがONの場合)、ピンはグラウンドと接続されるため、グラウンドと同じ電圧になります。

一方で、ゲートの電圧がLowの場合、トランジスタがOFFとなり、ピンがフローティング状態になります。このようにドレインがオープン(フローティング状態)となっているため、オープンドレイン構成と呼びます。

したがって、オープンドレイン構成の場合、プルアップ抵抗を何らかの手段で導入する必要があります。MCU内部であるいは外部でプルアップ抵抗をしない限り、オープンドレイン構成での出力は無意味なものになってしまいます。多くのマイコンでは、内部プルアップ抵抗は機能として提供されています。
左の図は内部のプルアップ抵抗を利用した場合の回路図、右は外部のプルアップ抵抗を利用した場合の回路図になります。


I2Cなどはオープンドレイン構成なので、必ずプルアップ抵抗が必要になります。
プッシュプル
GPIOポートを出力モードとして設定した場合、一般的にデフォルト設定ではプッシュプル設定になります。プッシュプル構成では以下のように、PMOS, NMOS両方利用します。この構成図からわかるように浮いている部分はないためプルアップ、プルダウン抵抗は必要ありません。出力バッファで紹介した図と同じです。
したがって、動作原理も同じです。出力を1にしたい場合、PMOSが有効になり、NMOSが無効になります。結果として、ピンはVccが出力されることとなります。したがって、1が出力されます。
出力を0にしたい場合、NMOSが有効になり、PMOSが無効になります。結果として、ピンはグランドと同じ電圧が出力されることとなります。したがって、0が出力されます。

まとめ
本記事では、GPIOについて解説しました。GPIOには出力モード、入力モードがあることを解説しました。入力モードでは、ピンをフローティング状態にしないため、プルアップ/プルダウン抵抗のどちらかを利用する必要があることを解説しました。また、出力モードにはオープンドレイン、プッシュプル構成の2つがあることを解説しました。
コメント