起動時に読まれるピン(ストラップ)に LED を付けてはいけない

「このピン、LED を1個ぶら下げても平気ですよね」——平気ではありません。ストラップピンは、リセットが解除される一瞬だけ電圧を読んで起動モードを決め、そのあとはただの GPIO や LED ドライバとして働きます。LED は暗く光っているように見えなくても、内蔵プル抵抗(数十kΩ)に対しては十分な負荷で、ノード電圧を「H でも L でもない」帯に押し込みます。何 V になるか、どこまでなら安全か、node で計算して確かめます。

最終更新: 2026-09-23 ストラップピンGPIOESP32STM32Ethernet PHY起動

ストラップピンとは何か:リセット解除の一瞬だけ電圧を読む

多くの IC は、リセットが解除された瞬間(またはコンフィギュレーションが始まる瞬間)に、特定のピンの電圧を1回だけサンプルして、その後の動作を決めます。これがストラップピンです。サンプルが終わったあとにピンをどう扱うかは、デバイスによって2通りに分かれます。

①その後ふつうの I/O になるもの。Espressif ESP32 の GPIO0・GPIO2・GPIO12(JTAG の MTDI と兼用)・GPIO15(MTDO と兼用)は、起動直後だけ「ブートモードを決めるピン」として読まれ、読み終わったあとはアプリケーションが自由に使える GPIO です。ストラップとしての役目は一瞬で終わるので、設計者は「起動が終われば関係ない」と思いがちですが、電圧が決まるのはまさにその一瞬で、しかも電源投入のタイミングそのものです。

②ずっと専用ピンのままのもの。STM32 の BOOT0(多くの品種で専用ピン。一部の新しいシリーズはオプションバイトで PB8 に切り替え可能)や、多くの FPGA のコンフィギュレーションモードピン(Xilinx 7 シリーズの M[2:0]、Intel/Altera の MSEL など)は、リセット解除後も継続してそのブロックの設定として参照されるか、専用ピンのまま残ります。GPIO として転用はできませんが、「起動直後の電圧で動作が決まる」という性質は同じです。

Ethernet PHY のアドレス/モード設定ピンは、この2つの中間です。PHY アドレスや動作モード(オートネゴシエーション有無、インターフェースの種類など)は、リセット解除時に外部抵抗で決めるストラップとして規定されつつ、同じ物理ピンをリセット後は LED ドライバ(LINK/ACT 表示)として使う品種が多くあります。ストラップと LED 出力が同じピンを兼ねるため、この記事でいちばん事故が起きやすいのはここです。

具体例:ESP32 の GPIO12(MTDI)とフラッシュ電圧

もっとも有名で確実な例が、ESP32 の GPIO12(VDD_SDIO ストラップ、JTAG の MTDI と兼用)です。GPIO12 は内蔵プルダウンを持ち、既定では L(内蔵フラッシュ電圧レギュレータを 3.3V モードにする)に読まれます。リセット解除の瞬間に GPIO12 が H だと、レギュレータは 1.8V モードを選びます。基板に載っているフラッシュが 3.3V 品なら、1.8V では正しく読めず、起動できない、またはフラッシュの内容が化けて見える状態になります。

この機構自体はスイッチング電源の話ではなく、デジタル入力1本の H/L 判定です。だからこそ、「見た目は関係なさそうな LED」がこのピンに繋がっているだけで壊れます。次の節で、なぜ LED がノード電圧を動かすのかを数字で追います。

LED + 抵抗はなぜ「中間電圧」を作るのか

MCU の内蔵プル抵抗は、ふつう30〜50kΩ程度です(消費電流を抑えるためにわざと弱くしてあります)。ここに LED と抵抗を足すと、ストラップのノードは「内蔵プル」と「外付けの LED + 抵抗」の分圧回路になります。LED は理想ダイオードではなく、電流に応じて順方向電圧が変わる素子なので、正確には非線形の回路ですが、順方向電圧をおおよそ一定と見なして計算すると、事故が起きる理由がはっきり見えます。

内蔵プルダウン Rpd = 45kΩ、外付けは 3.3V から抵抗 Rext を通って LED(順方向電圧 VF ≈ 1.8V)に入り、ノードへ、というよくある「アクティブ L で光る LED」の配線で計算します。ノード電圧はV = Rpd(VDD − VF) / (Rpd + Rext)、LED に流れる電流はI = V / Rpdです。

