1use cast::u32;
2use cortex_m::peripheral::syst::SystClkSource;
3use cortex_m::peripheral::SYST;
4
5use hal::blocking::delay::{DelayMs, DelayUs};
6use sim::SystemIntegrationModule;
7
8pub struct Delay<'a> {
9 sim: &'a SystemIntegrationModule<'a>,
10 syst: SYST,
11}
12
13impl<'a> Delay<'a> {
14 pub fn new(mut syst: SYST, sim: &'a SystemIntegrationModule<'a>) -> Self {
15 syst.set_clock_source(SystClkSource::Core);
16
17 Delay { syst, sim }
18 }
19
20 pub fn free(self) -> SYST {
21 self.syst
22 }
23}
24
25impl<'a> DelayMs<u32> for Delay<'a> {
26 fn delay_ms(&mut self, ms: u32) {
27 self.delay_us(ms * 1_000);
28 }
29}
30
31impl<'a> DelayMs<u16> for Delay<'a> {
32 fn delay_ms(&mut self, ms: u16) {
33 self.delay_ms(u32(ms));
34 }
35}
36
37impl<'a> DelayMs<u8> for Delay<'a> {
38 fn delay_ms(&mut self, ms: u8) {
39 self.delay_ms(u32(ms));
40 }
41}
42
43impl<'a> DelayUs<u32> for Delay<'a> {
44 fn delay_us(&mut self, us: u32) {
45 let rvr = us * u32::from(self.sim.get_frequencies().0);
46
47 if rvr > (1 << 24) {
48 panic!("Delay must be between 1 and 0x00ffffff (1 << 24).");
49 }
50
51 self.syst.set_reload(rvr);
52 self.syst.clear_current();
53 self.syst.enable_counter();
54
55 while !self.syst.has_wrapped() {}
56
57 self.syst.disable_counter();
58 }
59}
60
61impl<'a> DelayUs<u16> for Delay<'a> {
62 fn delay_us(&mut self, us: u16) {
63 self.delay_us(u32(us))
64 }
65}
66
67impl<'a> DelayUs<u8> for Delay<'a> {
68 fn delay_us(&mut self, us: u8) {
69 self.delay_us(u32(us))
70 }
71}