ビジーウェイティング
タイマーはこれで正しく初期化されているはずです。あとは、このタイマーを使って 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() {}
}
このように、何らかの条件が満たされるまでただ待つ、今回でいえば UIF が 1 になるまで待つ
パターンは ビジーウェイティング と呼ばれ、このテキストでもあと何度か登場します :-).
最後に、この UIF ビットをクリア(0 に設定)しなければなりません。そうしないと、次に delay
関数に入ったとき、更新イベントがすでに発生したものとみなして、ビジーウェイティングの部分を
スキップしてしまいます。
#![allow(unused)]
fn main() {
// 更新イベントフラグをクリアする
tim6.sr.modify(|_, w| w.uif().clear_bit());
}
では、これらをすべてまとめて、期待どおりに動作するか確認してください。