ESP32のGPIO系情報を表示する(+GPIOマトリクス概要)

概要

前回ピンの方法を取得しましたが、I2Cなどが設定されているかがわかりませんでした。今回もうすこし深いところのレジスタを取得して、どんな用途で利用されているのかも表示できるようにしてみました。

ESP32のGPIOの仕組み

GPIOは0から39までの40個あり、34から39までは入力専用になります。また、24と28から31までは利用することができないようです。

さて、この40個のGPIOですがADCが利用可能なRTC経由のGPIOと、それ以外のGPIOに分かれています。RTC経由だとULP(Ultra Low Power)からもアクセス可能な利点などがありますが、今回は深く触れません。

通常のGPIOとして利用する場合には、このまま直結で問題ないのですがUARTなどをハードウエア制御をする場合には、特殊な回路に接続する必要があります。このための機能がプリフェラルや、GPIOマトリクスと呼ばれています。

UARTの場合には送信のTXと、受信のRXがあります。送信の場合にはCPUからUARTの送信専用回路にデータが送られ、ハードウエア処理をしてその結果を実際のGPIOに接続し、送信します。

同じように受信のRXの場合GPIOで受信し、UARTの受信専用回路に信号が送られ、ハードウエア処理をした結果をCPUが受け取ります。この専用回路とGPIOを紐付けるのがGPIOマトリクスになります。存在はなんとなく知っていましたが、ライブラリを利用していると自動的に設定されるため、意識せずに使うことができます。

受信時の処理(INPUT)

受信時は0から255までの受信用専用回路に対して、どのGPIOを設定するかを指定します。

FUNC SIG_IN_SEL FUNC_IN_INV_SEL FUNC_IN_SEL NOTE
   1          1               0          17 SPIQ
   2          1               0           8 SPID
  14          1               0           3 U0RXD/TXD
  17          1               0           0 U1RXD/TXD
  29          1               0          33 I2CEXT0_SCL
  30          1               0          32 I2CEXT0_SDA
  95          1               0          22 I2CEXT1_SCL
  96          1               0          21 I2CEXT1_SDA

上記のような関係になり、FUNCで回路を指定してSIG_IN_SELが有効フラグです。ここでは有効なファンクションしか表示していません。FUNC_IN_INV_SELが信号を反転するかで、FUNC_IN_INV_SELが指定するGPIOになります。

NOTEはファンクションの説明で、私が仮に入れたものになります。

送信時の処理(OUTPUT)

0から39のGPIOに対して、そのままCPUに接続するのか、出力用専用回路に接続するのかを設定するレジスタが存在しています。

GPIO FUNC_OEN_INV_SEL FUNC_OEN_SEL FUNC_OUT_INV_SEL FUNC_OUT_SEL NOTE
   1                0            0                0           14 U0RXD/TXD
   6                0            0                0            0 SPICLK
   8                0            0                0            2 SPID
  16                0            0                0            5 SPICS0
  17                0            0                0            1 SPIQ
  21                0            0                0           96 I2CEXT1_SDA
  22                0            0                0           95 I2CEXT1_SCL
  26                0            0                0           17 U1RXD/TXD
  32                0            0                0           30 I2CEXT0_SDA
  33                0            0                0           29 I2CEXT0_SCL

上記のような構造になり、GPIO別にファンクションを指定する形です。

関数化しました

#include "M5StickC.h"
#include "ESP32LiteDebugGPIO.h"

void setup() {
  M5.begin();
  delay(1000);
  dispGpio();
}

void loop() {
}

ライブラリマネージャーより、ESP32LitePackを入れてもらうと、スケッチ例にESP32LiteDebugGPIOがあります。この例ではM5StickCですが、素のESP32でも利用することができます。

