セクションの複数ページをまとめています。 印刷またはPDF形式で保存...

もとのページに戻る

2025-08-08 現在

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秒を超えるような場合)。