RISC-V搭載のMCU、GD32VF103にも当然ですが複数の電源ドメインというものあり、です。今回は、バッテリでバックアップ可能なドメインに入ります。ここにあるのは、RTC(実時間時計)と小容量のメモリなどです。PCなどではCMOSなどと通称される設定を記憶しておくためのもの。実際にバッテリを繋いで、主電源を切っても記憶が保持されることを確かめてみたいと思います。
※「鳥なき里のマイコン屋」投稿順Indexはこちら
前回はSipeed社の超小型マイコンボードLongan nano(GD32VF103の48ピン版搭載)を使用しましたが、今回はSeeed社のGD32VF103VBT6ボードをターゲットといたしました。やっぱりというか、電源周りの回路を眺めてみると、Longan nanoはちょっと節約している感じが強いためです。
バッテリでバックアップできるBackup Domainという部分には、以下の4つの回路が含まれています。
-
- RTC実時間クロック
- RTC用に使える低速(32kHz)クリスタルの発振回路
- バッテリバックアップ用のパワーオンRESET回路
- バッテリバックアップのレジスタ(小容量メモリ)
VBATという名の端子に外部バッテリを接続しておくことで、メイン電源がOFFになってもこの4つの回路だけは生き残るわけです。実際VBAT端子が電源として選択されるのは、主電源のVDD端子の電圧が落ちたときだけです(内部回路で切り替えられる)ただ、データシートから引用させてもらうと、以下のような注意が書かれています。
If no external battery is used in the application, it is recommended to connect VBAT pin externally to VDD pin with a 100nF external ceramic decoupling capacitor.
Longan nanoの場合、VBATを端子に出してはくれているのですが、3.3V電源との間には「NC」と書かれた断絶があり接続されていません。この辺ケチっている感じ。気になったら外でやってね、というところですかね。それに比べると、ボード面積的にも価格的にも「余裕」があると思われるGD32VF103VBT6ボードの方は、ボード上のVBAT端子と3.3V電源はショットキーダイオードを介してチップのVBAT端子に接続されており、VBATの接続に関わらず安心っぽい。勿論、注意書き通りに100nFも入っています。
回路上、使用されているダイオードはBAT54Cということになっています。元々は業界の老舗FAIRCHILD製品。今はONセミコンダクタになっています。ONセミ社のデータシートではMARKINGは「L43」の筈ですが、実際はこんな感じ。BAT54C Schottky Diodes(の多分互換品)。。。
ついでに、電源周りの違いを述べておくと、Longan nanoも、GD32VF103VBT6ボードもUSBの5V電源からレギュレータで3.3Vにして主電源にしているのですが、USBの保護部分が異なります。
-
- Longan nanoはヒューズ
- GD32VF103VBT6ボードは、MT9700パワースイッチ
万が一、むき出しの電源端子でショートを起こしてしまったような時にはどちらも2Aで電流が切れるのでホスト側への悪影響は抑えられるのだと思います。ヒューズは切れればおしまい、そしてUSB側への逆流は抑えられず、MT9700の場合、ヤバイときは切ってくれるし、逆流も抑えられるような回路が入っているようです。AEROSEMI社 MT9700
80mΩ, Adjustable Fast Response Current-Limited Power-Distribution Switch
こちらの方は、データシート記載どおりのマーキングであるので、純正品?のようです。こだわってもしょうがないですが。
やはり、Longan nanoは超小型で低価格なだけあって、切り詰めている感じがあります。電源周りなどの実験は、GD32VF103VBT6ボードの方が、良いように思いました。まあ、Longan nanoでも、外付けでちゃんと対処すれば問題ないでしょうが。
さて、バッテリバックアップ・レジスタへの書き込みのためには初期化が必要です。BKPIというバッテリバックアップのブロックにだけではなく、パワー制御のPMUにもクロックを供給しないとなりません。また、RESET後は書き込み禁止になっているので、書き込み許可をしないとなりません。そしてTamperという信号もあるので、必要ならその設定もしておかないとマズイようです。Tamperという信号は、バッテリバックアップドメインに接続されている3本の入出力端子(残り2つは32kHzクリスタル用)の一本で、これをアクティブにすると、バッテリバックアップ・レジスタの内容が一挙にクリアされてしまうセキュリティ用?の端子です。使い道としては、良からぬ輩が蓋を開けてバッテリバックアップ・レジスタ内に記憶されている何か大事な設定値を読み取ったり、改ざんしたりすることを防ぐためだと思います。今回は使ってないです。
// To access backup registers rcu_periph_clock_enable(RCU_PMU); rcu_periph_clock_enable(RCU_BKPI); pmu_backup_write_enable(); bkp_flag_clear();
読み出し関数はSDKで定義されているので、以下の関数で読み出せます。今回は、書き込んである筈の定数値と一致したらLED_RED点灯、不一致ならLED_GREEN点灯としてあります。LED_REDもLED_GREENも回路図上の名前で実際には青色LEDが搭載されているのですがね、このボード。(なおcontLEDはSDKの関数じゃありません。当方の小ネタ)
datR = bkp_data_read(BKP_DATA_5); if (datR == datW) { //RED contLED(LED_RED, (LED_GREEN | LED_BLUE)); } else { // GREEN contLED(LED_GREEN, (LED_RED | LED_BLUE)); }
また、書き込み関数も定義されているものを使うだけです。
bkp_data_write(BKP_DATA_5, datW);
実際にレジスタのアドレスを見てみると一部アドレスの並びが飛んでいるので、SDKの関数使う方が絶対簡単な筈なのですが、今回、ハマりました。
-
- BKP_DATAx (xには数字が入る)
- BKP_DATA_x(xには数字が入る)
上は、Backupレジスタ群にアクセスするためのマクロ、下が、引数として与えるためのenumです。上記の関数の引数にはenumの方を渡さないとならないのですが、マクロを渡してもコンパイルが通ってしまいます。アンダーバー一つ忘れたために1回目動かなかったです。なんだかな~。もう少しお名前分かり易くしてほしい。。。
バッテリ接続して動かしたところはアイキャッチ画像を御覧ください。コイン電池のフォルダがなかったので単三電池2本。バッテリ接続しないで主電源を抜くと当然、レジスタの内容は消えますが、バッテリを接続すればちゃんと内容が維持されます。当然か。