ビジーウェイト
タイマは、適切に初期化されているはずです。残りは、このタイマを使ってdelay
関数を実装することです。
まず最初にやらなければならないことは、ms
ミリ秒後にタイマをオフにするために、自動リロードレジスタ(ARR
)レジスタを設定することです。
カウンタは1KHzで動作するため、自動リロードの値は、ms
と同じ値になります。
#![allow(unused)] fn main() { // `ms`ティック後にオフになるようにタイマを設定します。 // 1ティックは1msです。 tim6.arr.write(|w| w.arr().bits(ms)); }
次に、カウンタを有効にする必要があります。有効化すると、すぐにカウントが開始します。
#![allow(unused)] fn main() { // CEN:カウンタを有効化します。 tim6.cr1.modify(|_, w| w.cen().set_bit()); }
今度は、カウンタが自動リロードレジスタの値(ms
)に到達するまで待つ必要があります。すると、ms
ミリ秒経過したことがわかります。
この状態は、更新イベントと呼ばれます。そして、これはステータスレジスタ(SR
)のUIF
ビットによってわかります。
#![allow(unused)] fn main() { // アラームがオフになるまで(更新イベントが発生するまで)待ちます while !tim6.sr.read().uif().bit_is_set() {} }
ある条件が満たされるまで単純に待つようなパターン、今回の場合だとUIF
が1
になる、はビジーウェイトと呼ばれます。
この言葉を、このテキスト内で何回か目にするでしょう:-)
。
最後に、UIF
ビットをクリア(0
に設定)しなければなりません。もしこれを行わないと、次にdelay
関数に入った時に、
更新イベントが既に発生しており、ビジーウェイト部分の実行を飛ばすことになります。
#![allow(unused)] fn main() { // 更新イベントフラグをクリアします tim6.sr.modify(|_, w| w.uif().clear_bit()); }
では、ここまでの全てをまとめて、期待通り動くかどうか確認して下さい。