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

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

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

Q&A

解決済

2回答

3112閲覧

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

morleyrobertson

総合スコア12

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

0グッド

0クリップ

投稿2019/05/23 07:59

編集2019/05/24 10:04

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日追記】
アドバイス頂いたおかげで、期待通りの動きになりました。

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

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

C++

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

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

arduino IDE で、

C

1uint32_t b=GPIO_IN_REG; 2

でコンパイル通りますね

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

投稿2019/05/23 09:04

y_waiwai

総合スコア87719

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

morleyrobertson

2019/05/23 13:15

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

0

ベストアンサー

多分

C

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

投稿2019/05/23 08:16

編集2019/05/23 11:44
ozwk

総合スコア13512

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

morleyrobertson

2019/05/23 11: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') '*'を単一では用いることはできないといったメッセージかなぁ
ozwk

2019/05/23 11:45

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

2019/05/24 09:59

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問