Standby mode current consumption on Nucleo-F446RE

内容更新(2020年3月12日)

1.はじめに

Mbedのフォーラムで、deep sleepの件が話題となりました。
https://forums.mbed.com/t/how-to-deep-sleep/7551
議論の中で、STM32L152(Nucleo-L152RE)に対して、一つの解決方法が示されました。
私も議論に沿った形でプログラムを作成し、休止中(再開はRESET状態から)の電流が充分低い値となることを確認しました。

Import programCheck_DeepSleep_os5

check ThisThread::sleep_for() + json MBED_TICKLESS function for CPU IDD reduction


しかし、F446REで同じプログラムを動作させても、電流が1.5mA程度とL152と違い減少しません。
ここでは2017年に書いたこのNotebookに追記する形で、低消費電流への対応を再考してみました。

2.ローパワーモードの種類

F446及びL152のリファレンスマニュアルを見ると、少し表現の違いはあるものの下記のようなモードがあり、下段に行くほど消費電流が少なくなります。

SleepCPUコアのみ休止で、周辺I/Oなどのクロックが継続。内部用レギュレータの稼働
Stop周辺I/Oを含め休止。内部用レギュレータの稼働
StandbyCPU&周辺I/O休止。内部用レギュレータ休止(OFF)でRTCやWakeupピンのみ動作

フォーラムの議論で有効だったのは二つの対策で、①jsonファイルでMBED_TICKLESSを指定することと、②ThisThread::sleep_for() でDeepSleepモードに入ることです。
両方ともOS5で有効で、OS2では使用出来ません。
DeepSleepモードは、上記のローパワーモードで言えばStopモードに相当しますが、ThisThread::sleep_for()で必ずStopモード(DeepSleep)に入るわけではなく、その時の状況判断(MBED_TICKLESSもその一つの条件)で入ったり入らなかったりしている模様です。
従って、同じプログラムでもL152では充分な結果が得られるのに、F446ではかなりがっかりする値にしか到達しません。 そこで思い出したのが、このNotebookを2017年に書いて公開していることでした。
ThisThread::sleep_for()関数では、CPUの違いや動作させているプログラムの違いにより目標とする休止電流になりません。
ここで紹介する方法は、制約条件はありますが確実に休止電流を減らすことが出来ます。
一番の違いは、Stopモード(DeepSleep)ではなくStandbyモードを利用することです。

3.制約条件など

幾つかの制約条件を記して置きます。
1) STM32シリーズの手持ちのボードのみで機能確認しました。
2) Mbedボードにはインターフェイス用のCPUが搭載されていますが、こちらの電流は低下させられません。
3) IDDジャンパを開放して電流測定を行いました。従ってCPUのみの電流で他の素子などの電流は含みません。
4) Standbyモードの復帰は、RESET動作と同じになります。

1)は、特にSTMicro特別でなく他のCPUでも可能と思いますが、手持ちボードとの関係で特化させました。
元々のアイデアは、Erikさんの下記のプログラムで、それをSTM32専用で機能も制限しています。
/users/Sissors/code/WakeUp/
Erikさんのライブラリはよく考えられており、これから紹介するプログラムより機能がたくさんあり、且つSTM32以外のCPUにも対応しています。
2)、3)に関しては、ボードを実際のアプリケーションで使用する際には、注意が必要です。
私は、Nucleo-F446REボードをそのまま実機で使用するために、①インターフェイスCPUへの電源不通電(EXTからの電源供給)、 ②CPUクロック用にボード上にXtalとC追加(インターフェースCPUからクロックが供給されている部分をカット)、 ③周辺I/O(センサーやmicroSDなど)の電源ON/OFF回路追加とその制御などの対策を実施し、全体電流が数百μAでの休止を実現しました。
4)に関しては、Erikさんのライブラリを参照願います。
実は、Stadbyモードから次のプログラムラインへの復帰は思った以上に大変です。
作成したコンストラクタを閉じたり再開したりとやるべき雑多なことが多くあり、それならばRESETで再開すれば何も気にせず一番良い休止電流でStadbyに入れます。

4.プログラム

OS2とOS5用に二つ用意しました。
OS5用では、MBED_TICKLESSの指定をjsonファイルでする必要がありません。
OS2では、明示的に休止状態を作ることが困難でした(wait()では消費電流は少なくならない)。
RTCの時刻合わせが面倒であれば、そのままENTERで抜け出してください。

Import programCheck_StandBy_os2

Enter Standby mode then wake up(only restart) by RTC timer

Import programCheck_StandBy_os5

Enter Standby mode then wake up(only restart) by RTC timer

5.従来の英文ノートブック

I have modified Erik's "Wake Up" library to implement not only sleep and/or deep sleep mode but also "Standby" mode.
I checked this mode on Nucleo-F446RE and STM32F & STM32L series.
Here is a checking program "Standby" mode.

Import programCheck_StandBy

Added Standby mode into WakeUp library. This is a checking program for the standby mode on Nucleo-F446RE and other STM32 series.

Following picture is a real measurement data.
Nucleo-F446RE does Not have any external connection.
Idd is only STM32F446RE chip and not included interface chip and other ICs.
Idd = 9.5 uA(Micro Ampapre).
This value is almost 1/30 compare with deep sleep mode current consumption.
(real measurement data -> deep sleep mode = 325uA)

/media/uploads/kenjiArai/standby_idd.jpg

In the reference manual, en.DM00135183.pdf(Rev2 January 2016), you can see following sentence on P103.
"The Standby mode allows to achieve the lowest power consumption."
Under standby mode:
1) CPU Core + FPU -> No clock
2) All I/O pins -> High impedance (some exception)
3) Internal voltage regulator(1.2V) -> Off
4) PLLs, HSI(or HSE) -> Off
5) FLASH & SRAM -> off (except backupRAM)
6) RTC -> On

If your application program measure some data every 2 minutes, this standby mode is very useful to control long battery life.
Please try the function.

I have checked STM32F & STM32L series CPUs.
Nucleo-F446RE, Nucleo-F411RE, Nucleo-F401RE, Nucleo-L152RE, Nucleo-L073RZ, Nucleo-L053R8
All of those CPUs current consumption is around 10uA in standby mode.
I'm trying Nucleo-L476RG but I cannot control to enter "Standby mode" yet.


Please log in to post comments.