ワンショットタイマ
これまでに、forループでの遅延は、遅延を実装する方法としては良くない方法であると納得してもらっていると思います。
ここでは、ハードウェアタイマを使って遅延を実装します。(ハードウェア)タイマの基本的な機能は、時間を正確に追跡することです。 タイマは、マイクロコントローラから利用できるさらに別のペリフェラルです。 そのため、レジスタを使って制御できます。
私たちが利用しているマイクロコントローラは、いくつかの(実は10を超える数の)異なる種類(簡易、汎用、高度なタイマ)のタイマを持っています。 いくつかのタイマは、他のタイマより高い分解能(ビット数)を持ちます。そして、単純に時間を追跡すること以上の用途で使えるものもあります。
TIM6という簡易タイマの1つを利用します。このもっとも単純なタイマは、マイクロコントローラ内で利用可能です。
この簡易タイマのドキュメントは、下記にあります。
Section 22 Timers - Page 670 - Reference Manual
レジスタに関する記述は、下記にあります。
Section 22.4.9 TIM6/TIM7 register map - Page 682 - Reference Manual
このセクションで利用するレジスタは、下記の通りです。
SR、ステータスレジスタ。EGT、イベント生成レジスタ。CNT、カウンタレジスタ。PSC、プリスケーラレジスタ。ARR、自動リロードレジスタ。
タイマをワンショットタイマとして使用します。これは、目覚まし時計のような役割を果たします。 ある程度時間が経過してからタイマがオフになるように設定してから、タイマがオフになるまで待ちます。 ドキュメント内では、この動作モードをワンパルスモードと呼んでいます。
ここに、簡易タイマをワンパルスモードとして設定する方法を記載します。
- カウンタをユーザーによって有効化します(
CR1.CEN = 1)。 CNTレジスタの値をゼロにリセットします。この値は、ティックごとに値が1つずつインクリメントされます。- 一度
CNTレジスタがARRレジスタの値に到達すると、カウンタがハードウェアによって無効になります(CR1.CEN = 0)。 そして、更新イベント(SR.UIF = 1)が通知されます。
TIM6はAPB1クロックによって駆動されます。APB1のクロック周波数は、プロセッサの周波数と一致している必要はありません。
APB1クロックは、プロセッサより速かったり遅かったりします。しかし、デフォルトでは、APB1とプロセッサのクロックは両方とも8MHzです。
ワンパルスモードの機能説明で書かれているティックは、APB1クロックの1ティックと同じではありません。
CNTレジスタは、毎秒apb1 / (psc + 1)の周波数で増加します。
ここで、apb1はAPB1クロックの周波数で、pscはプリスケーラレジスタ(PSC)の値です。