ここが見落とされる点です。電流はどのみち Rpd(45kΩ)で頭打ちになるので、Rext を1kΩまで下げても LED には数十µAしか流れません。LED は目に見えて光らないのに、ノード電圧はしっかり1V台まで動きます。「LED が暗いから大丈夫」という直感は、ストラップピンでは通用しません。なお、LED の順方向電圧は電流が小さいほど下がる(指数関数のI-V特性のすそ野に入る)ので、数十µAでの実際の VF は 1.8V よりさらに低く、ノード電圧はここで示した概算よりもう少し高くなる方向です。安全側の見積りにはなりません。

LED+抵抗と内蔵プルダウンの分圧:抵抗値で結果が変わる内蔵プルダウン45kΩに対し、外付けのLED+抵抗(Rext)が分圧を作る。Rext=1kΩではノードが1.47Vまで持ち上がり不定域に入る。Rext=47kΩまで上げるとノードは0.73VでLと判定できるが、LED電流はどちらも数十µAで暗い。 × 不定域に入る LEDを実用的な明るさにしたい値。ノードは不定域 3.3V Rext 1kΩ LED IC ピン Rpd 45kΩ V ≈ 1.47V(不定域) LED電流 ≈33µA(目視ではほぼ光らない) ○ 安全(ただしLEDは暗い) LEDはかなり暗いが、ノードはLと判定できる 3.3V Rext 47kΩ LED IC ピン Rpd 45kΩ V ≈ 0.73V(Lと判定) LED電流 ≈16µA(さらに暗い) 電流はどのみち内蔵プル(45kΩ)で頭打ちになるので、Rextを下げても数十µAしか流れず、LEDは目に見えて光らない。 それでもノード電圧はRextの値でしっかり動く。「LEDが暗いから大丈夫」はストラップピンでは通用しない。
図1:内蔵プルダウン45kΩに対し、外付けのLED+抵抗が分圧を作る。R_ext = 1kΩ ではノードが1.47Vまで持ち上がり(VIH/VILどちらとも判定できない不定域)、R_ext = 47kΩ まで上げるとノードは0.73VでLと判定できる。どちらもLEDに流れる電流は数十µAで、目には暗くしか見えない。

値の決め方:VIH/VIL の帯に収まるか、node で確かめる

分圧が「H」「L」どちらとして読まれるかは、そのピンの VIH(High と判定する下限電圧)・VIL(Low と判定する上限電圧)で決まります。汎用 CMOS の目安であるVIH ≈ 0.7×VDD、VIL ≈ 0.3×VDDを仮に使うと、3.3V 系では VIH = 2.31V、VIL = 0.99V です。実機では、必ずそのピンのデータシートに載っている実際の VIH/VIL を確認してください。ストラップピン専用の、もっと厳しいしきい値(ヒステリシス付きのシュミットトリガなど)を規定している品種もあります。

内蔵プル 45kΩ に対して外付け抵抗 Rext を振り、ノード電圧がどこに落ちるかを計算した表です(VDD = 3.3V、LED VF ≈ 1.8V として簡略化)。

内蔵プルダウン45kΩ + 外付けLED(V_F≈1.8V)+抵抗R_extのノード電圧(V_DD=3.3V)。VIH=2.31V、VIL=0.99V(0.7/0.3×V_DDの目安)との比較
外付け抵抗 R_extノード電圧LED電流H/L の判定
1kΩ1.47V約33µA不定(VIL〜VIHの間)
10kΩ1.23V約27µA不定(VIL〜VIHの間)
22kΩ1.01V約22µAほぼ境界(VIL 0.99Vのすぐ上)
47kΩ0.73V約16µAL と判定できる(LEDはかなり暗い)

表が示す通り、LED を実用的な明るさで光らせたい抵抗値(数百Ω〜数kΩ)は、ほぼ確実に不定域に入ります。安全側に振ろうとして抵抗を大きくすると、今度は LED がほとんど光らなくなります。この2つは両立しません。だから「ストラップピンに直接 LED を付けない」が結論になります。付けるなら、後述するようにバッファを1段挟んで、ストラップの電圧そのものには影響させない形にします。

