mwf_periph_wtimer - WTIMER, FRWT
mwf_periph_wtimer - WWDT, FRWT
ウェイクアップタイマーを利用するため手続きをまとめたペリフェラルオブジェクトthe_wtimer
を実装しています。
TWENETでは暗黙に使用されますので、ユーザプログラムでの初期化は不要です。
ウェイクアップタイマーはモジュール内に内蔵する 32768Hz の水晶振動子に基づき減算カウントします。例えば32768からタイマーを開始した場合、1秒後にカウンタは0にり割り込みが発生します。通常はスリープ起床に用います。起床後もカウンター値は減算を継続するため、起床後にカウント値を読み出すことで、起床後からの経過時間を計算できます。
ウェイクアップタイマーは、2系統あり系統0は40bit(当ライブラリでは32bitカウンタとして利用)、系統1は28bitのカウンタを用います。
またウェイクアップタイマーを利用した FTWT (Free Running Wake Timer) の手続きが含まれます。スリープ時も低消費電流で動作できる特徴をいかし、2系統あるウェイクアップタイマーのうちの一つを常に動作させることで、実時間に対応するカウンタとして利用します。TWENETでは、特定の設定を行うことでFRWTが機能し、FRWTが動作している場合は ADC の初期化待ちなどを効率的に行えます。
TWENETでは系統0をFRWTとして利用し、系統1を通常の起床用タイマーとして利用します。
コード例
- include
#include "mwf_periph_wtimer.hpp"
class mwf::periph::wtimer
global_init_wtimer_manager(), global_deinit_wtimer_manager()
static void global_init_wtimer_manager();
static void global_deinit_wtimer_manager();
the_wtimer
クラスオブジェクトの生成と破棄を行います。
init(), deinit()
void init();
void deinit();
ウェイクアップタイマーを初期化または終了します。
- 初期化時のパラメータ
u32ms
はタイムアウトをミリ秒(ms)で指定します。0
または省略したときは4000msとなります。
start(), stop()
void start(uint8_t dev, uint32_t u32ct)
void stop(uint8_t dev)
ウェイクアップタイマーを開始または停止します。
dev
には、使用するウェイクアップタイマーのデバイス番号(WTIMER0_DEVICE
またはWTIMER1_DEVICE
)を指定します。u32ct
には、開始時のカウント値を指定します。- FRWT が動作しているウェイクアップタイマーを指定した場合は、なにもしません。
read()
uint32_t read(uint8_t dev)
ウェイクアップタイマーのカウント値を読み出します。
dev
には、使用するウェイクアップタイマーのデバイス番号(WTIMER0_DEVICE
またはWTIMER1_DEVICE
)を指定します。- FRWT が動作しているウェイクアップタイマーの値は読み出せません。
is_running()
bool is_running(uint8_t dev)
ウェイクアップタイマーが動作中かを判定します。
dev
には、使用するウェイクアップタイマーのデバイス番号(WTIMER0_DEVICE
またはWTIMER1_DEVICE
)を指定します。- FRWT が動作しているウェイクアップタイマーを指定した場合は、falseを戻します。
set_interrupt()
void set_interrupt(uint8_t dev, bool b_enabled)
ウェイクアップタイマーが割り込みを発生させるかどうかを指定します。
dev
には、使用するウェイクアップタイマーのデバイス番号(WTIMER0_DEVICE
またはWTIMER1_DEVICE
)を指定します。b_enabled
をtrueに設定すると割り込みを発生させます。この指定がないと、スリープ起床時にも割り込みが発生しません。なお、いちどtrueを指定したウェイクアップタイマーに対してfalseを指定しても、割り込みを無効にすることはできません。- FRWT が動作しているウェイクアップタイマーを指定した場合は、なにもしません。
get_fired_status_on_wakeup()
uint8_t get_fired_status_on_wakeup()
スリープ起床後に呼び出し、その起床要因がウェイクアップタイマーであった場合は、デバイスに対応するビット (WTIMER0_DEVICE_MASK
またはWTIMER1_DEVICE_MASK
)が設定される。
class mwf::periph::wtimer (sys_ev_handler)
on_sleep()
特別な処理はありません。
on_wakeup()
起床要因を確認し内部に情報を保存し、割り込み状態をクリアします。また、タイマーは停止しません。
FRWT関連
freerun_start(), freerun_stop()
void freerun_start(uint8_t dev)
void freerun_stop()
FRWTの開始と終了を行います。カウント値は開始時を0として、32768Hzで加算される値です。
dev
には、ウェイクアップタイマーのデバイス番号(WTIMER0_DEVICE
またはWTIMER1_DEVICE
)を指定します。
freerun_is_running()
bool freerun_is_running()
FRWT が動作している場合に true を返す。
freerun_is_device()
bool freerun_is_device(uint8_t dev)
FRWT が動作しているデバイスなら true を返します。
dev
には、ウェイクアップタイマーのデバイス番号(WTIMER0_DEVICE
またはWTIMER1_DEVICE
)を指定します。
freerun_ct_get()
uint32_t freerun_ct_get()
FRWTのカウント値を返します。FRWTのカウント値は、ウェイクアップタイマーの値そのものではなく、0から加算される値に変換されます(大まかには正負反転した値)。
カウント値計算関数
FRWTカウント値をミリ秒に変換したり、2つのカウント値の差を計算する関数です。
freerun_ct_convert_msec()
uint32_t freerun_ct_convert_msec(uint32_t ct, uint32_t* dec_part = nullptr)
FRWTのカウント値ct
をミリ秒に変換します。dec_part
を指定した場合は、1/10 の桁の値を 0..9 で設定します。
freerun_ct_diff()
int32_t freerun_ct_diff(uint32_t val_past, uint32_t val_now)
カウント値同士を差を計算します。基本的にはval_now - val_past
の値ですが、カウンタが最大値から0に戻った場合を考慮して計算します。カウンタの最大値の半分までの時間差が計算可能で、val_past
の方が古い場合は、正の値を戻します。
freerun_ct_diff_msec()
int32_t freerun_ct_diff_msec(int32 vdiff)
freerun_ct_diff()
で得られるカウンタ差分vdiff
をミリ秒に変換します。
freerun_ct_diff_usec()
int32_t freerun_ct_diff_usec(int32 vdiff)
int32_t freerun_ct_diff_usec(uint32_t val_past, uint32_t val_now)
freerun_ct_diff()
で得られるカウンタ差分値vdiff
またはval_past
,val_now
により計算されるカウンタ差分をマイクロ秒に変換します。
- 計算上int32_t型の計算による桁溢れが発生します(およそ2000秒を超えるような場合)。