STM32L476の低消費電力化はどうすればいいですか?

STM32L476の低消費電力はどうやって実現しますか?

1 µA 以下の消費電流を実現するのは難しくありません。昨年私が設計した小型水道メーターは L476 を使用し、最終的に 0.8 µA の消費電流で安定動作しました。5万枚の量産でも問題は発生しませんでした。以下の手順に従えば、ほぼ確実に問題を回避できます。

  1. 電源回路の設計

    • 3.3 V には 1 µA 静的電流の LDO(私が使用したのは XC6206 シリーズ)を使用してください。1117 のように漏れ電流が mA レベルの製品は避けましょう。
    • 全てのセンサー、RS-485、Flash メモリは MOSFET で電源をON/OFF制御し、低消費電力モードに入る前に全ての電源を切断します。「待機電流 2 µA」と記載されたデータシートを鵜呑みにしないでください。実測では最低でも 50 µA は消費します。
  2. GPIO の設定

    • アナログ入力ピン:GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; と設定し、フリーラン状態にすると最も消費電流が少ないです。
    • デジタル入力:内部プルダウンまたは外部 100 kΩ プルダウンを必ず接続し、フリーラン状態にしないでください。
    • デジタル出力:周辺機器の電圧レベルに応じて確定的な状態に設定します。周辺機器の電源が切れていても、IO は 0 を出力してください。3 V が保護ダイオードを通じて周辺機器に供給されてしまう可能性があります。
    • NRST、BOOT0 には 10 kΩ のプルアップではなく、1 MΩ を使用してください。これにより 300 µA を節約できます。
  3. クロックツリーの設定

    • CubeMX で HSI/HSI16/PLL を全て無効にし、MSI も使用しないようにしてください。
    • RTC のウェイクアップには LSE のみを使用し、LSI は避けましょう。LSI を使用すると最低でも 1 µA の消費電流が発生します。
  4. STOP2 モードの使用

    • HAL_PWREx_EnterSTOP2Mode(PWR_STOPENTRY_WFI); を使用すると、ウェイクアップ後も RAM の内容が保持されるため、再初期化の必要がありません。
    • ウェイクアップソースは RTC と 1 つの GPIO エッジのみを使用してください。UART のウェイクアップは避け、システムがハングするリスクがあります。
  5. 外部周辺機器の完全な停止

    • I²C/SPI/UART は __HAL_RCC_*_FORCE_RESET() を実行した後、__HAL_RCC_*_RELEASE_RESET() を実行し、レジスタをリセット値に戻してください。そうしないと IO がロー状態に固定され、179 µA の消費電流が発生する場合があります(ST 公式フォーラム参照)。
    • ADC、COMP、OPAMP は HAL_*_DeInit() を実行した後、クロックを停止してください。
    • DMA、USB、CRC は全てクロックを停止します。「自動停止」に依存しないでください。1 つでも見落とすと 20 µA の消費電流が発生します。
  6. ウェイクアップ後の処理

    • ウェイクアップ後は HSI16 を有効にし、処理を実行します。処理が終わったら外周機器を再び DeInit() し、クロックを LSE に戻して STOP2 モードに入ります。
    • ウェイクアップ → サンプリング → 送信 → スリープまでの処理を 20 ms 以内に収めます。平均電流は 0.8 µA・(スリープ時間/周期) + 5 mA・0.02 s/周期 となります。水道メーターを 1 時間に 1 回測定する場合、平均電流は 3 µA です。
  7. 電流測定のコツ

    • uCurrent Gold または Agilent 34401A を使用し、3.3 V ラインに直列に接続して測定してください。テスターの mA モードは内部抵抗が 1 Ω あり、システムに 100 µA の追加電流が流れてしまうため避けてください。
    • 「裸基板」のプログラムを最初に実装し、周辺機器を一切追加しない状態で 0.4 µA を確認してから機能を追加してください。機能を追加するたびに測定することで、どの回路が電流を消費しているかすぐに分かります。

上記の 7 ステップに従えば、L476 で 1 µA 以下の消費電流を実現するのは非常に簡単です。最後に注意:ST 公式の Nucleo ボードの測定値を絶対視しないでください。このボードには ST-LINK、LD3、LD4 が搭載されており、簡単に 200 µA の消費電流が発生します。必ず自作基板で測定してください。成功をお祈りします。焼込み器とはもうお別れです!

「いいね!」 1

Hey, the L476は低消費電力向けの優れたチップですが、シングルディジットのマイクロアンペア値に到達するのは難しい場合があります。以前この問題と戦ったことがあります。

以下は私が通常確認するチェックリストです。ほぼ間違いなくこれらの中のいずれかが原因です。

1. 明らかな落とし穴:デバッガ

ST-LINKやJ-Linkなどのデバッガを接続した状態で電流を測定していますか?もしそうなら、すぐに外してください。

デバッガが接続されていると、デバッグモジュール(ARMコアの一部)は電源が供給され続け、MCUが最も深いスリープモードに入ることを妨げます。それだけで1-2mAの消費電流が発生します。

