Initialization

As with every other peripheral, we'll have to initialize this timer before we can use it. And just as in the previous section, initialization is going to involve two steps: powering up the timer and then configuring it.

Powering up the timer is easy: We just have to set TIM6EN bit to 1. This bit is in the APB1ENR register of the RCC register block.

#![allow(unused)]
fn main() {
    // Power on the TIM6 timer
    rcc.apb1enr.modify(|_, w| w.tim6en().set_bit());
}

The configuration part is slightly more elaborate.

First, we'll have to configure the timer to operate in one pulse mode.

#![allow(unused)]
fn main() {
    // OPM Select one pulse mode
    // CEN Keep the counter disabled for now
    tim6.cr1.write(|w| w.opm().set_bit().cen().clear_bit());
}

Then, we'll like to have the CNT counter operate at a frequency of 1 KHz because our delay function takes a number of milliseconds as arguments and 1 KHz produces a 1 millisecond period. For that we'll have to configure the prescaler.

#![allow(unused)]
fn main() {
    // Configure the prescaler to have the counter operate at 1 KHz
    tim6.psc.write(|w| w.psc().bits(psc));
}

I'm going to let you figure out the value of the prescaler, psc. Remember that the frequency of the counter is apb1 / (psc + 1) and that apb1 is 8 MHz.