ワンショットタイマー
ここまでで、遅延を実装する方法として for ループによる遅延がよくないやり方であることを、あなたに納得してもらえていたらと思います。
ここからは、ハードウェアタイマー を使って遅延を実装します。(ハードウェア)タイマーの基本的な機能は、 … 時間を正確に追跡することです。タイマーもまたマイクロコントローラで利用できる別のペリフェラルであり、 そのためレジスタを使って制御できます。
私たちが使っているマイクロコントローラには、異なる種類のタイマー (基本タイマー、汎用タイマー、アドバンストタイマー)が複数(実際には 10 個以上)用意されています。 タイマーによって 分解能(ビット数)が異なり、単に時間を追跡する以上の用途に使えるものもあります。
ここでは 基本 タイマーの 1 つである TIM6 を使用します。これは、私たちの
マイクロコントローラで利用できる中でも最も単純なタイマーの 1 つです。基本タイマーに関するドキュメントは
次のセクションにあります。
セクション 22 タイマー - 670 ページ - リファレンスマニュアル
そのレジスタは次に記載されています。
セクション 22.4.9 TIM6/TIM7 レジスタマップ - 682 ページ - リファレンスマニュアル
このセクションで使用するレジスタは次のとおりです。
SR、ステータスレジスタEGR、イベント生成レジスタCNT、カウンタレジスタPSC、プリスケーラレジスタARR、オートリロードレジスタ
タイマーは ワンショット タイマーとして使用します。これは、ある意味では目覚まし時計のように動作します。 一定時間後にタイマーが発火するよう設定し、その後タイマーが発火するまで待機します。ドキュメントでは この動作モードを ワンパルスモード と呼んでいます。
基本タイマーをワンパルスモードに設定したときの動作は、次のようになります。
- カウンタはユーザーによって有効化されます(
CR1.CEN = 1)。 CNTレジスタは値をゼロにリセットし、各ティックごとに値が 1 ずつ増加します。CNTレジスタがARRレジスタの値に達すると、カウンタはハードウェアによって無効化され (CR1.CEN = 0)、アップデートイベント が発生します(SR.UIF = 1)。
TIM6 は APB1 クロックで駆動されます。この周波数は、必ずしもプロセッサの周波数と一致するとは限りません。
つまり、APB1 クロックはより速く動作している場合もあれば、より遅く動作している場合もあります。しかし、
デフォルトでは APB1 とプロセッサはどちらも 8 MHz でクロックされています。
ワンパルスモードの機能説明で言及したティックは、APB1 クロックの 1 ティックと
同じでは ありません。CNT レジスタは 1 秒あたり apb1 / (psc + 1)
回の周波数で増加します。ここで、apb1 は APB1 クロックの周波数、psc は
プリスケーラレジスタ PSC の値です。