Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

ワンショットタイマー

ここまでで、遅延を実装する方法として 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 の値です。