質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.81%

ESP32のGPIOのダイレクトポートアクセスの方法について

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,751

Arduinoでは以下のようにレジスタを操作し、D8ピンとD9ピンの入力を同時に読み取りました。
byte input = PINB | ~0b00000011;

同じことをESP32-DevkitCの26ピンと27ピンを使ってやりたいと考えています。
公式のリファレンスの4.12 Register Summaryには、
NAME: GPIO_IN_REG 
Description: GPIO 0-31 input register
Address: 0x3FF4403C
Access: read only
とあり、この辺りにそれらしい事が書かれていることは調べがついたのですが、
具体的にどうコーディングすれば良いのか見当がつきません。
どなたかアドバイス頂けますでしょうか。

よろしくお願いいたします。

【5月24日追記】
アドバイス頂いたおかげで、期待通りの動きになりました。

アドバイス頂いた皆様、誠にありがとうございました。

最終的にこうなりました。

//26ピンと27ピンのフラグを立てる
static const uint32_t GPIO_IN_REG_MASK = 0b00001100000000000000000000000000;
void setup() {
  //26と27はインプットだよ。プルアップ抵抗よろしくね。
 pinMode(26, INPUT_PULLUP);
  pinMode(27, INPUT_PULLUP);
}
void loop() {
 uint32_t gpio_in_reg = *((uint32_t *)0x3FF4403C); // 読み取り
 gpio_in_reg = gpio_in_reg | ~GPIO_IN_REG_BUTTON_MASK; //マスクを使って必要なとこ以外は1に
 gpio_in_reg >>= 24;//必要なのは上位8ビットだけ
 byte input = gpio_in_reg;
 //inputには26ピンがONなら0b11111011が、27ピンがONなら0b11110111が入る
}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

多分

int x = *((int *)0x3FF4403C);
// 後はビット演算

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/05/23 20:12

    ozwkさん、ご回答いただきましてありがとうございます。教えていただいたコードを試してみたのですが、コンパイル時に以下のエラーが出てしまいました。
    sketch_may23a:936:28: error: invalid type argument of unary '*' (have 'int')

    int x = *(0x3FF4403C);

    ^

    exit status 1
    invalid type argument of unary '*' (have 'int')
    '*'を単一では用いることはできないといったメッセージかなぁ

    キャンセル

  • 2019/05/23 20:45

    すみませんint*にキャストしてください

    キャンセル

  • 2019/05/24 18:59

    ozwkさん、アドバイス頂きまして誠にありがとうございました。おかげさまで思い通りの動きにできました。昨日は思い通りにいかず、長い時間ネットを調べたものの、レジスタの操作について具体的に書かれたサイトが少なく困っておりましたので、より有り難さを感じております。深く感謝いたします。一応最終形を追記しておきました。

    キャンセル

+1

arduino IDE で、

uint32_t b=GPIO_IN_REG;

でコンパイル通りますね

#実機がどこかガラクタの山の中にいる(はず)なので未検証

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/05/23 22:15

    y_waiwaiさん、ご回答いただきましてありがとうございます。アドバイス頂いた通り、コンパイルが通りました。変数bにどんな値が入ってくるか検証してみます。ありがとうございました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.81%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る