k210-hal icon indicating copy to clipboard operation
k210-hal copied to clipboard

Implement `Timer` trait in embedded_hal for Channels in hardware timer

Open longfangsong opened this issue 3 years ago • 1 comments

This pr implement Timer trait in embedded_hal for each CHANNEL in a TIMER, which supports a nicer way to create delays.

longfangsong avatar Feb 13 '21 08:02 longfangsong

Use example:

#![allow(warnings)]
#![no_std]
#![no_main]

use core::mem;
use core::sync::atomic::{compiler_fence, Ordering};
use k210_hal::fpioa;
use k210_hal::pac;
use k210_hal::pac::{sysctl, SYSCTL, TIMER0};
use k210_hal::prelude::*;
use k210_hal::stdout::Stdout;
use k210_hal::timer::Timer0;
use panic_halt as _;

#[riscv_rt::entry]
fn main() -> ! {
    let p = pac::Peripherals::take().unwrap();
    let mut sysctl = p.SYSCTL.constrain();
    // Prepare pins for UARTHS
    let fpioa = p.FPIOA.split(&mut sysctl.apb0);
    let _io5 = fpioa.io5.into_function(fpioa::UARTHS_TX);

    // Configure clocks (TODO)
    let clocks = sysctl.clocks();

    // Configure UART
    let serial = p.UARTHS.configure(115_200.bps(), &clocks);
    let (mut tx, _) = serial.split();

    // todo: new stdout design (simple Write impl?)
    let mut stdout = Stdout(&mut tx);
    let mut timer0 = sysctl.timer0;
    timer0.set_frequency(1.khz());
    let mut timer = Timer0::new(&p.TIMER0, 0, &mut timer0, &mut sysctl.apb0);
    loop {
        for _ in 0..60 {
            timer
                .try_start(1.hz())
                .unwrap_or_else(|_| writeln!(stdout, "Start failed").unwrap());
            while timer.try_wait().is_err() {
                compiler_fence(Ordering::SeqCst);
            }
        }
        writeln!(stdout, "+60s").unwrap()
    }
}

longfangsong avatar Feb 13 '21 08:02 longfangsong