BLOG

STM32G431CBU6 を Arduino IDE 2.x で使っていると、 DFU で書き込み後に USB(CDC)が認識されなくなる現象に遭遇することがあります。
ライブラリ更新を求められ、なにげなくUPDATEしていると時々不可解な現象に時間を取られることを多々経験します。注意が必要ですね

現象

  • DFU モードではデバイスが見える
  • Blink などの最小スケッチを書き込む
  • 再起動後、USB CDC(COMポート)が出てこない
  • Windows側にはエラーなし
  • 基板が壊れたように見える

原因:STM32Duino コアの仕様変更

Arduino IDE を更新すると、 STM32Duino コアも自動的に新しいバージョンへ更新されます。

この新しいコアでは、 USB CDC が自動で起動しない仕様になったらしい。

新仕様(IDE 2.x + 新STM32Duino)

  • USB CDC は Serial.begin() を呼ばない限り起動しない
  • USBクロックも D+ プルアップもスケッチ側で明示的に起動する必要がある
  • Blink のような USBを使わないスケッチを書き込むと USBが消える

IDE を更新しただけで挙動が変わるため、気づきにくいポイントです

DFUでは見えるのに、スケッチ起動後に消える理由

DFU は ROM 内蔵のブートローダで動作します。 USB CDC を使うための初期化がすべて ROM 側で行われるため、PCから見える状態になります。

しかし、書き込んだスケッチが起動すると、

  • USBクロック未起動
  • USBスタック未初期化
  • D+ プルアップなし

となり、PCは「USBデバイスなし」と判断します。

対策(最重要)

スケッチの先頭で USB CDC を起動するだけで解決します。

void setup() {
  Serial.begin(9600);  // USB CDC を起動
}

これだけで、再起動後も COMポートが常に出るようになります。

まとめ

  • Arduino IDE 2.x では STM32Duino コアの仕様が変わり、USB CDC が自動起動しなくなった
  • Blink のような最小スケッチを書き込むと USB が消える
  • DFU に戻せば再書き込み可能
  • スケッチで Serial.begin() を呼べば USB CDC は復活する
  • Serial を常用するシステムなら問題なし

STM32G4シリーズを Arduino IDE 2.x で使う場合は、 USB CDC の自動起動が廃止されたという点を覚えておくとトラブルを避けられます。