use embassy_hal_internal::{Peri, PeripheralType};
use pac::peripherals::tpm::TPM;
use crate::pac;
pub mod pwm;
#[cfg(feature = "dma")]
pub mod ringbuffered;
pub use pwm::{Pwm, PwmChannel};
#[cfg(feature = "dma")]
pub use ringbuffered::{
CaptureEdge, CaptureTransfer, InputCapture, PwmTransfer, RingBufferedCapture, RingBufferedPwm,
};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Channel {
Ch0,
Ch1,
Ch2,
Ch3,
}
impl Channel {
pub(crate) const fn index(self) -> usize {
match self {
Self::Ch0 => 0,
Self::Ch1 => 1,
Self::Ch2 => 2,
Self::Ch3 => 3,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum TimerId {
Tpm1,
Tpm2,
Tpm3,
Tpm4,
Tpm5,
Tpm6,
}
pub(crate) trait SealedInstance {
fn regs() -> TPM;
}
#[allow(private_bounds)]
pub trait Instance: SealedInstance + PeripheralType {
const IRQ: Option<u16>;
const ID: TimerId;
}
macro_rules! impl_tpm {
($instance:ident, $base:expr, $id:ident, $irq:expr) => {
impl crate::timer::SealedInstance for crate::peripherals::$instance {
#[inline]
fn regs() -> crate::pac::peripherals::tpm::TPM {
unsafe { crate::pac::peripherals::tpm::TPM::from_ptr($base as *mut ()) }
}
}
impl crate::timer::Instance for crate::peripherals::$instance {
const IRQ: ::core::option::Option<u16> = $irq;
const ID: crate::timer::TimerId = crate::timer::TimerId::$id;
}
};
}
pub(crate) use impl_tpm;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Polarity {
ActiveHigh,
ActiveLow,
}
pub struct Timer {
tpm: TPM,
clock_hz: u32,
#[cfg(feature = "dma")]
id: TimerId,
}
impl Timer {
pub fn new<T: Instance>(peri: Peri<'static, T>, clock_hz: u32) -> Self {
assert!(clock_hz > 0, "timer clock must be non-zero");
let _ = peri;
Self {
tpm: T::regs(),
clock_hz,
#[cfg(feature = "dma")]
id: T::ID,
}
}
#[cfg(test)]
pub(crate) fn over(tpm: TPM, clock_hz: u32, id: TimerId) -> Self {
#[cfg(not(feature = "dma"))]
let _ = id;
Self {
tpm,
clock_hz,
#[cfg(feature = "dma")]
id,
}
}
pub fn into_pwm(self, freq_hz: u32) -> Pwm {
Pwm::new(self, freq_hz)
}
pub const fn clock_hz(&self) -> u32 {
self.clock_hz
}
pub(crate) const fn regs(&self) -> TPM {
self.tpm
}
#[cfg(feature = "dma")]
pub(crate) fn id(&self) -> TimerId {
self.id
}
}