0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

CPUのスリープモード

Last updated at Posted at 2025-09-07

CPUのスリープモードは、どの回路は電気が流れ、どの回路に電気が流れていないのですか。

ChatGPT:

良い質問です。
CPU の「スリープモード」といっても、実は省電力レベルによって複数の段階があり、回路ごとに電源が残るか切れるかが違います。以下は一般的な SoC/マイコン/プロセッサの例をまとめます。

  1. 動作時(Active)
    クロック: 全部動作。
    電源: コア電源(Vcore)、周辺電源(Vdd)、I/O電源(Vio)すべて供給。
    状態: CPU命令を実行中。
  2. 低電力モードの分類
    スリープモードは大きく分けて以下の層があります(メーカーによって呼び方は違います)。
    (A) クロックゲーティング型 (Sleep, Idle)
    クロック: CPUコア部のクロックを止める(クロックゲーティング)。
    電源: コア電源(Vcore)は流れたまま。
    動作: レジスタやSRAM内容は保持。周辺回路(タイマ、UARTなど)は動作を継続可能。割込みで復帰できる。
    👉 電気が流れている回路: レジスタ、キャッシュ、SRAM、周辺回路
    👉 流れていない回路: 「CPUのクロック駆動部(パイプラインやALUなど)」は停止状態。
    (B) スタンバイ / ドープスリープ (Deep Sleep, Standby)
    クロック: コアのクロック停止+周辺の大部分も停止。
    電源: コア電源は維持されるが、一部周辺電源はオフにできる。
    動作: SRAMや一部の「レテンション回路(保持用レジスタ)」だけに電気を残して内容を保存。
    👉 電気が流れている回路: レジスタ保持用回路、SRAMのセル(保持電流が必要)、RTCなど最低限の周辺回路
    👉 流れていない回路: CPU演算回路、DMA、不要な周辺回路
    (C) シャットダウン / パワーゲート型 (Power Gating, Hibernate)
    クロック: 全停止。
    電源: コア電源(Vcore)は切られる。I/OやRTC専用の別電源(Vbatなど)だけ残る。
    動作: レジスタやSRAMは消える。復帰にはリセット相当の初期化が必要。フラッシュROMなど不揮発メモリから再起動する。
    👉 電気が流れている回路: RTC、電源管理回路、起動トリガ回路(外部割込み、電源検出など)
    👉 流れていない回路: CPUコア全体、SRAM、キャッシュ、ほとんどの周辺回路
  3. まとめイメージ
    モード CPU演算回路 レジスタ SRAM 周辺回路 RTC/電源管理
    動作 (Active) ON ON ON ON ON
    スリープ/アイドル OFF(クロック停止) ON ON 一部ON ON
    ディープスリープ OFF 保持用のみON ON(低消費保持) ほぼOFF ON
    シャットダウン OFF OFF OFF OFF ON
    つまり、「スリープ」と言ってもクロックゲートだけの軽いものから、電源を落とす深いものまであり、回路ごとに「電源を残すか切るか」がモードによって変わるわけです。
    👉 ご質問は「CPUのスリープモードはどこに電気が流れるのか」なので、もし対象が
    マイコン(ARM Cortex-M系など)
    PC用CPU(x86, ARM Cortex-Aなど)
    のどちらかで答えを詳しく分けた方がいいと思います。
    ご希望はどちらを詳しく解説しましょうか?

マイコンでお願いします。

ChatGPT:

