鳥なき里のマイコン屋(100) GD32VF103、Standbyモード

JosephHalfmoon

RISC-V搭載のGigaDevice社の32ビットマイクロコントローラ(MCU)、GD32VF103のあれこれを体験してきておりますが、今回は「Standbyモード」を使ってみます。当面マイコンがやる仕事が無い時に消費電力を下げるために、大抵のMCUがもっている「あれ」です。ただ、手元の環境ではあまり真面目な測定もできそうにありません。ま、だいたい雰囲気を把握でければ。。。

まず、このMCUが持っているPowerセーブ関係のモードを列挙すると以下のようになります。

  1. Sleepモード。CPUコアへのクロック供給は止まり、ソフトウエアの実行は止まるけれども、周辺回路のハードは動いている。
  2. Deep-sleepモード。レジスタやSRAMの内容は保存されるけれども、主要部分は全て停止。復帰のための信号をハンドリングする部分のみ内部生成の遅いクロックで生き続ける。
  3. Standbyモード。内部の1.2V電源がオフになる。レジスタやSRAMの内容は失われる。Reset信号、WKUP端子、RTCアラームなど特定の信号でのみ再起動できる。

上から下に向かって、段々に強力になると。今回は、もっとも電力削減効果の大きいStandbyモードをまずは使ってみることにいたしました。ただ問題は、

手元の評価ボードではCPU単体の消費電力を測るのが難しい

です。良くできた(お高い)評価ボードでは、マイコン単体の消費電力(見せたいところはμAオーダ以下のStandby電流)を測れるように電源周りを周囲と切り離せるようになっているものがあります。しかし手元の「お求めやすい」評価ボードにはそのようなものは載っていません。基本、USBの5V電源からマイコンや他の周辺チップ等に供給する3.3Vを生成して動作させています。電流を簡単に測れるのはボードレベルになってしまいます。ボードレベルでは、レギュレータやLED等にも電流が流れるおりマイコン部分もそれらと合算されてしまいます。単体では見えません。でもね、どうせ、Standby時のマイコン単体の値はデータシートに書いてある。

6.27μAから7.56μA

今回は、実際に、この評価ボードレベルでどの程度電流流れるのか測っておくべし、という妥協であります。

USB電源ということで、最初、以前使ったことのあるUSB電力メーターを使ってみる気でいたのです。しかし、しまってある箱から取り出して気付きました(箱を見つけるのにかなり時間を使いましたが)。もともとリチウムイオン電池に充電するような電流を時間で積算する目的のツールなので、

こういう「細かい」電流測定には粗すぎ

です。そこで第2案として別シリーズで毎度お世話になっているAnalog Devices ADALM1000(M1K)を電源として使って、電流測ろうと考えました。USB電源にみせかけて電力を与えるジグを作り、M1Kのチャネル1から5Vを与えてみました。これで電流測ればとやってみると、挙動が不審。チャネル1からはDC5V供給されているように見えるのですが、ボード上のLEDが全て点滅。そんなプログラムは書き込んでいないので、何か起動時によからぬことが起こって、変なところに落ち込んでいるようです。RESETかけても変わらず。要後日調査。(2021年1月11日追記:「要後日調査」の件、こちらに理由と対策を記載。)

しかたがないので、M1Kは5V電源に「集中」してもらって、電源端子からの電流供給のみとして、電流は、ハンデイDMMで測ることにいたしました。

この構成なら正常に動作

そのときの測定系の様子は下のようです。

使ったソフトウエアの大筋は、以下のようです。

  1. 動作状態は右下の3個のLEDで知らせる。
  2. 起動時は一番上のLEDを点灯。RESETなりWKUPなりで再起動かかるとこのLEDが光るので分かる。約10秒。
  3. その後、右LED全消灯して約10秒(ただし赤色の電源LEDは消灯できない)。それから2番目のLEDを点灯して約10秒。ここでの差からLED1灯分の電流が見積もれる筈、だいたいね。
  4. その後LED全消灯(やはり赤色LEDは消えない)してStandbyに入る。
  5. Standbyから抜けるのは、右下のボタン(PA0、WKUP端子に接続)。

この中から、実際にstandbymodeに入るために必要なコードの部分のみ抜き出すと、こんな感じです。簡単?

//初期化
    rcu_periph_clock_enable(RCU_PMU);
    pmu_wakeup_pin_enable();
//standbymodeに入る
    pmu_to_standbymode(WFI_CMD);

実際に、スタンバイに入るためには、RISC-VのCSRレジスタのビットを操作してから、WFI命令(Wait for interrupt)を実行するのですが、その辺のことは上記の関数が包んでくれているので、アセンブラレベルの操作は気にしないですみます。なお、pmu_to_standbymode()関数は、WFE_CMD(WFE = Wait for Event)という定数も引数にとれるようなのですが、実際に与えてみたら、WKUPボタンでは戻ってこなくなりました。なぜ?何か設定がまずい?これまた要後日調査。

ハンディDMMで測った電流はこんな感じ。

  • LED赤点灯+青1灯状態、systick.hのdelayループ中 32.76mA
  • LED赤点灯、systick.hのdelayループ中 31.24mA
  • standby時、下を御覧じろ

とりあえず、最初からやり直す(レジスタやSRAM保存されない)のであれば、このボードは電源いれたままでも、このくらいまで待機電流は減らせる、と。前回読み書きしてみたEEPROM使えば、Standby前のデータを保存することも可能ではある。しかし、ボード上の電源デバイスが生きたままなので、こんなもんかい。

鳥なき里のマイコン屋(99) GD32でAT24C02、EEPROM へ戻る

鳥なき里のマイコン屋(101) GD32VF103、タイマ PWM出力へ進む