CPUのスリープモードは、どの回路は電気が流れ、どの回路に電気が流れていないのですか。
ChatGPT:
良い質問です。
CPU の「スリープモード」といっても、実は省電力レベルによって複数の段階があり、回路ごとに電源が残るか切れるかが違います。以下は一般的な SoC/マイコン/プロセッサの例をまとめます。
- 動作時(Active)
クロック: 全部動作。
電源: コア電源(Vcore)、周辺電源(Vdd)、I/O電源(Vio)すべて供給。
状態: CPU命令を実行中。- 低電力モードの分類
スリープモードは大きく分けて以下の層があります(メーカーによって呼び方は違います)。
(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、キャッシュ、ほとんどの周辺回路- まとめイメージ
モード 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) を対象にして、スリープモードで「どの回路に電気が流れているか」を整理します。
🟢 マイコンにおけるスリープモードの電気の流れ
- 動作モード(Run / Active)
CPUコア(ALU, パイプライン, レジスタファイル, デコード回路)→ 電気が流れて動作中
SRAM → 読み書き可能(電流消費あり)
フラッシュROM → 読み出し時にアクセス電流
周辺回路(UART, SPI, ADC, タイマ等) → クロック供給されていれば動作
クロック源(PLL, HSE, LSEなど) → 必要なものが駆動中- Sleep モード(軽いスリープ)
CPUコア演算部 → クロックが止まる(電流消費ほぼゼロ)
CPUレジスタファイル → 電源は維持される(内容保持)
SRAM → 通常通り保持(電気が流れている)
周辺回路 → クロックが供給される限り動作する(タイマで割り込み、UART受信など可能)
割り込みコントローラ(NVIC) → 常時動作、イベントでCPUを起こせる
👉 電気が流れている部分
レジスタ保持回路
SRAM保持回路
割り込み/クロック制御回路
動作させたい周辺回路- Deep Sleep / Stop モード(中程度)
(Cortex-M の STOP モード や DeepSleep がこれ)
CPUコア演算部 → 停止(クロックも電源もオフ)
CPUレジスタ → 専用の「レテンション電源」で保持
SRAM → レテンションモードで保持(保持用の微小電流が流れる)
周辺回路 → 基本的に停止。ただし「低速クロックで動くもの(RTC, LPTIM, IWDGなど)」は動作可能
クロック → メインPLLやHSEは停止。低速クロック(LSE/LSI)だけ動作
👉 電気が流れている部分
レジスタ保持回路
SRAM保持用セル
RTCや低速タイマ
電源管理回路- 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 の低消費電力モード
- Sleep モード
CPUコア: クロック停止(電気は通っているが計算しない)
SRAM: 保持(電気流れている)
周辺回路: クロック供給されていれば動作可能(UART, SPI, ADC など)
RTC: 動作可能
👉 電気が流れる場所
レジスタ保持回路
SRAM保持セル
周辺回路(動作中のもの)
RTC/電源管理- Stop モード(Deep Sleep)
CPUコア: 電源はあるが動作停止
SRAM: 保持(専用の保持電流が流れる)
周辺回路: 原則停止。ただし一部低速周辺(LPTIM, IWDG, RTCなど)は動作
クロック: PLL, HSE, HSI など高速クロックは停止。LSE/LSI など低速クロックは動作可能。
👉 電気が流れる場所
SRAM保持回路
レジスタ保持回路
RTC, LPTIM, IWDG など低速モジュール
電源管理回路- Standby モード
CPUコア: 電源断(完全停止)
SRAM: 消失(保持されない)
レジスタ: 消失(保持されない)
周辺回路: 停止。ただし RTC とバックアップレジスタ は VBAT で動作可能
クロック: LSE/LSI のみ動作
👉 電気が流れる場所
RTC ドメイン(VBAT供給あり)
ウェイクアップ回路(外部ピン、RTCアラーム、IWDG など)- 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 の低消費電力モードごとの挙動
- Sleep モード
CPUコア (VCORE): クロック停止、電源は生きている
SRAM/レジスタ: 保持
周辺回路: クロック供給中なら動作可(例: UART受信, SPI通信)
RTC/バックアップ: 動作可
👉 電気が流れている回路
SRAMセル保持回路
レジスタ保持回路
動作中の周辺回路
RTC/バックアップドメイン- Stop モード (Stop 0/1/2)
CPUコア: 停止(電源は残る)
SRAM/レジスタ: 保持(低消費保持電流で動作)
周辺回路: 原則停止。ただし一部低速(LPTIM, LPUART, IWDG, RTC)は動作可能
クロック: HSI, HSE, PLL 停止。LSE または LSI のみ動作
👉 電気が流れる回路
SRAM保持用回路
レジスタ保持用回路
RTC, LPTIM, LPUART などの「低消費周辺」
電源管理回路- Standby モード
CPUコア (VCORE): 完全電源断
SRAM/レジスタ: 消失(保持されない)
周辺回路: 停止。ただし RTC, バックアップレジスタは VBAT で動作可
クロック: LSE, LSI のみ動作可能
👉 電気が流れる回路
RTC/バックアップドメイン (VBAT供給)
ウェイクアップ回路(外部ピン, RTCアラーム, IWDG)
電源管理回路の最小部分- 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 系マイコンを想定した、各低消費電力モードで「どの回路に電気が流れているか」を図解・表でまとめたドキュメントです。周辺ごとの挙動一覧も追加しています。
- 前提(電源ドメイン)
VCORE ドメイン:CPUコア(Cortex‑M4), SRAM1/2, フラッシュ制御, DMA など
PERIPH ドメイン:GPIO, UART, SPI, I2C, ADC, タイマなどの周辺
BACKUP / RTC ドメイン:RTC, バックアップレジスタ, LSE(32.768kHz) — VBAT 供給可能
PWR/PMU:電源管理回路(レギュレータ, クロックゲーティング, パワーゲーティング) - 凡例
🔌 : 電源/クロックが供給され、実際に電流が流れている
⚪ : 電源/クロックが切られ、電流が流れていない
🟡 : 低消費保持(レテンション)や低速クロックで最小限動作 - 各モードの模式図(ブロック)
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 とウェイク検出のみが動作。多くは完全オフに近い。 - モード別まとめ表(主要ブロック)
モード 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 🟡 最小限 - 周辺ごとの挙動一覧(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 - 実務的な確認方法(設計/デバッグ時)
データシート/リファレンスマニュアルの「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 連携方法を追記しました。