ありがとうございます 🙆
それでは マイコン(特にARM Cortex-Mシリーズなど一般的なMCU) を対象にして、スリープモードで「どの回路に電気が流れているか」を整理します。
🟢 マイコンにおけるスリープモードの電気の流れ

  1. 動作モード(Run / Active)
    CPUコア(ALU, パイプライン, レジスタファイル, デコード回路)→ 電気が流れて動作中
    SRAM → 読み書き可能(電流消費あり)
    フラッシュROM → 読み出し時にアクセス電流
    周辺回路(UART, SPI, ADC, タイマ等) → クロック供給されていれば動作
    クロック源(PLL, HSE, LSEなど) → 必要なものが駆動中
  2. Sleep モード(軽いスリープ)
    CPUコア演算部 → クロックが止まる(電流消費ほぼゼロ)
    CPUレジスタファイル → 電源は維持される(内容保持)
    SRAM → 通常通り保持(電気が流れている)
    周辺回路 → クロックが供給される限り動作する(タイマで割り込み、UART受信など可能)
    割り込みコントローラ(NVIC) → 常時動作、イベントでCPUを起こせる
    👉 電気が流れている部分
    レジスタ保持回路
    SRAM保持回路
    割り込み/クロック制御回路
    動作させたい周辺回路
  3. Deep Sleep / Stop モード(中程度)
    (Cortex-M の STOP モード や DeepSleep がこれ)
    CPUコア演算部 → 停止(クロックも電源もオフ)
    CPUレジスタ → 専用の「レテンション電源」で保持
    SRAM → レテンションモードで保持(保持用の微小電流が流れる)
    周辺回路 → 基本的に停止。ただし「低速クロックで動くもの(RTC, LPTIM, IWDGなど)」は動作可能
    クロック → メインPLLやHSEは停止。低速クロック(LSE/LSI)だけ動作
    👉 電気が流れている部分
    レジスタ保持回路
    SRAM保持用セル
    RTCや低速タイマ
    電源管理回路
  4. Standby / Shutdown モード(最も深いスリープ)
    CPUコア演算部 → 完全に電源断
    CPUレジスタ → 消失(復帰時はリセット状態)
    SRAM → 消失(保持されない)
    周辺回路 → RTCと「ウェイクアップ回路(外部割り込み, WDT, 電源ボタン等)」だけ生きている
    クロック → RTC用LSEまたはLSIだけが動作
    👉 電気が流れている部分
    RTC
    電源管理回路(PMU, PWR)
    ウェイクアップ検出回路
    📊 モードごとのまとめ(マイコン)
    モード CPU演算回路 レジスタ SRAM 周辺回路 RTC/低速回路
    Active (Run) ON ON ON ON ON
    Sleep クロックOFF ON ON 一部ON ON
    Deep Sleep OFF 保持ON 保持ON 一部低速のみON ON
    Standby OFF OFF OFF OFF ON
    🔎 つまり、
    Sleep → CPUだけ休む(RAMや周辺はそのまま)
    DeepSleep/Stop → RAMは保持、周辺はほぼ止まる
    Standby → RAMも消える、RTCだけ残る
    ご希望なら、**STM32シリーズ(ARM Cortex-Mでよく使われるマイコン)**を例に、
    実際の「どのモジュールが動いて、どの電源ドメインに電気が残るか」を図解して説明できますが、そうしますか?

はい。お願いします。

ChatGPT:

了解しました!
では具体例として STM32(Cortex-Mベースの代表的マイコン) を使って、
「どの回路に電気が流れているか」を電源ドメインごとに整理します。
🔋 STM32 の電源ドメイン
STM32(例: STM32F4, STM32L4 など)はおおまかに次の電源ブロックを持ちます:
VCORE ドメイン
CPUコア、SRAM、フラッシュ制御、DMA など
PERIPH ドメイン
UART, SPI, I2C, ADC, GPIO, タイマなどの周辺回路
RTC / BACKUP ドメイン
RTC、バックアップレジスタ、ウェイクアップ回路
VBAT ピンからも電源を供給できる
⚡ STM32 の低消費電力モード

  1. Sleep モード
    CPUコア: クロック停止(電気は通っているが計算しない)
    SRAM: 保持(電気流れている)
    周辺回路: クロック供給されていれば動作可能(UART, SPI, ADC など)
    RTC: 動作可能
    👉 電気が流れる場所
    レジスタ保持回路
    SRAM保持セル
    周辺回路(動作中のもの)
    RTC/電源管理
  2. Stop モード(Deep Sleep)
    CPUコア: 電源はあるが動作停止
    SRAM: 保持(専用の保持電流が流れる)
    周辺回路: 原則停止。ただし一部低速周辺(LPTIM, IWDG, RTCなど)は動作
    クロック: PLL, HSE, HSI など高速クロックは停止。LSE/LSI など低速クロックは動作可能。
    👉 電気が流れる場所
    SRAM保持回路
    レジスタ保持回路
    RTC, LPTIM, IWDG など低速モジュール
    電源管理回路
  3. Standby モード
    CPUコア: 電源断(完全停止)
    SRAM: 消失(保持されない)
    レジスタ: 消失(保持されない)
    周辺回路: 停止。ただし RTC とバックアップレジスタ は VBAT で動作可能
    クロック: LSE/LSI のみ動作
    👉 電気が流れる場所
    RTC ドメイン(VBAT供給あり)
    ウェイクアップ回路(外部ピン、RTCアラーム、IWDG など)
  4. Shutdown モード(L4系以降)
    CPUコア: 電源断
    SRAM: 消失
    RTC: 低消費電流モードで動作可能
    バックアップレジスタ: VBATで保持可能
    👉 電気が流れる場所
    最小限の RTC
    ウェイクアップ回路
    📊 まとめ表(STM32)
    モード CPUコア SRAM 周辺回路 RTC/バックアップ
    Sleep クロック停止 保持ON 動作可(クロック供給分) ON
    Stop 電源ON停止 保持ON 一部低速のみ ON
    Standby 電源OFF 消失 OFF ON (VBAT)
    Shutdown 電源OFF 消失 OFF 最小限ON
    🔎 まとめると:
    Sleep は「CPUだけ休む」
    Stop は「RAMは生かすけど周辺は止める」
    Standby/Shutdown は「RAMも消す。RTCと電源管理だけ残す」
    ここで質問です。
    📌 あなたが知りたいのは STM32全般の動作原理 の解説で十分でしょうか?
    それとも 具体的なシリーズ(例: STM32F4, STM32L4, STM32G0) を例にして、データシートの図(電源ブロック図)を引用しながら「このブロックは生きてる/死んでる」を解説した方が良いですか?

はい。お願いします。

ChatGPT:

了解しました!では、具体例として STM32L4 シリーズ(超低消費電力マイコン) を使って、データシートやリファレンスマニュアルに基づき、電源ドメインごとに「どこに電気が流れているか」を整理してみます。
🔋 STM32L4 の電源ドメイン構成
STM32L4 では大きく次の電源ブロックがあります:
VCORE ドメイン
CPU (Cortex-M4)
SRAM1, SRAM2
フラッシュ制御
DMA
PERIPH ドメイン
GPIO, UART, SPI, I2C, ADC, タイマなど
BACKUP ドメイン
RTC, バックアップレジスタ
LSE クロック(32.768 kHz 水晶)
VBAT ピンから電源供給可
電源管理回路 (PWR, PMU)
電圧レギュレータ、クロックゲーティング、パワーゲーティング回路
⚡ STM32L4 の低消費電力モードごとの挙動

  1. Sleep モード
    CPUコア (VCORE): クロック停止、電源は生きている
    SRAM/レジスタ: 保持
    周辺回路: クロック供給中なら動作可(例: UART受信, SPI通信)
    RTC/バックアップ: 動作可
    👉 電気が流れている回路
    SRAMセル保持回路
    レジスタ保持回路
    動作中の周辺回路
    RTC/バックアップドメイン
  2. Stop モード (Stop 0/1/2)
    CPUコア: 停止(電源は残る)
    SRAM/レジスタ: 保持(低消費保持電流で動作)
    周辺回路: 原則停止。ただし一部低速(LPTIM, LPUART, IWDG, RTC)は動作可能
    クロック: HSI, HSE, PLL 停止。LSE または LSI のみ動作
    👉 電気が流れる回路
    SRAM保持用回路
    レジスタ保持用回路
    RTC, LPTIM, LPUART などの「低消費周辺」
    電源管理回路
  3. Standby モード
    CPUコア (VCORE): 完全電源断
    SRAM/レジスタ: 消失(保持されない)
    周辺回路: 停止。ただし RTC, バックアップレジスタは VBAT で動作可
    クロック: LSE, LSI のみ動作可能
    👉 電気が流れる回路
    RTC/バックアップドメイン (VBAT供給)
    ウェイクアップ回路(外部ピン, RTCアラーム, IWDG)
    電源管理回路の最小部分
  4. Shutdown モード
    CPUコア: 電源断
    SRAM/レジスタ: 消失
    周辺回路: 停止
    RTC: 超低消費電流モードで保持可能(VBATから給電)
    👉 電気が流れる回路
    RTC(最低限の保持回路)
    ウェイクアップ回路
    📊 STM32L4 の低消費電力モードまとめ
    モード CPUコア SRAM 周辺回路 RTC/バックアップ
    Sleep クロックOFF 保持ON 動作中のものはON ON
    Stop (0/1/2) 停止 保持ON 低消費周辺のみON ON
    Standby 電源OFF 消失 OFF ON (VBAT)
    Shutdown 電源OFF 消失 OFF 最小限ON
    📌 STM32F4 など「高性能系」では Stop モードまでが一般的で、Shutdown モードは存在せず、代わりに Standby で完全オフに近い状態にします。
    📌 STM32L4, L0, G0 など「低消費系」では Shutdown モードまでサポートしており、ウェアラブルやバッテリ駆動機器に適しています。
    👉 ここまでで「どのドメインが生きていて、どのドメインが切られるか」を整理しました。
    もしご希望なら、STM32L4 のリファレンスマニュアルの電源ブロック図をベースに、模式図を描いて「この線に電気が流れる/流れない」を図解できますが、やりますか?

はい。お願いします。

ChatGPT:

STM32L4 の図解ドキュメントを作成しました。Canvas(左側のドキュメント)に表示しています。
図や表の修正、あるいは「特定周辺(ADC / UART / DMA など)ごとの詳細一覧」を追加したい場合は教えてください。

周辺ごとの詳細一覧をお願いします。

ChatGPT:

