/      English

WakeTimer(ウェイクタイマー)関連のAHI関数と解説

TWENETライブラリ、WakeTimer(ウェイクタイマー)関連のAHI関数と解説

WakeTimer(ウェイクタイマー)

vAHI_WakeTimer関連の互換関数の実装です。

ウェイクタイマーは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:FRWTAPI)を行います。

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_partNULLまたは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カウント値をミリ秒に変換して返します。