もう一つ確かめる値が、リセット解除までにノード電圧が確定しているかです。ストラップのネットにノイズ対策のコンデンサを(うっかり、あるいは意図的に)付けていると、内蔵プル抵抗とのRC時定数だけ電圧の確定が遅れます。Rpd = 45kΩ に対して τ = R×C は、C = 1nF で45µs(5τ=0.225ms)、C = 100nFで4.5ms(5τ=22.5ms)、C = 1µFで45ms(5τ=225ms)です。リセットIC の遅延(電源安定後にリセットを解除するまでの時間)は数十〜数百msの製品が多いので、数百pF〜数nF程度なら余裕がありますが、数百nF〜µFのコンデンサをストラップピンに「念のため」付けると、5τ がリセット解除のタイミングに近づき、ロット・温度・電源の立ち上がり時間のばらつきで、確定前に読まれる危険が出てきます。

外付けICの入力からも電流は流れ込む

LED だけが原因ではありません。同じストラップのネットに、レベル変換ICやロジックゲートの入力ピンがぶら下がっていると、そのICの内蔵プルアップ/プルダウンや、入力の保護(ESD)ダイオードを通して、ストラップのネットへ電流が出入りします。特に、そのICの電源がストラップ側と別系統で、電源投入の順序が違う場合が危険です。

たとえば、ストラップのネットに繋がったバッファICの電源がまだ立ち上がっていないのに、ストラップ側の電源(またはその先のプルアップ)が先に3.3Vまで上がると、バッファの入力保護ダイオードを通して、バッファの(まだ0Vに近い)電源レールへ電流が流れ込みます。ダイオード自体は電流を吸い込む方向にしか働かないので、流れ込んだ電流の行き先は、バッファ側のレールを持ち上げる形になります。この「電流が流れ込むと、行き先がなければレールが上がる」という現象自体は、LDO は電流を吸い込めないで説明した保護ダイオード経由の注入とまったく同じ構造です。ストラップのネット側から見れば、内蔵プルと外付け負荷の分圧に、もう1本、電流源だか電流吸い込み先だか分からない経路が増えることになります。

レビューでは、ストラップのネットに繋がっている部品を全部洗い出してください。LED、プルアップ/プルダウン抵抗、コネクタ経由で外部機器に伸びる配線、そして他ICの入力ピン(の内蔵プル・保護ダイオード)です。

Ethernet PHY:ストラップと LED ドライバが同じピン

多くの Ethernet PHY は、PHY アドレスや動作モードを、リセット解除時の外部抵抗で決めます。多くのデータシートは、この抵抗を内蔵プルより十分低い値(データシートで指定された値)にして、外部抵抗の意図が確実に勝つように設計せよと指示しています。ここまでは前の節までと同じ「内蔵プル対外付け抵抗の分圧」の話です。

ここからが PHY 特有の事情です。ストラップに使ったのと同じピンを、リセット解除後はLINK/ACT を示す LED のドライバ出力として再利用する品種が多くあります。つまり、ストラップとして使った抵抗が、そのまま LED の電流制限抵抗を兼ねる設計です。これは意図された仕様であり、正しく設計すれば問題ありません。問題は、この兼用を知らずに、ストラップの抵抗値をアドレス設定の都合だけで決めてしまい、結果として LED がまったく光らない(電流制限抵抗が大きすぎる)、または PHY アドレスが意図と違う値になる(LED を明るくしたくて抵抗を下げすぎた)という、両方から詰む状況です。

もう一つの注意点がアクティブ H/L の向きです。ストラップの抵抗を VDD 側に繋ぐか GND 側に繋ぐかでアドレスのビット値が変わるのと同様に、LED をどちら向きに挿すか(PHY 側がシンクするのかソースするのか)は、データシートのストラップ表と LED 駆動の説明の両方を読んで決める必要があります。片方だけを見て配線すると、アドレスは合っているのに LED が光らない、あるいはその逆が起こります。