Stm32l4 電源ドメインとスリープモード 図解
STM32L4 — 電源ドメインとスリープモードの図解(周辺別詳細付き)
以下は STM32L4 系マイコンを想定した、各低消費電力モードで「どの回路に電気が流れているか」を図解・表でまとめたドキュメントです。周辺ごとの挙動一覧も追加しています。

  1. 前提(電源ドメイン)
    VCORE ドメイン:CPUコア(Cortex‑M4), SRAM1/2, フラッシュ制御, DMA など
    PERIPH ドメイン:GPIO, UART, SPI, I2C, ADC, タイマなどの周辺
    BACKUP / RTC ドメイン:RTC, バックアップレジスタ, LSE(32.768kHz) — VBAT 供給可能
    PWR/PMU:電源管理回路(レギュレータ, クロックゲーティング, パワーゲーティング)
  2. 凡例
    🔌 : 電源/クロックが供給され、実際に電流が流れている
    ⚪ : 電源/クロックが切られ、電流が流れていない
    🟡 : 低消費保持(レテンション)や低速クロックで最小限動作
  3. 各モードの模式図(ブロック)
    Active (Run)
    [VCORE: CPU, SRAM] 🔌 — full
    [PERIPH ] 🔌 — full
    [BACKUP / RTC ] 🔌
    [PWR / PMU ] 🔌
    すべてが通電・動作。CPUが命令実行中。
    Sleep (軽いスリープ)
    [VCORE: CPU core (clock gated)] ⚪ (ALU等停止)
    [CPU registers / SRAM] 🔌 (保持)
    [PERIPH (configured)] 🔌/⚪ (動作させているものはON)
    [BACKUP / RTC] 🔌
    [PWR / PMU] 🔌
    CPU の命令実行回路はクロック停止(演算停止)だが、レジスタ・SRAMは電源が残り内容を保持する。
    周辺はクロックを止める/残すを選べる(UART受信でウェイクなど可能)。
    Stop / Deep Sleep
    [VCORE: CPU core] ⚪ (停止)
    [CPU registers / SRAM] 🟡 (レテンション保持:低い保持電流)
    [PERIPH] ⚪ (大半停止)
    [LOW-SPEED PERIPH (RTC/LPTIM/LPUART)] 🔌/🟡 (必要に応じてON)
    [BACKUP / RTC] 🔌
    [PWR / PMU] 🔌 (低消費管理動作)
    高速クロック(PLL/HSE/HSI)は停止。LSE/LSIのみで必要な低速周辺を動かす。
    SRAMはレテンションで保持される(電流は小さいが流れる)。
    Standby
    [VCORE: CPU core] ⚪ (電源断)[CPU registers / SRAM] ⚪ (消失)
    [PERIPH] ⚪ (停止)
    [BACKUP / RTC] 🔌 (VBATから供給可能)
    [PWR / PMU] 🟡 (ウェイク検出など最低限)
    コア電源が切断され、SRAM/レジスタの内容は失われる(復帰はリセット相当)。
    RTC とバックアップレジスタのみ VBAT による保持が可能。
    Shutdown
    [ほとんどの回路] ⚪
    [RTC (VBAT)] 🟡 (超低消費)
    [ウェイク検出回路] 🟡
    [PWR / PMU] 🟡 (最小限)
    最低限の RTC とウェイク検出のみが動作。多くは完全オフに近い。
  4. モード別まとめ表(主要ブロック)
    モード CPU 演算回路 レジスタ SRAM 周辺回路 RTC/Backup
    Active 🔌 ON 🔌 ON 🔌 ON 🔌 ON 🔌 ON
    Sleep ⚪ 停止(clk gated) 🔌 ON 🔌 ON 🔌/⚪(設定次第) 🔌 ON
    Stop ⚪ OFF 🟡 保持 🟡 保持 ⚪ 大半OFF / 低速のみON 🔌 ON
    Standby ⚪ 電源OFF ⚪ 消失 ⚪ 消失 ⚪ OFF 🔌(VBAT)
    Shutdown ⚪ 電源OFF ⚪ 消失 ⚪ 消失 ⚪ OFF 🟡 最小限
  5. 周辺ごとの挙動一覧(STM32L4 系)
    周辺/機能 Sleep モード Stop モード Standby / Shutdown
    GPIO 状態保持(入力/出力) 状態保持(外部割込みでWake可) 低リーク保持、Wake可
    USART / LPUART 動作可(クロック供給必要) LPUARTのみ低速クロックで動作可 OFF
    SPI / I2C 動作可(クロック次第) OFF(Stop中は通常不可) OFF
    タイマ (TIMx) 動作可(クロック次第) LPTIMのみ低速で動作可 OFF
    ADC / DAC 動作可 OFF OFF
    DMA 動作可 OFF OFF
    SRAM 保持 レテンション保持 消失
    フラッシュ 保持/アクセス可 クロック停止(再開で復帰) 消失
    RTC 動作可 動作可 動作可(VBAT駆動)
    IWDG (独立WDT) 動作可 動作可 動作可
    WWDG (窓付きWDT) 動作可 OFF OFF
  6. 実務的な確認方法(設計/デバッグ時)
    データシート/リファレンスマニュアルの「Power consumption / Low-power modes」節を確認
    PWR (Power) レジスタやRCCのクロック設定でどの周辺が停止するか確認
    実測:電流測定(μAレンジ)でモードごとの差を確認、オシロやロジアナでウェイク信号確認
    以上、STM32L4 の 周辺ごとのスリープ挙動一覧 を追加しました。必要であれば「特定シリーズ(例: STM32F4, G0)」用に表を作り分けることも可能です。
    周辺ごとの挙動一覧を追加しました。
    「特定シリーズ(STM32F4, STM32G0 など)向けの違い」や「各周辺のウェイクアップ条件(割り込み種別など)」をさらに深掘りしましょうか?
    ChatGPT の回答は必ずしも正しいとは限りません。重要な情報は確認するようにしてください。