GPIO LEVEL OUTPUT ADC PULLUP PULLDOWN OPEN_DRAIN I/O NOTE 
-----------------------------------------------------------------------------
   0 HIGH  INPUT      PULLUP                     I/O 
   1 LOW   OUTPUT                                I/O [O]U0TXD_OUT_IDX
   2 LOW   INPUT             PULLDOWN            I/O 
   3 HIGH  INPUT                                 I/O [I]U0RXD_IN_IDX
   4 LOW   INPUT             PULLDOWN            I/O 
   5 HIGH  OUTPUT                                I/O 
   6 LOW   OUTPUT     PULLUP                     I/O [O]SPICLK_OUT_IDX
   7 HIGH  INPUT      PULLUP                     I/O 
   8 LOW   OUTPUT     PULLUP                     I/O [O]SPID_OUT_IDX
   9 HIGH  INPUT      PULLUP                     I/O 
  10 HIGH  INPUT      PULLUP                     I/O 
  11 HIGH  INPUT      PULLUP                     I/O 
  12 LOW   INPUT             PULLDOWN            I/O 
  13 LOW   OUTPUT                                I/O [O]VSPICLK_OUT_IDX
  14 HIGH  INPUT      PULLUP                     I/O 
  15 LOW   OUTPUT                                I/O [O]VSPID_OUT_IDX
  16 HIGH  OUTPUT     PULLUP                     I/O [O]SPICS0_OUT_IDX
  17 HIGH  OUTPUT     PULLUP                     I/O [O]SPIQ_OUT_IDX
  18 HIGH  OUTPUT                                I/O 
  19 LOW   INPUT                                 I/O [I]VSPIQ_IN_IDX
  20 LOW   INPUT                                 I/O 
  21 HIGH  OUTPUT     PULLUP          OPEN_DRAIN I/O [O]I2CEXT1_SDA_OUT_IDX
  22 HIGH  OUTPUT     PULLUP          OPEN_DRAIN I/O [O]I2CEXT1_SCL_OUT_IDX
  23 HIGH  OUTPUT                                I/O 
  25 LOW   INPUT                                 I/O 
  26 LOW   INPUT                                 I/O 
  27 LOW   INPUT                                 I/O 
  32 LOW   INPUT                                 I/O 
  33 LOW   INPUT                                 I/O 
  34 LOW   INPUT                                 I   
  35 LOW   INPUT                                 I   
  36 LOW   INPUT                                 I   
  37 HIGH  INPUT                                 I   
  38 LOW   INPUT                                 I   
  39 HIGH  INPUT                                 I   

結果は上記みたいな出力がされます。M5Liteライブラリで、シリアルモニタからGPIOを送信しても表示されるようになっています。実際の処理はESP32LiteDebugGPIO.hの中身を見てもらえればわかると思いますので、解説しません。レジスタからゴリゴリ情報を集めているだけになります。

データの見方ですが、左からGPIOと現在の信号レベル、INPUTかOUTPUTかのpinModeと、プルアップなどの設定値、I/O種別と割り当てられたファンクションになります。

UART0はSerialクラスなので、GPIO1がTX、GPIO3がRXに設定されているのがわかります。SPI系がフラッシュで、VSPI系がLCD周り、内部で利用しているI2Cが21と22に設定されていることなどがわかります。

ファンクションが設定されていないGPIOでも内部で利用されている場合があるので注意してください。例えばLCDで使われているSPIのCS信号はGPIO5なのですがOUTPUTにはなっていますがファンクションは指定されていません。CS信号は単純なので直結のGPIOとして利用されています。

ESP32のSerial.begin()のみ