Ethernet PHY:解除前はストラップ、解除後はLEDドライバPHYのアドレス/モード設定と、LINK/ACT LEDの駆動が同じピンを兼ねる回路。リセット解除前は外部抵抗でストラップとして読まれ、解除後は同じ抵抗・同じピンがLEDの電流制限とドライバを兼ねる。 ①リセット解除前:アドレス/モードのストラップデータシート指定の抵抗値(内蔵プルより十分低い)で、外部抵抗の意図を確実に勝たせる ②解除後:LINK/ACT LEDドライバとして動作同じ抵抗がLEDの電流制限抵抗を兼ねる。アドレス設定とLED輝度の両方の要求を満たす値にする 3.3V R 1kΩ LED PHY ピン この電圧でPHYアドレス/モードを判定抵抗値はストラップ表で決める PHYがピンをシンクしてLEDを駆動同じ抵抗がLEDの電流制限を兼ねる アドレスレジスタラッチ済み LINK/ACT点灯中 リセット解除前:外部抵抗の値でPHYアドレスや動作モードが決まる。抵抗値は内蔵プルより十分低くし、データシートのストラップ表どおりに選ぶ。 解除後:同じピンをLINK/ACT LEDのドライバとして使う品種が多い。抵抗値をLEDの明るさだけで決めると、アドレス設定の方が崩れる。
図2:Ethernet PHY のストラップ兼LEDピン。リセット解除前は外部抵抗でPHYアドレス/モードを決めるストラップとして読まれ(内蔵プルより十分低い抵抗で意図を確定させる)、解除後は同じ抵抗・同じピンをLEDの電流制限とドライバとして使う。

起動時の一瞬をどう可視化するか

ストラップの怖さは、問題になる電圧がリセット解除という一瞬にしか意味を持たないことです。定常状態でテスタを当てても、その後にファームウェアがGPIOとして駆動してしまえば、起動直後の電圧はもう見えません。オシロスコープでリセット信号(またはEN、CHIP_PUピンなど)の立ち上がりをトリガにして、ストラップのネットの電圧を同時に見るのが、実機で確認する唯一の方法です。

下の図は、その一瞬に何が起きるかを追ったものです。リセット中は内蔵プルと外付けLEDの分圧でノードがある電圧に落ち着いており、解除の瞬間にその電圧が1回だけラッチされます。ラッチされた値が不定域にあると、デバイスは「H」「L」のどちらとして読むか、個体差・温度・電源電圧のわずかな違いで変わり得ます。解除後は、同じピンがただのGPIOやLEDドライバとして動き、ストラップとしての意味は失われます。

リセット解除の瞬間にピンの電圧をラッチし、その後はふつうのGPIOになる内蔵プルダウン45kΩと外付けLED+抵抗で分圧されたノードの電圧を、リセット解除の瞬間に1回だけラッチする。ラッチされた電圧が不定域にあると、H/Lの判定は個体差や温度で変わり得る。解除後は同じピンがふつうのGPIOになる。3つの状態を順に表示するアニメーション。 ①リセット中:分圧でノード電圧が決まりつつある内蔵プルダウンとLED+抵抗の分圧で、ノードはある電圧に落ち着く。まだ何もラッチされていない ②リセット解除の瞬間:この1点の電圧をラッチするラッチされた電圧が不定域にあると、H/Lどちらに読まれるかは個体差・温度で変わり得る ③解除後:ストラップとしての役目は終わり、ただのGPIOになる以降はファームウェアがこのピンを自由に使う。誤ったモードで起動していれば、この時点ではもう手遅れ 3.3V Rext LED IC ピン Rpd 45kΩ 内蔵プルダウン(typ. 30〜50kΩ) ノード電圧 ≈1.2V ノード電圧 ≈1.2V ラッチ≈1.2V → 不定H/L判定は個体差で変わる 以降はGPIO ファームウェアが向きを決める ストラップの意味は消える リセット中:内蔵プルダウン45kΩと外付けLED+抵抗の分圧で、ノードはある電圧に落ち着く。この時点ではまだ何も確定していない。問題は次の瞬間に起きる。 リセット解除の瞬間、この1点の電圧だけがH/L判定に使われる。不定域にあると、量産のばらつきや温度でH/Lが入れ替わり得る。 解除後は同じピンがふつうのGPIOやLEDドライバとして動く。ストラップとしての意味はもう無いが、誤ったモードで起動していれば手遅れ。
図3:内蔵プルダウン(45kΩ)と外付けLED+抵抗で分圧されたノードを、リセット解除の瞬間に1回だけラッチする。ラッチされた電圧が不定域にあると、H/Lの判定は個体差や温度で変わり得る。解除後は同じピンがふつうのGPIOになり、ストラップとしての役目は終わる。