周辺ごとの詳細一覧をお願いします。

ChatGPT:

周辺ごとの挙動一覧を追加しました。
「特定シリーズ(STM32F4, STM32G0 など)向けの違い」や「各周辺のウェイクアップ条件(割り込み種別など)」をさらに深掘りしましょうか?

各周辺のウェイクアップ条件(割り込み種別など)をお願いします。

ChatGPT:

各周辺の「ウェイクアップ条件(割り込み種別など)」を追記しました。
さらに「実際のレジスタ設定例(Cコード)」を加えて、Sleep/Stop/Standby の違いを具体的に示しましょうか?

はい。お願いします。

ChatGPT:

STM32L4 — 電源ドメインとスリープモードの図解(周辺別詳細+ウェイクアップ条件+設定例)

以下は STM32L4 系マイコンを想定した、各低消費電力モードで「どの回路に電気が流れているか」を図解・表でまとめたドキュメントです。周辺ごとの挙動・ウェイクアップ条件に加え、実際のレジスタ設定例(Cコード)を追記しています。

1) 前提(電源ドメイン)

  • VCORE ドメイン:CPUコア(Cortex‑M4), SRAM1/2, フラッシュ制御, DMA など
  • PERIPH ドメイン:GPIO, UART, SPI, I2C, ADC, タイマなどの周辺
  • BACKUP / RTC ドメイン:RTC, バックアップレジスタ, LSE(32.768kHz) — VBAT 供給可能
  • PWR/PMU:電源管理回路(レギュレータ, クロックゲーティング, パワーゲーティング)

2) 各モードまとめ(簡易)

モード CPU SRAM 周辺 RTC 備考
Active 実行中 保持 全ON ON 通常動作
Sleep 停止 保持 選択的 ON 軽スリープ
Stop 停止 レテンション 一部低速のみ ON 深スリープ
Standby OFF 消失 OFF VBAT駆動 リセット相当復帰
Shutdown OFF 消失 OFF 最小限 超低消費

3) 周辺ごとの挙動とウェイクアップ条件

周辺/機能 Sleep モード Stop モード Standby/Shutdown ウェイクアップ条件
GPIO 状態保持(外部割込み可) 状態保持(EXTIでWake可) 入力レベル変化(EXTI) EXTI 割り込み(上昇/下降/両エッジ)
USART / LPUART 動作可能、受信割り込みでWake可 LPUARTのみ低速で受信可、受信完了でWake OFF 受信完了割り込み(RXNE, IDLE)、Start bit 検出 (LPUART)
SPI / I2C 動作可能、受信/送信割り込みでWake OFF OFF 受信割り込み, 転送完了イベント (Sleepのみ)
タイマ (TIMx) 動作可能、更新割込みでWake LPTIMのみ動作、更新/比較一致でWake OFF タイマ更新割込み、比較一致割込み (StopではLPTIM)
ADC / DAC 動作可能、EOC割込みでWake OFF OFF ADC変換完了 (EOC), DACトリガ割込み (Sleepのみ)
DMA 動作可能、転送完了割込みでWake OFF OFF 転送完了 / 転送エラー割込み (Sleepのみ)
SRAM 保持 レテンション保持 消失 -
フラッシュ アクセス可 クロック停止(再開で復帰) 消失 -
RTC 動作、アラーム/周期イベントでWake 動作、アラーム/周期イベントでWake VBAT駆動、アラーム/周期イベントでWake RTCアラーム, RTC Wakeup timer, タイムスタンプイベント
IWDG (独立WDT) 動作 動作 動作 IWDGリセット (Wakeではなくリセット)
WWDG (窓付きWDT) 動作 OFF OFF WWDGリセット (Wakeではなくリセット)

