# OS_StartTimer*

## 構文

  `#include <nitro/os.h>`
  `void OS_StartTimer( OS_TimerId id, u16 count, OS_TimerPrescaler preScale );
  void OS_StartTimer32( OS_Timer32Id id, u32 count, OS_TimerPrescaler preScale );
  void OS_StartTimer48( OS_Timer48Id id, u64 count, OS_TimerPrescaler preScale );
  void OS_StartTimer64( u64 count, OS_TimerPrescaler preScale );
  `

## 引数

id | 使用するタイマのタイマID(使用するタイマの個数によって異なります)
count | タイマカウント
preScale | タイマスケール

## 返り値

なし。

## 説明

内部タイマを設定し、起動します。

NITRO・TWL には 16 ビットカウンタのタイマが４つ用意されています。タイマはカウントアップタイマで、0xFFFF から 0 になるときに割込みを発生します。

4つのタイマはそれぞれを独立して使用することも出来ますし、連続する２つ以上のタイマを併用して 32ビット・48ビット・64ビットカウントのタイマとして用いることも出来ます。但しシステムで使用されるタイマもありますので注意が必要です。

設定したタイマが不要になった場合、`OS_StopTimer*()` を呼んでください。

`OS_StartTimer()` は、16ビットのタイマそれぞれを使用する関数です。

`OS_StartTimer32()` は、連続する２つのタイマを使い、最大32ビットカウントのタイマとして使用する関数です。

`OS_StartTimer48()` は、連続する3つのタイマで最大48ビットカウントのタイマとして使用する関数です。

`OS_StartTimer64()` は、全てのタイマで最大64ビットカウントのタイマとして使用する関数です。

id は使用するタイマのタイマ ID 指定で以下の通りです。

16ビットタイマの場合 ( `OS_StartTimer(), OS_StopTimer()` に対する id 指定 )

id | 使用するタイマ
--- | ---
OS_TIMER_0 | タイマ0
OS_TIMER_1 | タイマ1
OS_TIMER_2 | タイマ2
OS_TIMER_3 | タイマ3

32ビットタイマの場合 ( `OS_StartTimer32(), OS_StopTimer32()` に対する id 指定 )

id | 使用するタイマ
--- | ---
OS_TIMER32_01 | タイマ0, タイマ1
OS_TIMER32_12 | タイマ1, タイマ2
OS_TIMER32_23 | タイマ2, タイマ3

48ビットタイマの場合 ( `OS_StartTimer48(), OS_StopTimer48()` に対する id 指定 )

id | 使用するタイマ
--- | ---
OS_TIMER48_012 | タイマ0, タイマ1, タイマ2
OS_TIMER48_123 | タイマ1, タイマ2, タイマ3

count はタイマに与えるカウントで、16ビットタイマの場合0〜0xFFFF、32ビットタイマの場合0〜0xFFFFFFFF、48ビットタイマの場合0〜0xFFFFFFFFFFFF、64ビットタイマの場合0〜0xFFFFFFFFFFFFFFFF の値を設定出来ます。

preScale はタイマがカウントアップされていくスケールを設定するパラメータで、以下の通りです。

設定値 | プリスケーラ(カウントアップ間隔)
--- | ---
OS_TIMER_PRESCALER_1 | システムクロック
OS_TIMER_PRESCALER_64 | システムクロックの64分周
OS_TIMER_PRESCALER_256 | システムクロックの256分周
OS_TIMER_PRESCALER_1024 | システムクロックの1024分周

複数のタイマを併用したタイマを使用する場合、発生するタイマ割り込みは使用するタイマのうち最も番号の大きいものに対する割り込みとなります。但し、割込み許可は使用するすべてのタイマに対して行ってください。またこの場合、使用するタイマのうち最も番号が大きいもの以外のタイマに対して、システム内部の割込みハンドラが割り当てられます。

> `(例) タイマ0,1,2 を 48ビットタイマとして使用する
> #define count 0x100000000
> //---- set timer 2 interrupt handler
> OS_SetIrqFunction( OS_IE_TIMER2, TimerIntr );
> //---- enable timer 0-2
> (void)OS_EnableIrqMask( OS_IE_TIMER0 | OS_IE_TIMER_1 | OS_IE_TIMER2 );
> //---- start timer 0-2 (as 48bit timer)
> OS_StartTimer48( OS_TIMER48_012, count, OS_TIMER_PRESCALER_64 );
> //
> // interrupt handler
> //
> void TimerIntr(void)
> {
> OS_Printf("TIMER INTERRUPT!\n");
> OS_StopTimer48( OS_TIMER48_012 );
> }
> `

注意：

ハードウェアのタイマ仕様では、設定したタイマ割り込みは繰り返し発生しますが、OSでは最初の一回が発生したときにタイマの設定を解除しますので、タイマ割り込みは一回しか発生しません。繰り返し発生させるためには割り込みハンドラ内で再設定するなどの処理が必要です。

## 参照

`OS_StopTimer*
`

## 履歴

2008/02/05 複数タイマの場合の説明を追加
2005/03/08 用語統一 [割込み] → [割り込み]
2004/11/24 タイマ id の間違いを修正
2004/06/03 タイマ割り込みについての注意を追加
2003/12/01 初版