k210-hal
k210-hal copied to clipboard
Implement `Timer` trait in embedded_hal for Channels in hardware timer
This pr implement Timer
trait in embedded_hal
for each CHANNEL
in a TIMER
, which supports a nicer way to create delays.
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()
}
}