GPIO LEVEL OUTPUT ADC PULLUP PULLDOWN OPEN_DRAIN I/O NOTE 
-----------------------------------------------------------------------------
   0 HIGH  INPUT      PULLUP                     I/O 
   1 LOW   OUTPUT                                I/O [O]U0TXD_OUT_IDX
   2 LOW   INPUT             PULLDOWN            I/O 
   3 HIGH  INPUT                                 I/O [I]U0RXD_IN_IDX
   4 LOW   INPUT             PULLDOWN            I/O 
   5 HIGH  INPUT      PULLUP                     I/O 
   6 LOW   OUTPUT     PULLUP                     I/O [O]SPICLK_OUT_IDX
   7 HIGH  INPUT      PULLUP                     I/O 
   8 LOW   OUTPUT     PULLUP                     I/O [O]SPID_OUT_IDX
   9 HIGH  INPUT      PULLUP                     I/O 
  10 HIGH  INPUT      PULLUP                     I/O 
  11 HIGH  INPUT      PULLUP                     I/O 
  12 LOW   INPUT             PULLDOWN            I/O 
  13 LOW   INPUT             PULLDOWN            I/O 
  14 HIGH  INPUT      PULLUP                     I/O 
  15 HIGH  INPUT      PULLUP                     I/O 
  16 HIGH  OUTPUT     PULLUP                     I/O [O]SPICS0_OUT_IDX
  17 HIGH  OUTPUT     PULLUP                     I/O [O]SPIQ_OUT_IDX
  18 HIGH  INPUT                                 I/O 
  19 LOW   INPUT                                 I/O 
  20 LOW   INPUT                                 I/O 
  21 HIGH  INPUT                                 I/O 
  22 HIGH  INPUT                                 I/O 
  23 LOW   INPUT                                 I/O 
  25 LOW   INPUT                                 I/O 
  26 LOW   INPUT                                 I/O 
  27 LOW   INPUT                                 I/O 
  32 LOW   INPUT                                 I/O 
  33 LOW   INPUT                                 I/O 
  34 LOW   INPUT                                 I   
  35 LOW   INPUT                                 I   
  36 LOW   INPUT                                 I   
  37 LOW   INPUT                                 I   
  38 LOW   INPUT                                 I   
  39 LOW   INPUT                                 I  

試しにいろいろ取得してみました。上記がプレーンな状態のESP32になります。UART0とフラッシュのSPIしか指定されていません。未指定の未使用でもプルアップされているGPIOなどがあるので注意して利用する必要があります。

M5Stack

GPIO LEVEL OUTPUT ADC PULLUP PULLDOWN OPEN_DRAIN I/O NOTE 
-----------------------------------------------------------------------------
   0 HIGH  INPUT      PULLUP                     I/O 
   1 LOW   OUTPUT                                I/O [O]U0TXD_OUT_IDX
   2 LOW   INPUT             PULLDOWN            I/O 
   3 HIGH  INPUT                                 I/O [I]U0RXD_IN_IDX
   4 HIGH  OUTPUT                                I/O 
   5 HIGH  INPUT      PULLUP                     I/O 
   6 LOW   INPUT      PULLUP                     I/O 
   7 HIGH  OUTPUT     PULLUP                     I/O [O]SPIQ_OUT_IDX
   8 LOW   OUTPUT     PULLUP                     I/O [O]SPID_OUT_IDX
   9 HIGH  OUTPUT     PULLUP                     I/O [O]SPIHD_OUT_IDX
  10 HIGH  OUTPUT     PULLUP                     I/O [O]SPIWP_OUT_IDX
  11 HIGH  OUTPUT     PULLUP                     I/O [O]SPICS0_OUT_IDX
  12 LOW   INPUT             PULLDOWN            I/O 
  13 HIGH  INPUT             PULLDOWN            I/O 
  14 HIGH  OUTPUT                                I/O 
  15 HIGH  INPUT      PULLUP                     I/O 
  16 HIGH  INPUT                                 I/O 
  17 LOW   INPUT                                 I/O 
  18 LOW   OUTPUT                                I/O [O]VSPICLK_OUT_IDX
  19 HIGH  INPUT                                 I/O [I]VSPIQ_IN_IDX
  20 LOW   INPUT                                 I/O 
  21 HIGH  INPUT                                 I/O 
  22 HIGH  INPUT                                 I/O 
  23 LOW   OUTPUT                                I/O [O]VSPID_OUT_IDX
  25 LOW   INPUT                                 I/O 
  26 LOW   INPUT                                 I/O 
  27 HIGH  OUTPUT                                I/O 
  32 HIGH  OUTPUT                                I/O [O]LEDC_HS_SIG_OUT7_IDX
  33 HIGH  OUTPUT                                I/O 
  34 LOW   INPUT                                 I   
  35 LOW   INPUT                                 I   
  36 LOW   INPUT                                 I   
  37 HIGH  INPUT                                 I   
  38 HIGH  INPUT                                 I   
  39 HIGH  INPUT                                 I   

