ch32funでdeep sleep
mruby/cを省電力にするために、deep sleepを取り入れることにした。 Arduinoを使ったmruby/cでのEPS8266やESP32用には、すでにこれを取り入れていたが、それを様々なマイコン用に一般化できるようにしてみたのである。
その仕様についても迷っていたのだが、deep sleepについては秒で指定するようにするが、浮動小数点を使えるマイコンでは、サブルーチンは引数は整数で渡したいのでms単位で指示を出すことにした。 それと、深く眠った後にresetのかかるdeep sleepと、消費電力は減るけどすぐに起きられるlight sleepを作ったが、後者はNO_SLEEP_LIGHTを定義することで、無効にできるようにした。
まずは、ch32funを使って、CH32V006,CH32X035,CH32V203について、deep sleepをできるようにして、006以外は動作チェックも行った。 CH32V006については、examples_x00x/standby_autowakeという例があったので、それを参考にした。 一方、CH32X035については、例が無かったので、リファレンスマニュアルを参考にして作ったが、Auto-wakeup moduleというのが出来ていて、レジスタの指定やクロック元が違ったりしたが、006と似たように書くことができた。 ただ、ch32funではCH32035用のレジスタが定義されていなかったので、以下のように定義した。
typedef struct {
__IO uint32_t CSR;
__IO uint32_t WR;
__IO uint32_t PSC;
} AWU_TypeDef;
#define AWU ((AWU_TypeDef *) AWU_BASE)
もしかしたら、最新判ではすでに定義されているかも知れないけど。 CH32V203では、さらに仕組みが変っており、real time clockを使って起きるような仕様になっていた。 かなり癖があって苦労したが、extralibs/rtc.hに関数が定義されていたので、それが非常に参考になった。 さらに、FLOATが有効な場合とそうでない場合で分岐していたのだが、その部分にミスがあって、CH32V203ではなかなかうまく行かずに苦労したが、なんとか動いた。
これでch32funを使ったmruby/cは、ほぼ完成したのでは無いだろうか。 CH32V006でのrv003usbがもう少し安定したら、その部分を調整する必要があるだろうが。 しかし、動作チェックが足りていない機能もあるので、それを少しずつやらないといけない。 今回もピン番号のミスを見付けたので、他にもミスが残っているかも。