[ARM奮闘記 Timer Controller]

AT91R400807 は、Timer Counter を内蔵しています。これを使うことで正確な時間を刻めます。

時間の単位

Timer Counter が利用できる単位時間は、次のモノがあります。

・MCKの1/2
・MCKの1/8
・MCKの1/32
・MCKの1/128
・MCKの1/1024
・XC0
・XC1
・XC2

XCx は、外部からのクロック入力です。MCKはマスタークロック (33.333MHz) です。
これらは TC Channel Mode レジスタの最下位 3bit にて指定します。

カウンター

カウント値は 16bit の値を持っています。マスタークロック分周の場合の最大時間は次のようになります。

・MCKの1/2の場合、約 3.932 ミリ秒
・MCKの1/8の場合、約 15.728 ミリ秒
・MCKの1/32の場合、約 62.914 ミリ秒
・MCKの1/128の場合、約 251.656 ミリ秒
・MCKの1/1024の場合、約 2013 ミリ秒

比較レジスタ

カウント値は RegisterA, RegisterB, RegisterC という比較用のレジスタと比較できます。
比較の結果、割り込みを発生させたり、TIOA や TIOB 等の出力ピンからパルスを出したりできるようです。
今回はソフト的なタイミングとりを行いたいので、RegisterC を使って割り込みを発生させたいと思います。

TC_IER にどのような条件でどのような出力を行うか設定します。
カウンタ値が RegisterC (TC_RC) と一致したら割り込みを発生させるには、TC_CPCS を指定します。
その他クロック入力を入れたり、立ち上がりエッジ・たち下がりエッジのどちらでカウントアップするかを
選んだりしますが、細かい点は AT91R40807 のマニュアルをご覧ください (^^;
Timer だけでなく AIC の方も設定する必要があります。
スタートアップルーチンの方は AIC に設定されている 4byte を関数アドレスとして処理するように
記述してありますので、変更はありません。

このあたりの設定を行うルーチン TimerDriver を作成して ArmDev に添付しました。

注意点

割り込みを全く使わない内は問題なかったのですが、割り込みを使い出すとリセットの問題が発生します。
NJARM7 によるダウンロードは、リセットを伴いません。ARM のレジスタを直に書き直して JUMP などを実現
しているようです。
そのため、割り込みの設定が行われている状態で新たにダウンロードすると、そのブロックを初期化する前に
割り込みが発生したり、CPU 的には割り込みが発生してないけども Timer 等の周辺部は割り込み中と認識して
いるような状態になり、割り込みが発生しない・割り込みっぱなし・割り込んで暴走するなどの不都合が発生し
ます。
これを回避するには、電源を切るのが良いのですが、ボードの電源入力だけでなく、JTAG接続部やCOM通信部など
すべて取り外さないと電源が切れない場合があり、非常に面倒です。
リセットすることでも初期化できるので、リセットボタンを付けるのが最も簡単な対策だと思います。

私は CN2-34 と CN2-40 の間にタクトスイッチを取り付けてリセットボタンとしました
(※本当はちゃんとリセット回路を組んで追加した方が良いです)



NJARM7 v1.1 からリセット機能が搭載されました。
簡易JTAG ケーブルにリセット信号用の配線を追加すれば、NJARM7 上のリセットボタンで ARM をリセットできるようです。

[前へ][▲上へ][次へ]