« ダイソー「LOOPER」(1000mAh) 充放電実験 400サイクル終了 | トップページ | マイコン出力ポートのプルアップ、プルダウン問題 誤パルス出力を避けるために »

2022年5月 1日 (日)

Raspberry Pi Pico リセット起動後のポートはプルダウン抵抗が有効に

まだまだ使いこなせていないRaspberry Pi Picoですが、
ラジオペンチさんところの
Raspberry Pi Picoで72LEDのクリスマスツリーイルミネーションを作る
この記事にコメントした関係で、PicoのI/Oポートについて
あれこれ調べてみました。

参考資料はこれ。
P11_20220501113801

I/Oポートの構成図、こんなのが記されています。
P12_20220501113801

その機能、ポート1ビットごと独立して設定できるように
なっています。
P21
P22

リセット後はこんな状態になります。
 ・出力は禁止。 入力ポートに。
 ・出力ドライブ能力は4mAに。
   (4種類あってmaxは12mA)
 ・プルアップ抵抗はなし。
 ・プルダウン抵抗が有効に。★
 ・入力のシュミットトリガー機能は有効。
 ・出力Slew rateはSlowに。
となっています。

Arduino UNOのAtmega328Pなどと異なるのが★の
プルダウン抵抗有効」という機能です。
これで「未使用ポート」の処理を省けます。

Arduino IDE下でスケッチを組んだ時、入出力を
決めるのに「pinMode()」を使います。
どんな処理がされているのか探しますと、
  ※wiring_digital.cppの中
~~~~~~~~~~~~~~~~~~~~~~~~~
void pinMode(pin_size_t ulPin, PinMode ulMode) {
 switch (ulMode) {
  case INPUT:
    gpio_init(ulPin);
    gpio_set_dir(ulPin, false);
    gpio_disable_pulls(ulPin);
    break;
  case INPUT_PULLUP:
    gpio_init(ulPin);
    gpio_set_dir(ulPin, false);
    gpio_pull_up(ulPin);
    gpio_put(ulPin, 0);
    break;
  case INPUT_PULLDOWN:
    gpio_init(ulPin);
    gpio_set_dir(ulPin, false);
    gpio_pull_down(ulPin);
    gpio_put(ulPin, 1);
    break;
  case OUTPUT:
    gpio_init(ulPin);
    gpio_set_dir(ulPin, true);
    break;
  default:
    DEBUGCORE("ERROR: Illegal pinMode mode (%d)\n", ulMode);
    return;
 }
 if (ulPin > 29) {
    DEBUGCORE("ERROR: Illegal pin in pinMode (%d)\n", ulPin);
    return;
 }
 _pm[ulPin] = ulMode;
}
~~~~~~~~~~~~~~~~~~~~~~~~~

gpio_disable_pulls();」という関数で、
「プルアップ抵抗、プルダウン抵抗、両方ともなし」を
設定しています。
全ポート一括して処理するという関数は用意されていない
ようです。


もう一つ。
gpio_init() 」の中味。
~~~~~~~~~~~~~~~~~~~~~~~~~
void gpio_init(uint gpio) {
  sio_hw->gpio_oe_clr = 1ul << gpio;
  sio_hw->gpio_clr = 1ul << gpio;
  gpio_set_function(gpio, GPIO_FUNC_SIO);
}

void gpio_init_mask(uint gpio_mask) {
  for(uint i=0;i<32;i++) {
    if (gpio_mask & 1) {
      gpio_init(i);
    }
    gpio_mask >>= 1;
  }
}
~~~~~~~~~~~~~~~~~~~~~~~~~
指定ピンを「GPIO_FUNC_SIO」にということで。

  ※SIOシリアルI/Oじゃなく、
   シングルサイクルI/Oのこと。
   ちょいと違和感がぁ。

 

|

« ダイソー「LOOPER」(1000mAh) 充放電実験 400サイクル終了 | トップページ | マイコン出力ポートのプルアップ、プルダウン問題 誤パルス出力を避けるために »

ラズパイ・ピコ」カテゴリの記事

コメント

詳しい解説ありがとうございます。チップ側で未使用の端子を入力のプルダウンにしておくのは空き端子処理としては正解なんでしょうね。RP2040のデーターシートを私も読み始めました。
https://datasheets.raspberrypi.com/rp2040/rp2040-datasheet.pdf

5.2.3.4. IO Electrical Characteristicsに、プルアップ、プルダウン抵抗の値は50-80kΩと書かれていました。

ついでですが、
ADC InputImpedance 100kΩ(min)はちょっと低くて使い難いです。

ADCの特性がちょっと変なのは、4.9.4項(P588)に出てきて、チップの設計ミスみたいです。エラッタが出てました。

投稿: ラジオペンチ | 2022年5月 1日 (日) 14時44分

ADCの話、ありがとうございます。
すっきりしました。

私が見ていた(紙にプリントして)データーシート、リリース番号が「1.4.1」。
件のADCのerrataが出たのが「1.6」。
ちょっとの差で気が付きませんでした。

しかし・・・
 RP2040-E11
  Fixed by  Not fixed.
これは、どうにかしてほしいぞぉ。

投稿: 居酒屋ガレージ店主(JH3DBO) | 2022年5月 2日 (月) 12時50分

コメントを書く



(ウェブ上には掲載しません)




« ダイソー「LOOPER」(1000mAh) 充放電実験 400サイクル終了 | トップページ | マイコン出力ポートのプルアップ、プルダウン問題 誤パルス出力を避けるために »