ビジーウェイト

タイマは、適切に初期化されているはずです。残りは、このタイマを使ってdelay関数を実装することです。

まず最初にやらなければならないことは、msミリ秒後にタイマをオフにするために、自動リロードレジスタ(ARR)レジスタを設定することです。 カウンタは1KHzで動作するため、自動リロードの値は、msと同じ値になります。


# #![allow(unused_variables)]
#fn main() {
    // `ms`ティック後にオフになるようにタイマを設定します。
    // 1ティックは1msです。
    tim6.arr.write(|w| w.arr().bits(ms));
#}

次に、カウンタを有効にする必要があります。有効化すると、すぐにカウントが開始します。


# #![allow(unused_variables)]
#fn main() {
    // CEN:カウンタを有効化します。
    tim6.cr1.modify(|_, w| w.cen().set_bit());
#}

今度は、カウンタが自動リロードレジスタの値(ms)に到達するまで待つ必要があります。すると、msミリ秒経過したことがわかります。 この状態は、更新イベントと呼ばれます。そして、これはステータスレジスタ(SR)のUIFビットによってわかります。


# #![allow(unused_variables)]
#fn main() {
    // アラームがオフになるまで(更新イベントが発生するまで)待ちます
    while !tim6.sr.read().uif().bit_is_set() {}
#}

ある条件が満たされるまで単純に待つようなパターン、今回の場合だとUIF1になる、はビジーウェイトと呼ばれます。 この言葉を、このテキスト内で何回か目にするでしょう:-)

最後に、UIFビットをクリア(0に設定)しなければなりません。もしこれを行わないと、次にdelay関数に入った時に、 更新イベントが既に発生しており、ビジーウェイト部分の実行を飛ばすことになります。


# #![allow(unused_variables)]
#fn main() {
    // 更新イベントフラグをクリアします
    tim6.sr.modify(|_, w| w.uif().clear_bit());
#}

では、ここまでの全てをまとめて、期待通り動くかどうか確認して下さい。