表で見る:VIH/VIL の帯のどこに落ちるか

前の表の4パターンを、電圧の帯として並べたのが下の図です。3.3V系の目安(VIH=2.31V、VIL=0.99V)に対して、LEDを実用的な明るさで光らせられる抵抗値(1kΩ〜10kΩ)は軒並み不定域に入り、確実にLと判定できるのは47kΩまで抵抗を上げた、LEDがかなり暗い条件だけです。この帯のどこにも触れないようにする、というのが値の決め方の実質的な基準になります。

外付け抵抗を変えたときのノード電圧を、VIH/VILの帯に重ねる内蔵プルダウン45kΩに対して外付け抵抗Rextを1k/10k/22k/47kΩと振ったときのノード電圧を、VIH(2.31V)/VIL(0.99V)の帯に重ねた図。1k〜22kΩは不定域に入り、47kΩでようやくLの帯に収まる。 0V 0.99V 2.31V 3.3V H の帯(≥2.31V) 不定域(VIL〜VIHの間) L の帯(≤0.99V) ノード電圧 1.47V Rext 1kΩ 1.23V Rext 10kΩ 1.01V Rext 22kΩ 0.73V Rext 47kΩ Rext を変えたときのノード電圧 VDD=3.3V、LED VF≈1.8V、内蔵プルダウン45kΩとして計算
図4:外付け抵抗R_extを変えたときのノード電圧を、VIH/VILの帯に重ねた図。1kΩ〜22kΩは不定域、47kΩでようやくLの帯に収まる。

設計レビューのチェック手順

  1. ストラップピンの一覧を作る。MCU/PHY/FPGAのデータシートで「strap」「boot mode」「configuration mode」「power-on」といった語で検索し、対象ピンと、リセット解除後にGPIOへ戻るかどうかを書き出す。
  2. そのネットに繋がっている全部品を洗い出す。LED、プルアップ/プルダウン抵抗、コネクタ経由の配線、他ICの入力ピン(内蔵プル・保護ダイオードを含む)を回路図から拾う。
  3. 内蔵プルの値をデータシートで確認する。「pull-up」「pull-down」の抵抗値(多くはtyp./min./max.のレンジで規定)を控える。分からなければ最悪ケース(プル無し、または最弱値)で計算する。
  4. ノード電圧をnodeなどで計算する。V = Rpull(VDD − VF) / (Rpull + Rext) の形で、外付け負荷を入れた場合の電圧を出す。LEDが複数の色候補を持つなら、VFが最も低い色(多くは赤)で計算する。
  5. そのピンの実際のVIH/VILと比較する。汎用の0.7/0.3×VDDではなく、そのピン固有の規定値(ヒステリシス付きシュミットトリガならさらに別の値)をデータシートで確認する。
  6. 外付けコンデンサがあればRC時定数を確認する。τ = Rpull × C を計算し、5τがリセットIC/電源シーケンサの遅延より十分短いか確かめる。
  7. PHYなど「ストラップとLED兼用」のピンは、アドレス表とLED駆動の説明を両方読む。抵抗値がアドレス設定とLED輝度の両方の要求を満たすか、満たさないなら兼用を諦めて別ピンにLEDを移せないか検討する。
  8. 実機で、リセット信号の立ち上がりをトリガにしてストラップのネットの電圧をオシロで確認する。電源電圧・温度を振って、不定域に触れないことを確認する。

