目次
前
次
システムタイマー処理
OSを使ったコンピュータシステムでは、内部で
システムタイマーを用意して、電源投入からの
経過時間を刻んでいます。
LPC1114では、OSを使っているコンピュータと同様に
システムタイマーを用意しています。
ブロック図を眺めてみます。
24ビットのカウンタを利用し、カウンタに値を
リロードしたり、割込みを発生させられます。
割込みとリロードの機能を使うと、定期的に実行する
内容を指定できます。Unixでcronによる、指定時刻に
わせてのコード実行が可能とわかります。
関係するレジスタのアドレスは、以下。
- $E000E010 SYST_CSR Control and Status Register
- $E000E014 SYST_RVR Reload Value Register
- $E000E018 SYST_CVR Current Value Register
- $E000E01C SYST_CALIB Calibration value register
各レジスタに与えられている機能をみていきます。
SYST_CSR(Control and Status Register)
クロックソース、利用許可禁止等の制御の他に
状態を情報として保持します。
各ビットの内容は、以下。
ブロック図で操作する部分に印をつけてみます。
TICKINTとCOUNTFLAGの論理積が、割込み制御モジュールに
対してのトリガーを生成するので、TICKINTに'1'を設定と
わかります。
ただし、SYSTEM TICKモジュールを動かしていることが
前提です。
Forthインタプリタが動作しているときに、どう指定
されているのかを、見てみました。
全ビットが0なので、SYSTEM TICKモジュールは
使われていないとわかります。
SYST_RVR(Reload Value Register)
24ビットカウンタに再設定する値を入れておきます。
レジスタ内のビット割当ては、以下。
32ビット中の24ビットは、LSBから入力。
現在値の表示とダミーの値を設定してみます。
ゼロになっているかと思っていましたが、値は入っていました。
SYST_CVR(Current Value Register)
今現在の24ビットカウンタの値が入ってます。
レジスタ内のビット割当ては、以下。
32ビット中の24ビットは、LSBから入力。
現在値を表示してみます。
カウンタは、動いているようです。
SYST_CALIB(Calibration value register)
キャリブレーションは、微調整に使うので
内蔵発振器と外部発振器のどちらを利用と
なるかで、設定値も変化します。
レジスタ内のビット割当ては、以下。
現在値を表示してみます。
このチップに関しては、4という値が設定されていますが
多分異なるチップだと、設定値も異なると思われます。
ここまでの内容から、システムタイマーを動かして
割込みをかけるワードを定義。
\ SFR
$E000E010 constant SYST_CSR \ Control and Status Register
$E000E014 constant SYST_RVR \ Reload Value Register
$E000E018 constant SYST_CVR \ Current Value Register
\ define initialize SYSTEM Tick
: init_tick
\ set reload value
11999999 SYST_RVR !
\ clear counter
0 SYST_CVR !
\ select source
1 2 lshift SYST_CSR bic!
\ enable TICKINT
1 1 lshift SYST_CSR bis!
\ enable System Tick
1 0 lshift SYST_CSR bis!
;
定義したワードで、1秒ごとに割込みが発生します。
割込みハンドラを用意して対応しますが
Forthではワードを定義しないと、割込み
が発生しても何もおきません。
目次
前
次