目次

システムタイマー処理

 OSを使ったコンピュータシステムでは、内部で
 システムタイマーを用意して、電源投入からの
 経過時間を刻んでいます。

 LPC1114では、OSを使っているコンピュータと同様に
 システムタイマーを用意しています。

 ブロック図を眺めてみます。




 24ビットのカウンタを利用し、カウンタに値を
 リロードしたり、割込みを発生させられます。

 割込みとリロードの機能を使うと、定期的に実行する
 内容を指定できます。Unixでcronによる、指定時刻に
 わせてのコード実行が可能とわかります。

 関係するレジスタのアドレスは、以下。

 各レジスタに与えられている機能をみていきます。

 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ではワードを定義しないと、割込み
 が発生しても何もおきません。


目次

inserted by FC2 system