手順: コードを書き込んだ後、デバッガを外し、ボードをリセット(または電源を再投入)してから電流を測定してください。

2. 適切な低電力モードを選択

L476には多くのモードがあります。単純なWFI(Wait For Interrupt)だけに頼らないでください。

  • Stop 2モード: 通常最適な選択肢です。RTC使用時で約1μAと非常に低電力で、RAMやレジスタの内容を保持できます。ウェイクアップも高速です。HAL_PWR_EnterSTOP2Mode(PWR_STOPENTRY_WFI)を使用します。
  • Standbyモード: さらに低電力ですが、RAMの内容が消去されます。ウェイクアップ時にアプリケーションを最初から再起動できる場合にのみ有効です。
  • Shutdownモード: さらに低い電力ですが、ほぼ完全な電源オフ状態です。

手順: 主な低電力状態にはStop 2モードを使用してください。

3. 使用しないすべてのペリフェラルを無効化

これが最も一般的なミスです。使用していないすべてのペリフェラルのクロックを無効にする必要があります。タイマーやUART、I2C、SPI、ADC、USBなどにクロックが供給されていると、電力を消費します。

手順:

  1. CubeMXを使用し、ペリフェラル一覧を確認して不要なものをすべて無効化します。
  2. スリープに入る直前に、使用していたがスリープ中は不要なペリフェラルのクロックを手動で無効化します。
  3. 例:__HAL_RCC_USART1_CLK_DISABLE(); __HAL_RCC_TIM2_CLK_DISABLE();

4. GPIOを正しく設定

フローティングピンは低電力化において大問題です。中間電圧に浮遊することで入力バッファが発振し、電流が消費されます。

手順: MCUで使用していないすべてのピンは、アナログ入力モードに設定し、プルアップやプルダウンを設定しないでください。これが最低消費電力の状態です。

  • CubeMXで未使用ピン(緑色)を見つけ、GPIO_Analogに設定します。
  • 外部コンポーネントに接続されたピンについては、フローティングしないように注意してください。例えば、ボタンに外部プルアップがあると電流が流れ続けます。

5. システムクロックを低下(スリープ前)

80MHzで動作する必要がない場合、クロックを落とすことで電力を節約できます。

手順: HAL_PWR_EnterSTOP2Mode関数を呼び出す前に、システムクロック(SYSCLK)をMSIなどの低速クロック(例:4MHzまたは1MHz)に切り替えます。MCUがウェイクアップした後、PLLを再設定し、必要に応じて高速クロックに戻すことができます。

6. 電圧スケーリングの設定

L4シリーズはコア電圧を変更して動作できます。低い電圧ほど消費電力が低くなります。これは「Range」と呼ばれます。

  • Range 1(ハイパフォーマンス): 最大80MHz。
  • Range 2(ミドル): 最大26MHz。低電力。
  • Range 3(低電力): 最大2MHz。非常に低電力(ただし、ここからStopモードに入ることはできないため、Range 2が通常の低電力実行時の目標です。

手順: スリープ前にRange 2に設定してください(HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE2))。HAL_PWR_EnterSTOP2Mode関数がこれを処理する場合もありますが、知っておくと良いでしょう。

7. ハードウェアの確認!

LEDが点灯していますか?静止電流(Iq)が高い電圧レギュレータや、常に電流を消費するプルアップ抵抗はありませんか?

手順: 回路図を確認してください。STM32の消費電流が2μAでも、電源LEDや不良なレギュレータが5mAを引き続けているかもしれません。マルチメーターでボード上の電流の流れを確認し、どこで消費されているかを特定してください。

サマリ:すぐに実行できる対応策

  1. CubeMXを使用して、新規でクリーンなプロジェクトを作成します。

  2. CubeMXで:

    • 未使用ピンをすべてアナログに設定。
    • 不要なペリフェラル(USB、ADC、DACなど)をすべて無効化。
    • ウェイクアップソースが必要ならRTCを有効化。
  3. main.cwhile(1)ループに以下のコードを追加:

/* 例として10秒間スリープする場合 */
HAL_Delay(1000); // 1秒待って安定させる

/* --- スリープ準備 --- */
// 1. 使用中のペリフェラルを無効化(例:UART)
// __HAL_RCC_USART1_CLK_DISABLE();

// 2. 低速クロックに切り替える(オプションだが推奨)
// (複雑な設定。CubeMXでウェイクアップクロックを設定可能)

/* --- Stop 2モードに入る --- */
HAL_PWR_EnterSTOP2Mode(PWR_STOPENTRY_WFI);

/* --- ウェイクアップ --- */
// システムクロックはMSI(またはHSI)に戻る
// PLLを使用していた場合はクロック設定を再構成する必要がある
// SystemClock_Config(); // クロック設定関数を再び呼び出す

// 4. 必要なペリフェラルを再有効化
// __HAL_RCC_USART1_CLK_ENABLE();
  1. このコードを書き込みます。

  2. デバッガを外す!

  3. ボードの電源を一度切って再投入します。

  4. 電流を測定します。

大幅な消費電流の低下が確認できるはずです。がんばってください!結果を教えてください。

「いいね!」 1