|
| 1 | +//! Delay implementation based on general-purpose 32 bit timers and System timer (SysTick). |
| 2 | +//! |
| 3 | +//! TIM2 and TIM5 are a general purpose 32-bit auto-reload up/downcounter with |
| 4 | +//! a 16-bit prescaler. |
| 5 | +
|
| 6 | +use core::convert::Infallible; |
| 7 | +use embedded_hal::delay::DelayNs; |
| 8 | + |
| 9 | +use super::{Delay, Instance, PwmChannel, SysDelay, WithPwm}; |
| 10 | +use fugit::ExtU32Ceil; |
| 11 | + |
| 12 | +impl DelayNs for SysDelay { |
| 13 | + fn delay_ns(&mut self, ns: u32) { |
| 14 | + self.delay(ns.nanos_at_least()); |
| 15 | + } |
| 16 | + |
| 17 | + fn delay_ms(&mut self, ms: u32) { |
| 18 | + self.delay(ms.millis_at_least()); |
| 19 | + } |
| 20 | +} |
| 21 | + |
| 22 | +impl<TIM: Instance, const FREQ: u32> DelayNs for Delay<TIM, FREQ> { |
| 23 | + fn delay_ns(&mut self, ns: u32) { |
| 24 | + self.delay(ns.micros_at_least()); |
| 25 | + } |
| 26 | + |
| 27 | + fn delay_us(&mut self, us: u32) { |
| 28 | + self.delay(us.micros_at_least()); |
| 29 | + } |
| 30 | + |
| 31 | + fn delay_ms(&mut self, ms: u32) { |
| 32 | + self.delay(ms.millis_at_least()); |
| 33 | + } |
| 34 | +} |
| 35 | + |
| 36 | +impl<TIM: Instance + WithPwm, const C: u8> embedded_hal::pwm::ErrorType for PwmChannel<TIM, C> { |
| 37 | + type Error = Infallible; |
| 38 | +} |
| 39 | + |
| 40 | +impl<TIM: Instance + WithPwm, const C: u8> embedded_hal::pwm::SetDutyCycle for PwmChannel<TIM, C> { |
| 41 | + fn max_duty_cycle(&self) -> u16 { |
| 42 | + self.get_max_duty() |
| 43 | + } |
| 44 | + fn set_duty_cycle(&mut self, duty: u16) -> Result<(), Self::Error> { |
| 45 | + self.set_duty(duty); |
| 46 | + Ok(()) |
| 47 | + } |
| 48 | +} |
0 commit comments