4) 代表的なウェイクアップソース

  • 外部ピン (EXTI): GPIOピンのエッジ(上昇/下降/両方)
  • UART/LPUART: Startビット検出、受信割込み
  • タイマ/LPTIM: カウンタオーバーフロー、比較一致
  • RTC: アラーム、Wakeupタイマ、タイムスタンプ
  • I2C/SPI: Sleep中のみ、通信割込みで復帰可
  • Watchdog: ウェイクアップではなくリセット要因

5) 実際のレジスタ設定例(Cコード)

以下は HALライブラリなし、レジスタ直接操作 の例です。

(A) Sleep モードへ移行し、UART受信でウェイクアップ

#include "stm32l4xx.h"
void enter_sleep_mode(void) {
    // UART1 RX 割込み許可
    USART1->CR1 |= USART_CR1_RXNEIE;
    NVIC_EnableIRQ(USART1_IRQn);
    // SLEEPDEEP=0 (Sleep mode)
    SCB->SCR &= ~SCB_SCR_SLEEPDEEP_Msk;
    // Wait For Interrupt 命令
    __WFI();
}

(B) Stop モードへ移行し、RTC アラームで復帰

#include "stm32l4xx.h"
void enter_stop_mode(void) {
// RTC アラーム割込みを有効化
RTC->CR |= RTC_CR_ALRAIE;
NVIC_EnableIRQ(RTC_Alarm_IRQn);
// PWR: Stop mode 設定 (Low-power regulator)
PWR->CR1 &= ~PWR_CR1_LPMS;
PWR->CR1 |= (0x2 << PWR_CR1_LPMS_Pos); // Stop 1 mode
// SLEEPDEEP=1 (Deep Sleep)
SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk;
// Wait For Interrupt
__WFI();
}
(C) Standby モードへ移行し、外部ピン (EXTI) で復帰
#include "stm32l4xx.h"
void enter_standby_mode(void) {
// EXTI line (例えば GPIO PA0) をウェイクアップソースに設定
EXTI->IMR1 |= EXTI_IMR1_IM0; // PA0 割込み有効
EXTI->RTSR1 |= EXTI_RTSR1_RT0; // 立ち上がりエッジでWake
// PWR: Standbyモード指定
PWR->CR1 &= ~PWR_CR1_LPMS;
PWR->CR1 |= (0x3 << PWR_CR1_LPMS_Pos); // Standby mode
// SLEEPDEEP=1
SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk;
// Wait For Interrupt
__WFI();
}
6) 実務的注意
Stop/Standby 復帰時はシステムクロックが HSI16 に戻るため再設定が必要
Standby/Shutdown 復帰はリセット相当、初期化コードから実行される
ウェイクアップソース設定は EXTI, RTC, USART, LPTIM ごとに NVIC とレジスタ設定を忘れずに
以上、各モードの レジスタ設定例 (Cコード) を追記しました。
Sleep / Stop / Standby モードへの移行とウェイクアップの Cコード例(レジスタ操作) を追記しました。
次は「HALライブラリを使った簡潔な書き方」や「FreeRTOSと組み合わせた低消費動作例」を追加しましょうか?

はい。お願いします。

ChatGPT:

STM32L4 — 電源ドメインとスリープモードの図解(周辺別詳細+ウェイクアップ条件+設定例)

以下は STM32L4 系マイコンを想定した、各低消費電力モードで「どの回路に電気が流れているか」を図解・表でまとめたドキュメントです。周辺ごとの挙動・ウェイクアップ条件に加え、レジスタ操作例HAL/FreeRTOS を用いた実用例を追記しています。