実機で引っかかるところ

  • デバッグ用にLEDを1個足したら起動しなくなった。典型的にはGPIO0/GPIO2/GPIO12のような「起動モードを決めるピン」にステータスLEDを繋いだ場合で、内蔵プルとの分圧で不定域に入り、通常起動と書き込みモードが入れ替わったり、フラッシュ電圧が合わなくなったりする。
  • 基板によって起動したりしなかったりする(ロット差)。内蔵プルの値・LEDのVF・VIH/VILには、いずれも個体差と温度依存がある。ノード電圧が不定域のぎりぎりに乗っている設計は、量産のばらつきでどちらに転ぶか変わる。
  • PHYのアドレスが起動のたびに変わる、またはLEDが光らない。ストラップとLED兼用のピンで、抵抗値をLEDの明るさだけで決めた場合に起きる。データシートのストラップ表を再確認する。
  • 電源電圧を変えたら症状が出た(3.3V→2.5Vなど)。VDDが下がるとVIH/VILの絶対値も下がるが、LEDのVFはほぼ一定なので、分圧点との関係が変わる。VDDを複数持つ設計では、いちばん低いVDDで再計算する。
  • ノイズ対策で足した小容量コンデンサが原因になる。数百pF程度なら通常は無害だが、EMI対策やESD対策部品を安易に増やすと、RC時定数が伸びてリセット解除に間に合わなくなることがある。

よくある質問

LEDをストラップピンに付けたいときはどうすればよいですか。
いちばん確実なのは、そのピンに直接付けず、リセット解除後に安定してから別のGPIOで駆動することです。どうしても同じピンを使う(PHYのLED兼用ピンなど)場合は、データシートが指定するストラップ用の抵抗値をそのまま使い、LEDの明るさはその抵抗値に合わせて妥協するか、バッファ(トランジスタ1個やロジックゲート1個)を挟んでストラップのノードとLED駆動を電気的に切り離します。
内蔵プルの値がデータシートに載っていない場合はどうすればよいですか。
レンジ(例: 30〜50kΩ)で規定されていることが多いので、外付け負荷を最悪ケース側(内蔵プルが最も弱くなる値)で計算します。まったく記載がない場合は、一般的なCMOSの内蔵プルである数十kΩを仮定しつつ、実機のオシロ確認を必須にしてください。
VIH/VILが0.7×VDD、0.3×VDDよりずっと狭い(きつい)品種もありますか。
あります。ストラップ専用に、ヒステリシス付きのシュミットトリガ入力や、専用のコンパレータでサンプルする品種もあり、その場合はデータシートに個別の電圧が載っています。0.7/0.3×VDDは汎用CMOSの目安に過ぎないので、ストラップピンについては必ずそのピン固有の規定を確認してください。
電源投入後、十分待ってからLEDを光らせれば安全ですか。
ストラップとして読まれるのはリセット解除の一瞬だけなので、その後にLEDを光らせること自体は問題ありません。危険なのは、リセット解除の瞬間にLED回路がすでにそのピンへ電流を流していて、ラッチされる電圧に影響している場合です。ファームウェアがGPIOの向きを変えてからLEDを駆動する設計であれば、多くの場合安全です。回路図上でストラップのタイミングとLED駆動のタイミングを別々に確認してください。
ストラップピンに外付けのプルアップ/プルダウンを追加すること自体は問題ないですか。
問題ありません。むしろ、内蔵プルだけでは弱すぎて外来ノイズやリーク電流の影響を受けやすい場合、データシート指定の値で外付けプルを追加するのは推奨されることもあります。問題になるのは、その値を計算せずに『とりあえず10kΩ』のように決めてしまい、結果として内蔵プルとの分圧が不定域に入ることです。

参考にした規格・資料

  • Espressif Systems, ESP32 Series Datasheet(Strapping Pins の章) — GPIO0/GPIO2/GPIO12(MTDI)/GPIO15 のストラップとしての機能、GPIO12とVDD_SDIO(フラッシュ電圧)の関係
  • Espressif Systems, ESP32 Technical Reference Manual — 内蔵プルアップ/プルダウンの構成に関する記載
  • STMicroelectronics, 各STM32シリーズ リファレンスマニュアル「Boot configuration」 — BOOT0ピンによるブートモードの選択
  • AMD/Xilinx, 7 Series FPGAs Configuration User Guide (UG470) — M[2:0] コンフィギュレーションモードピンの機能
  • 各種 Ethernet PHY データシートの Strap Pin 配置表 — PHYアドレス/モードのストラップと、LEDドライバ兼用ピンの説明

← コラム一覧へ