起動時に読まれるピン(ストラップ)に LED を付けてはいけない
「このピン、LED を1個ぶら下げても平気ですよね」——平気ではありません。ストラップピンは、リセットが解除される一瞬だけ電圧を読んで起動モードを決め、そのあとはただの GPIO や LED ドライバとして働きます。LED は暗く光っているように見えなくても、内蔵プル抵抗(数十kΩ)に対しては十分な負荷で、ノード電圧を「H でも L でもない」帯に押し込みます。何 V になるか、どこまでなら安全か、node で計算して確かめます。
ストラップピンとは何か:リセット解除の一瞬だけ電圧を読む
多くの 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 よりさらに低く、ノード電圧はここで示した概算よりもう少し高くなる方向です。安全側の見積りにはなりません。
値の決め方: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 として簡略化)。
| 外付け抵抗 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µA | L と判定できる(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 が光らない、あるいはその逆が起こります。
起動時の一瞬をどう可視化するか
ストラップの怖さは、問題になる電圧がリセット解除という一瞬にしか意味を持たないことです。定常状態でテスタを当てても、その後にファームウェアがGPIOとして駆動してしまえば、起動直後の電圧はもう見えません。オシロスコープでリセット信号(またはEN、CHIP_PUピンなど)の立ち上がりをトリガにして、ストラップのネットの電圧を同時に見るのが、実機で確認する唯一の方法です。
下の図は、その一瞬に何が起きるかを追ったものです。リセット中は内蔵プルと外付けLEDの分圧でノードがある電圧に落ち着いており、解除の瞬間にその電圧が1回だけラッチされます。ラッチされた値が不定域にあると、デバイスは「H」「L」のどちらとして読むか、個体差・温度・電源電圧のわずかな違いで変わり得ます。解除後は、同じピンがただのGPIOやLEDドライバとして動き、ストラップとしての意味は失われます。
表で見る:VIH/VIL の帯のどこに落ちるか
前の表の4パターンを、電圧の帯として並べたのが下の図です。3.3V系の目安(VIH=2.31V、VIL=0.99V)に対して、LEDを実用的な明るさで光らせられる抵抗値(1kΩ〜10kΩ)は軒並み不定域に入り、確実にLと判定できるのは47kΩまで抵抗を上げた、LEDがかなり暗い条件だけです。この帯のどこにも触れないようにする、というのが値の決め方の実質的な基準になります。
設計レビューのチェック手順
- ストラップピンの一覧を作る。MCU/PHY/FPGAのデータシートで「strap」「boot mode」「configuration mode」「power-on」といった語で検索し、対象ピンと、リセット解除後にGPIOへ戻るかどうかを書き出す。
- そのネットに繋がっている全部品を洗い出す。LED、プルアップ/プルダウン抵抗、コネクタ経由の配線、他ICの入力ピン(内蔵プル・保護ダイオードを含む)を回路図から拾う。
- 内蔵プルの値をデータシートで確認する。「pull-up」「pull-down」の抵抗値(多くはtyp./min./max.のレンジで規定)を控える。分からなければ最悪ケース(プル無し、または最弱値)で計算する。
- ノード電圧をnodeなどで計算する。V = Rpull(VDD − VF) / (Rpull + Rext) の形で、外付け負荷を入れた場合の電圧を出す。LEDが複数の色候補を持つなら、VFが最も低い色(多くは赤)で計算する。
- そのピンの実際のVIH/VILと比較する。汎用の0.7/0.3×VDDではなく、そのピン固有の規定値(ヒステリシス付きシュミットトリガならさらに別の値)をデータシートで確認する。
- 外付けコンデンサがあればRC時定数を確認する。τ = Rpull × C を計算し、5τがリセットIC/電源シーケンサの遅延より十分短いか確かめる。
- PHYなど「ストラップとLED兼用」のピンは、アドレス表とLED駆動の説明を両方読む。抵抗値がアドレス設定とLED輝度の両方の要求を満たすか、満たさないなら兼用を諦めて別ピンにLEDを移せないか検討する。
- 実機で、リセット信号の立ち上がりをトリガにしてストラップのネットの電圧をオシロで確認する。電源電圧・温度を振って、不定域に触れないことを確認する。
実機で引っかかるところ
- デバッグ用に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をストラップピンに付けたいときはどうすればよいですか。
内蔵プルの値がデータシートに載っていない場合はどうすればよいですか。
VIH/VILが0.7×VDD、0.3×VDDよりずっと狭い(きつい)品種もありますか。
電源投入後、十分待ってからLEDを光らせれば安全ですか。
ストラップピンに外付けのプルアップ/プルダウンを追加すること自体は問題ないですか。
参考にした規格・資料
- 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ドライバ兼用ピンの説明