1) 前提(電源ドメイン)

  • VCORE ドメイン:CPUコア(Cortex‑M4), SRAM1/2, フラッシュ制御, DMA など
  • PERIPH ドメイン:GPIO, UART, SPI, I2C, ADC, タイマなどの周辺
  • BACKUP / RTC ドメイン:RTC, バックアップレジスタ, LSE(32.768kHz) — VBAT 供給可能
  • PWR/PMU:電源管理回路(レギュレータ, クロックゲーティング, パワーゲーティング)

2) 各モードまとめ(簡易)

モード CPU SRAM 周辺 RTC 備考
Active 実行中 保持 全ON ON 通常動作
Sleep 停止 保持 選択的 ON 軽スリープ
Stop 停止 レテンション 一部低速のみ ON 深スリープ
Standby OFF 消失 OFF VBAT駆動 リセット相当復帰
Shutdown OFF 消失 OFF 最小限 超低消費

3) 周辺ごとの挙動とウェイクアップ条件

(前回と同じ表を保持)


4) 代表的なウェイクアップソース

(前回と同じ内容を保持)


5) 実際のレジスタ設定例(Cコード)

(Sleep / Stop / Standby の例を保持)


6) HALライブラリを用いた簡潔な書き方

STM32Cube HAL を使うと、低消費電力モードの遷移は API で抽象化されます。

(A) Sleep モード

#include "stm32l4xx_hal.h"
void enter_sleep_mode(void) {
    // UART 受信割込み有効
    HAL_UART_Receive_IT(&huart1, rx_buf, 1);
    // SLEEP モードへ移行
    HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI);
}

(B) Stop モード

#include "stm32l4xx_hal.h"
void enter_stop_mode(void) {
    // RTC アラーム有効化
    HAL_RTC_SetAlarm_IT(&hrtc, &sAlarm, RTC_FORMAT_BIN);
    // STOP モードへ移行
    HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
    // 復帰後はクロック再設定が必要
    SystemClock_Config();
}

(C) Standby モード

#include "stm32l4xx_hal.h"
void enter_standby_mode(void) {
    // Wakeup pin 有効化 (PA0)
    HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1);
    // Standby モードへ移行
    HAL_PWR_EnterSTANDBYMode();
}

7) FreeRTOS と組み合わせた低消費動作

(A) FreeRTOS のアイドルフックで Sleep モードへ

FreeRTOS の vApplicationIdleHook() で WFI を発行することで、アイドルタスク中に Sleep モードへ移行できます。

void vApplicationIdleHook(void) {
    // CPU アイドル時に Sleep モードへ
    __WFI();
}

(B) Tickless Idle を有効化

FreeRTOSConfig.h に以下を追加:

#define configUSE_TICKLESS_IDLE    1

→ OS タイマ(SysTick)を止め、次タスクまで Sleep/Stop へ移行。RTC や LPTIM を OS タイマ代替に利用可能。

(C) Stop モードと組み合わせ

CubeMX 設定で HAL_PWR_EnterSTOPMode() をアイドルフックに組み込むことで、アイドル時は自動的に Stop モードへ。復帰時には SystemClock_Config() を呼んでクロック再設定。

void vApplicationIdleHook(void) {
    // RTCアラーム等でWake可能なStopモードへ
    HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
    SystemClock_Config(); // 復帰後再設定
}

8) 実務的注意

  • HAL API はレジスタ操作を隠蔽しているが、復帰後のクロック再設定はユーザが行う必要あり
  • FreeRTOS の Tickless Idle と Stop モードを併用すると、長時間スリープ時に電流を大幅削減可能
  • 周辺ウェイクアップ条件を OS タスクの待ちに結びつけると設計がシンプルになる

以上、HAL を使った簡易コード例と FreeRTOS 連携方法を追記しました。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?