確認環境
- STM32マイコン
- Keil μVision 及び TrueSTUDIO
- ST-Link/V2
- STM32Cube (HALライブラリ)
SLEEPモードの実装
まず、SLEEPモードの実装は概ね以下となります。
/*
不要な割り込みを止める
*/
HAL_SuspendTick();
HAL_PWR_EnterSLEEPMode(PWR_LOWPOWERREGULATOR_ON, PWR_SLEEPENTRY_WFI);
HAL_ResumeTick();
/*
割り込みを再開
*/
不要な割り込みを止める
SLEEP状態で割り込みが入るとSLEEP状態が解除されてしまいますので、
タイマーなどの不要な割り込みを停止させておきます。
SysTickタイマーを止める
SysTickの割り込みも停止させます。
CubeMXのHALライブラリでは以下を呼びます。
復帰。
SLEEPモードにする
以下呼び出しでSLEEPモードになります。
SLEEPモードが解除されるまで上記呼び出しから帰ってきません。
SLEEPモードからの復帰
外部割込みやタイマーなどの割り込みが入るとSLEEPモードが解除されます。
その割り込みから抜けると、前項のHAL_PWR_EnterSLEEPMode()の続きから処理が再開します。
デバッガを落とさない方法
Keil μVisionやTrueSTUDIOでデバッグ中にSLEEPモードにすると、
リンクが切れてデバッグ状態から抜けてしまいます。
あらかじめ以下を呼んでおくことで、SLEEPモード中の割り込みをブレークポイントで捕まえたり、SLEEPモードからの復帰もトレースすることが出来ます。
ただ、これによりクロックが供給されて、電力を消費してしまいますので、
プロジェクト設定でマクロを定義し、デバッグ時のみ呼ぶようにしておきます。
SLEEP状態でデバッガを接続する方法
Keil μVisionのデフォルト設定では、マイコンがSLEEP状態にある時はデバッガで接続出来ません。
optionから以下のように「Connect: under Reset」を設定しておきます。
まとめ
/*
不要な割り込みを止める
*/
HAL_SuspendTick();
# if DEBUG
HAL_DBGMCU_EnableDBGSleepMode();
# endif
HAL_PWR_EnterSLEEPMode(PWR_LOWPOWERREGULATOR_ON, PWR_SLEEPENTRY_WFI);
HAL_ResumeTick();
/*
割り込みを再開
*/