GPIO32がLEDCに設定されています。これはPWMのことですね。利用用途を調べるとLCDのバックライトになっています。

M5Stack Core2

GPIO LEVEL OUTPUT ADC PULLUP PULLDOWN OPEN_DRAIN I/O NOTE 
-----------------------------------------------------------------------------
   0 HIGH  INPUT      PULLUP                     I/O 
   1 LOW   OUTPUT                                I/O [O]U0TXD_OUT_IDX
   2 LOW   INPUT             PULLDOWN            I/O 
   3 HIGH  INPUT                                 I/O [I]U0RXD_IN_IDX
   4 HIGH  OUTPUT                                I/O 
   5 HIGH  OUTPUT                                I/O 
   6 LOW   INPUT      PULLUP                     I/O 
   7 HIGH  OUTPUT     PULLUP                     I/O [O]SPIQ_OUT_IDX
   8 LOW   OUTPUT     PULLUP                     I/O [O]SPID_OUT_IDX
   9 HIGH  OUTPUT     PULLUP                     I/O [O]SPIHD_OUT_IDX
  10 HIGH  OUTPUT     PULLUP                     I/O [O]SPIWP_OUT_IDX
  11 HIGH  OUTPUT     PULLUP                     I/O [O]SPICS0_OUT_IDX
  12 LOW   INPUT             PULLDOWN            I/O 
  13 LOW   INPUT             PULLDOWN            I/O 
  14 HIGH  INPUT      PULLUP                     I/O 
  15 HIGH  OUTPUT                                I/O 
  16 HIGH  INPUT                                 I/O 
  17 LOW   INPUT                                 I/O 
  18 LOW   OUTPUT                                I/O [O]VSPICLK_OUT_IDX
  19 LOW   INPUT                                 I/O 
  20 LOW   INPUT                                 I/O 
  21 HIGH  OUTPUT     PULLUP          OPEN_DRAIN I/O [O]I2CEXT1_SDA_OUT_IDX
  22 HIGH  OUTPUT     PULLUP          OPEN_DRAIN I/O [O]I2CEXT1_SCL_OUT_IDX
  23 LOW   OUTPUT                                I/O [O]VSPID_OUT_IDX
  25 LOW   INPUT                                 I/O 
  26 LOW   INPUT                                 I/O 
  27 LOW   INPUT                                 I/O 
  32 LOW   INPUT                                 I/O 
  33 LOW   INPUT                                 I/O 
  34 LOW   INPUT                                 I   
  35 LOW   INPUT                                 I   
  36 LOW   INPUT                                 I   
  37 LOW   INPUT                                 I   
  38 HIGH  INPUT                                 I   [I]VSPIQ_IN_IDX
  39 HIGH  INPUT                                 I   

GPIOの使い方が変更されています。本当はこの資料の他に各GPIOがどこに接続されているのかの資料を合わせてみたほうが理解は早いと思います。

まとめ

ライブラリマネージャーからヘッダファイルをインクルドするだけで利用できるので、ぜひ試してみてください。レジスタからの読み出しだけなので、特別副作用はないはずです。

この資料と回路図を見直して、各M5シリーズのGPIO割当資料を完成させねば、、、

コメントする

メールアドレスが公開されることはありません。

管理者承認後にページに追加されます。公開されたくない相談はその旨本文に記載するかTwitterなどでDM投げてください。またスパム対策として、日本語が含まれない投稿は無視されますのでご注意ください。