WakeTimer(ウェイクタイマー)関連のAHI関数と解説
WakeTimer(ウェイクタイマー)
vAHI_WakeTimer
関連の互換関数の実装です。
- この実装は完全な互換性を保つことを目的とはしていません。
- 本書記述時点で判明している留意点などを記載します。
- 内部の実装は予告なく変更される場合があります。
- 解説中のパラメータについても、留意が必要な部分のみ記述しています。省略部分は、原典の AHI ライブラリマニュアルを参照ください。
ウェイクタイマーは2系統あり、スリープ中問わずカウンタが動作します。カウンタは減算式で値が0になったときに割り込みが発生します。またウェイクタイマーは、動作し続ける特性から起動時からの経過時間を計る時計として利用することもできます。時計として利用するための手続きをまとめた FRWT(FreeRunning WTimer)関数軍も用意しています。
- タイマーは
E_AHI_WAKE_TIMER_0
の場合41ビット、E_AHI_WAKE_TIMER_1
の場合28ビットです。後者は BLUE/RED(JN516x) と仕様が違いますので注意してください(カウンタ値として時間差分を計算する場合は、最大値が0x0FFFFFFF
である点に注意してください。例えばct1
からct2
の間の経過カウントを計算する場合は(((ct2 << 4) - (ct1 << 4)) >> 4)
のように計算します) - 本ライブラリでは 32ビットを超えるタイマー値を扱う関数は用意していません。
- mwxライブラリやいくつかのアプリケーションでは、タイマーの1系統(
E_AHI_WAKE_TIMER_0
を動作しつづけて時間計測をするための処理(Free Running WTimer:FRWT
API)を行います。
vAHI_WakeTimerEnable()
void vAHI_WakeTimerEnable(uint8 u8Timer,
bool_t bIntEnable)
タイマーを初期化する。
vAHI_WakeTimerStart()
void vAHI_WakeTimerStart(uint8 u8Timer, uint32 u32Count)
タイマーを開始する。u32count
はカウンター値を指定する。TWELITE GOLD の場合、1秒後に割り込みを発生させたい場合は 32768
(32KHz 水晶振動子の周波数) を指定する。
vAHI_WakeTimerStop()
void vAHI_WakeTimerStop(uint8 u8Timer)
タイマーを停止する。
u32AHI_WakeTimerCalibrate()
uint32 u32AHI_WakeTimerCalibrate(void);
ウェイクタイマーのキャリブレーション値 10000
を返します。
- 本来は精度の低いRCタイマーで 10000 に対して±30%程度の値になりますが、TWELITE GOLDでは32KHz水晶によるタイマー回路が含まれるため、この水準でのキャリブレーションは不要です。無条件で
10000
を返します。
u32AHI_WakeTimerRead()
uint32 u32AHI_WakeTimerRead(uint8 dev)
カウンタ値を返します。起床割り込みはカウンタが0になったときに発生します。その後もカウンタは減算を続けます(0の次はカウンタの最大値)。
u8AHI_WakeTimerStatus()
uint8 u8AHI_WakeTimerStatus(void)
タイマーの稼働状況のビットマップを返す。E_AHI_WAKE_TIMER_0
の場合 E_AHI_WAKE_TIMER_MASK_0
(1)
、E_AHI_WAKE_TIMER_1
の場合E_AHI_WAKE_TIMER_MASK_1
(2)
が設定されます。
u8AHI_WakeTimerFiredStatus()
uint8 u8AHI_WakeTimerFiredStatus()
起床直後に使用し、起床要因が WTIMER の場合、0 以外の値が戻ります。
E_AHI_WAKE_TIMER_0
の場合、E_AHI_WAKE_TIMER_MASK_0
(1)
が戻ります。E_AHI_WAKE_TIMER_1
の場合、E_AHI_WAKE_TIMER_MASK_1
(2)
が戻ります。
Free Running WTimer (FRWT)
WAKE TIMER を1系統(原則E_AHI_WAKE_TIMER_0
)用い、実行し続けることによりリアルタイムカウンタとして用います。スリープ状態を問わず時間を計測することができます。
グローバル変数
G_TWENET_FREE_RUNNING_WTIMER_ENABLED()
uint8_t G_TWENET_FREE_RUNNING_WTIMER_ENABLED() // MACRO
この辺数は cbAppColdStart(FALSE)
呼び出しで設定します。0x80
を指定することで E_AHI_WAKE_TIMER_0
をFRWTとして動作させます。WAKE TIMER のカウンタは時間の経過とともに減算されますが、FRWTは加算します。
- mwxライブラリでは、自動的に
E_AHI_WAKE_TIMER_0
によるFRWTが設定されます。
g_twenet_free_running_wtimer_boot_tick
uint32_t g_twenet_free_running_wtimer_boot_tick
スリープ復帰直後(RAM保持)のカウント値を保存します。TWENETライブラリ中からvAHI_FRWTSetBootCount_MW()
が呼び出されることにより設定されます。
vAHI_FRWTStart_MW()
void vAHI_FRWTStart_MW(uint8_t u8Timer)
本関数はTWENETライブラリ中で用いるため、原則としてユーザプログラムでは使用しません。グローバル変数G_TWENET_FREE_RUNNING_WTIMER_ENABLED()
の設定によりFRWTを起動させます。
u32AHI_FRWTGetCurrentCount_MW()
uint32 u32AHI_FRWTGetCurrentCount_MW()
FRWTのカウント値(32000カウント/秒) を返す。
u32AHI_FRWTGetCurrentCount_msec_MW()
uint32 u32AHI_FRWTGetCurrentCount_msec_MW(uint32* dec_part)
現在のFRWTをミリ秒で返す。
dec_part
はNULL
またはuint32
変数へのポインタを指定します。指定された場合は 1/10 ミリ秒の値 (0..9) を返します。
u32AHI_FRWTConvertCount_msec_MW()
static inline uint32 u32AHI_FRWTConvertCount_msec_MW(uint32 ct, uint32* dec_part) {
// note: see wtimer::freerun_ct_convert_msec()
uint64_t v = 1000ull * ct;
if(dec_part) *dec_part = (10*(v & 32767)) >> 15;
return (uint32)(v >> 15);
}
FRWTのカウント値をミリ秒に変換します。dec_part
は指定された場合は 1/10 ミリ秒の値(0..9)を返します。
i32AHI_FRWTCompareCount_MW()
int32 i32AHI_FRWTCompareCount_MW(uint32 val_past, uint32 val_now)
FRWTのカウント値の比較を行います。val_now
がより最近の値、val_past
がより過去の値を指定し、この場合は正の値のカウント値を戻します。
i32AHI_FRWTCompareCount_msec_MW()
int32 i32AHI_FRWTCompareCount_msec_MW(uint32 val_past, uint32 val_now)
FRWTのカウント値の比較を行います。val_now
がより最近の値、val_past
がより過去の値を指定し、この場合は正の値のミリ秒を戻します。
vAHI_FRWTSetBootCount_MW()
void vAHI_FRWTSetBootCount_MW()
本関数はTWENETライブラリ中で用いるため、原則としてユーザプログラムでは使用しません。
スリープ起床時(RAM保持、ウォームブート)に、FRWTカウント値を保存するために用います。
uint32 u32AHI_FRWTGetBootCount_MW()
uint32 u32AHI_FRWTGetBootCount_MW()
スリープ起床時(RAM保持、ウォームブート)に、FRWTカウント値を返します。
u32AHI_FRWTGetBootCount_msec_MW()
uint32 u32AHI_FRWTGetBootCount_msec_MW()
スリープ起床時(RAM保持、ウォームブート)に、FRWTカウント値をミリ秒に変換して返します。