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

ビジーウェイティング

タイマーはこれで正しく初期化されているはずです。あとは、このタイマーを使って delay 関数 を実装するだけです。

最初に行う必要があるのは、自動再ロードレジスタ (ARR) を設定して、タイマーが ms ミリ秒後に発生するようにすることです。カウンターは 1 KHz で動作するため、自動再ロード値は ms と同じになります。

#![allow(unused)]
fn main() {
    // タイマーが `ms` ティック後に発生するように設定する
    // 1 ティック = 1 ms
    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() {}
}

このように、何らかの条件が満たされるまでただ待つ、今回でいえば UIF1 になるまで待つ パターンは ビジーウェイティング と呼ばれ、このテキストでもあと何度か登場します :-).

最後に、この UIF ビットをクリア(0 に設定)しなければなりません。そうしないと、次に delay 関数に入ったとき、更新イベントがすでに発生したものとみなして、ビジーウェイティングの部分を スキップしてしまいます。

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

では、これらをすべてまとめて、期待どおりに動作するか確認してください。