繁忙等待

现在应该正确初始化计时器。剩下的就是使用计时器实现delay功能。

我们要做的第一件事是设置自动释放寄存器 (ARR) ,使计时器在ms内关闭。 因为计数器在1 KHz下工作,所以自动减速值将与ms相同。

#![allow(unused)] fn main() { // Set the timer to go off in `ms` ticks // 1 tick = 1 ms tim6.arr.write(|w| w.arr().bits(ms)); }

接下来,我们需要启用计数器。它将立即开始计数。

#![allow(unused)] fn main() { // CEN: Enable the counter tim6.cr1.modify(|_, w| w.cen().set_bit()); }

现在我们需要等待,直到计数器达到自动释放寄存器的值ms,然后我们就知道ms已经过去了。 该条件称为更新事件,由状态寄存器 (SR)的UIF位指示。

#![allow(unused)] fn main() { // Wait until the alarm goes off (until the update event occurs) while !tim6.sr.read().uif().bit_is_set() {} }

这种等待直到满足某个条件在这种情况下UIF变为1的模式被称为繁忙等待,您将在本文中多次看到:-)

最后,我们必须清除 (设置为0) 这个UIF位。如果没有,下次我们进入delay函数时,我们会认为更新 事件已经发生,并跳过繁忙的等待部分。

#![allow(unused)] fn main() { // Clear the update event flag tim6.sr.modify(|_, w| w.uif().clear_bit()); }

现在,把所有这些放在一起,检查它是否按预期工作。