low-power-embedded について
組み込み開発エージェント向けに、MCUの低消費電力モード、ウェイクソース、クロック制御、電流測定を案内します。STM32を中心とした実例も含みます。
主な機能
- 01Sleep、Stop、Standbyモードの比較
- 02Cortex-MのWFI/WFEスリープ設定
- 03EXTIやRTCなどのウェイクソース設定
- 04ペリフェラルクロックと低電力状態の確認
- 05電流測定とウェイク問題の調査
活用シーン
- 01バッテリー駆動ファームウェアの消費電力削減
- 02ウェイク遅延と電流消費の調整
- 03復帰しないデバイスの原因調査
- 04リリース前のRTOSアイドルスリープ確認
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ mohitmishra786/ low-level-dev-skills --skill low-power-embeddedインストール後、Claude Code で/low-power-embeddedを入力して読み込まれたか確認します。
詳細
低消費電力組み込みシステム
目的
エージェントが MCU の低消費電力モードを扱えるようにガイドします。スリープとディープスリープ(ストップ/スタンバイ)の違い、ペリフェラルおよびバスクロックのゲーティング、ウェイクアップソースの設定、実用的な電流測定を取り上げます。Cortex-M の WFI/WFE とベンダーの PWR の例を使用します(STM32 を中心としたパターンは幅広く応用できます)。
使用する場面
- バッテリー駆動のファームウェアで消費電力の予算を満たせない場合
- ウェイクアップ遅延と消費電力のトレードオフを検討する場合
- 「デバイスが起動しない」または「スリープ中も電流が mA 単位で流れる」問題をデバッグする場合
- RTOS のアイドルフックやベアメタルのメインループでスリープする前
skills/baremetal/interrupts-and-exceptions-baremetalと相互参照する場合
ワークフロー
1. 電力モードの階層(STM32 形式)
| モード | CPU | ペリフェラル | RAM | ウェイクアップソース | 相対電流 |
|---|---|---|---|---|---|
| 実行 | オン | オン | オン | — | 最大 |
| スリープ | オフ | オン | オン | 任意の IRQ | 中 |
| ストップ | オフ | ほとんどオフ | オン | EXTI、RTC、UART | 低 |
| スタンバイ | オフ | オフ | 消失* | WKUP ピン、RTC | 最小 |
* スタンバイでは SRAM の大部分がクリアされます。状態の保持にはバックアップドメインまたは外部 EEPROM を使用してください。
2. スリープに入る(WFI)
/* Cortex-M — sleep until interrupt */
__disable_irq();
/* configure wake source (e.g. EXTI, RTC alarm) */
__enable_irq();
__WFI(); /* or __WFE() for event-based wake */
WFI の前に保留中の割り込みをクリアしてください。クリアしないと、すぐにウェイクアップする場合があります。
3. STM32 のストップモードのパターン
#include "stm32f4xx.h"
void enter_stop_mode(void)
{
/* Gate clocks you do not need */
RCC->AHB1ENR &= ~RCC_AHB1ENR_GPIOAEN; /* example — only if safe */
PWR->CR |= PWR_CR_CWUF; /* clear wake flags */
PWR->CR |= PWR_CR_PDDS; /* deep sleep = Stop */
SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk;
__WFI();
/* After wake: re-enable HSE/PLL — clocks lost in Stop on many parts */
SystemInit();
}
ストップから復帰した後、レジスターの内容が失われたクロックとペリフェラルを再初期化してください。
4. クロックゲーティングのチェックリスト
Before sleep
├── Disable unused peripheral clocks (RCC xENR)
├── Disable ADC/DAC continuous modes
├── Stop DMA channels
├── Enter peripheral low-power (UART mute, SPI off)
└── Configure lowest viable regulator scale (Voltage Scale 2/3)
5. ウェイクアップソース
| ソース | 設定 |
|---|---|
| EXTI GPIO | SYSCFG + EXTI IMR、エッジトリガー |
| RTC アラーム | RTC WUT/WAKEUP |
| UART | スタートビット検出(一部の MCU) |
| IWDG | ウェイクアップソースではありません — デバイスをリセットします |
6. 測定のヒント
- VDDA/VDD に電流計を直列に接続します。uA の測定ではサンプリング時間を短くします
- ウェイクアップ遅延のベンチマークには DWT サイクルカウンターを使用します
- 同じクロックツリーを使用して測定した実行時とスリープ時の電流を比較し、条件を記録します
7. RTOS に関する注意
FreeRTOS の configUSE_TICKLESS_IDLE は WFI/ストップに対応します。skills/embedded/freertos と連携してください。
8. エージェントの使用方法
/low-power-embedded Configure STM32 Stop mode with EXTI0 wake and PLL restore
よくある問題
| 症状 | 原因 | 修正方法 |
|---|---|---|
| 「スリープ」中も mA 単位の電流が流れる | デバッグインターフェース(SWD)が有効 | デバッガーを切断し、DBGMCU を無効にします |
| WFI からすぐに復帰する | NVIC IRQ が保留中 | WFI の前にフラグをクリアします |
| 復帰後に状態が失われる | ストップではなくスタンバイに入った | RAM の保持が必要な場合はストップを使用します |
| 復帰後に UART が動作しない | クロックツリーが復元されていない | SystemInit() の処理を呼び出します |
| データシートの uA より電流が大きい | GPIO が未接続 | 未使用ピンをアナログ入力に設定するか、プルを設定します |
関連スキル
skills/baremetal/interrupts-and-exceptions-baremetal— EXTI ウェイクアップ IRQskills/baremetal/gpio-baremetal— リーク制御のためのピンモードskills/baremetal/stm32-baremetal— RCC および PWR レジスターskills/baremetal/timers-pwm-baremetal— スリープ前にタイマーを停止skills/embedded/freertos— ティックレスアイドルとの統合
コメント
Markdown 対応