/      English

mwf_periph_wtimer - WTIMER, FRWT

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_enabledtrueに設定すると割り込みを発生させます。この指定がないと、スリープ起床時にも割り込みが発生しません。なお、いちど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秒を超えるような場合)。