LoginSignup
7
9

More than 5 years have passed since last update.

STM32マイコンのSLEEPモードをデバッグする方法

Last updated at Posted at 2019-03-28

確認環境

  • 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ライブラリでは以下を呼びます。
HAL_SuspendTick();

復帰。
HAL_ResumeTick();

SLEEPモードにする

以下呼び出しでSLEEPモードになります。
HAL_PWR_EnterSLEEPMode(PWR_LOWPOWERREGULATOR_ON, PWR_SLEEPENTRY_WFI);

SLEEPモードが解除されるまで上記呼び出しから帰ってきません。

SLEEPモードからの復帰

外部割込みやタイマーなどの割り込みが入るとSLEEPモードが解除されます。
その割り込みから抜けると、前項のHAL_PWR_EnterSLEEPMode()の続きから処理が再開します。

デバッガを落とさない方法

Keil μVisionやTrueSTUDIOでデバッグ中にSLEEPモードにすると、
リンクが切れてデバッグ状態から抜けてしまいます。

あらかじめ以下を呼んでおくことで、SLEEPモード中の割り込みをブレークポイントで捕まえたり、SLEEPモードからの復帰もトレースすることが出来ます。
HAL_DBGMCU_EnableDBGSleepMode();

ただ、これによりクロックが供給されて、電力を消費してしまいますので、
プロジェクト設定でマクロを定義し、デバッグ時のみ呼ぶようにしておきます。

SLEEP状態でデバッガを接続する方法

Keil μVisionのデフォルト設定では、マイコンがSLEEP状態にある時はデバッガで接続出来ません。
optionから以下のように「Connect: under Reset」を設定しておきます。
image.png

まとめ

/* 
 不要な割り込みを止める
*/
HAL_SuspendTick();
#if DEBUG
HAL_DBGMCU_EnableDBGSleepMode();
#endif
HAL_PWR_EnterSLEEPMode(PWR_LOWPOWERREGULATOR_ON, PWR_SLEEPENTRY_WFI);
HAL_ResumeTick();
/* 
 割り込みを再開 
*/
7
9
1

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
7
9