stm32: Add standard crate-wide macros for pin/dma traits, switch all drivers to use them.

This commit is contained in:
Dario Nieuwenhuis
2022-02-10 21:38:03 +01:00
parent 9d682aa1fa
commit b99ab3d5d9
26 changed files with 913 additions and 1781 deletions

View File

@ -1,11 +1,3 @@
#[cfg(feature = "unstable-pac")]
#[macro_use]
pub mod pins;
#[cfg(not(feature = "unstable-pac"))]
#[macro_use]
pub(crate) mod pins;
pub mod simple_pwm;
#[cfg(feature = "unstable-pac")]
@ -62,7 +54,7 @@ impl From<OutputCompareMode> for stm32_metapac::timer::vals::Ocm {
pub(crate) mod sealed {
use super::*;
pub trait CaptureCompareCapable16bitInstance: crate::timer::sealed::Basic16bitInstance {
pub trait CaptureCompare16bitInstance: crate::timer::sealed::Basic16bitInstance {
unsafe fn set_output_compare_mode(&mut self, channel: Channel, mode: OutputCompareMode);
unsafe fn enable_channel(&mut self, channel: Channel, enable: bool);
@ -72,7 +64,7 @@ pub(crate) mod sealed {
unsafe fn get_max_compare_value(&self) -> u16;
}
pub trait CaptureCompareCapable32bitInstance:
pub trait CaptureCompare32bitInstance:
crate::timer::sealed::GeneralPurpose32bitInstance
{
unsafe fn set_output_compare_mode(&mut self, channel: Channel, mode: OutputCompareMode);
@ -85,19 +77,22 @@ pub(crate) mod sealed {
}
}
pub trait CaptureCompareCapable16bitInstance:
sealed::CaptureCompareCapable16bitInstance + crate::timer::Basic16bitInstance + 'static
pub trait CaptureCompare16bitInstance:
sealed::CaptureCompare16bitInstance + crate::timer::Basic16bitInstance + 'static
{
}
pub trait CaptureCompareCapable32bitInstance:
sealed::CaptureCompareCapable32bitInstance + crate::timer::GeneralPurpose32bitInstance + 'static
pub trait CaptureCompare32bitInstance:
sealed::CaptureCompare32bitInstance
+ CaptureCompare16bitInstance
+ crate::timer::GeneralPurpose32bitInstance
+ 'static
{
}
#[allow(unused)]
macro_rules! impl_compare_capable_16bit {
($inst:ident) => {
impl crate::pwm::sealed::CaptureCompareCapable16bitInstance for crate::peripherals::$inst {
impl crate::pwm::sealed::CaptureCompare16bitInstance for crate::peripherals::$inst {
unsafe fn set_output_compare_mode(
&mut self,
channel: crate::pwm::Channel,
@ -134,7 +129,7 @@ macro_rules! impl_compare_capable_16bit {
crate::pac::interrupts! {
($inst:ident, timer, TIM_GP16, UP, $irq:ident) => {
impl crate::pwm::sealed::CaptureCompareCapable16bitInstance for crate::peripherals::$inst {
impl crate::pwm::sealed::CaptureCompare16bitInstance for crate::peripherals::$inst {
unsafe fn set_output_compare_mode(
&mut self,
channel: crate::pwm::Channel,
@ -167,14 +162,14 @@ crate::pac::interrupts! {
}
}
impl CaptureCompareCapable16bitInstance for crate::peripherals::$inst {
impl CaptureCompare16bitInstance for crate::peripherals::$inst {
}
};
($inst:ident, timer, TIM_GP32, UP, $irq:ident) => {
impl_compare_capable_16bit!($inst);
impl crate::pwm::sealed::CaptureCompareCapable32bitInstance for crate::peripherals::$inst {
impl crate::pwm::sealed::CaptureCompare32bitInstance for crate::peripherals::$inst {
unsafe fn set_output_compare_mode(
&mut self,
channel: crate::pwm::Channel,
@ -200,16 +195,16 @@ crate::pac::interrupts! {
self.regs_gp32().arr().read().arr() as u32
}
}
impl CaptureCompareCapable16bitInstance for crate::peripherals::$inst {
impl CaptureCompare16bitInstance for crate::peripherals::$inst {
}
impl CaptureCompareCapable32bitInstance for crate::peripherals::$inst {
impl CaptureCompare32bitInstance for crate::peripherals::$inst {
}
};
($inst:ident, timer, TIM_ADV, UP, $irq:ident) => {
impl crate::pwm::sealed::CaptureCompareCapable16bitInstance for crate::peripherals::$inst {
impl crate::pwm::sealed::CaptureCompare16bitInstance for crate::peripherals::$inst {
unsafe fn set_output_compare_mode(
&mut self,
channel: crate::pwm::Channel,
@ -242,56 +237,72 @@ crate::pac::interrupts! {
}
}
impl CaptureCompareCapable16bitInstance for crate::peripherals::$inst {
impl CaptureCompare16bitInstance for crate::peripherals::$inst {
}
};
}
pin_trait!(Channel1Pin, CaptureCompare16bitInstance);
pin_trait!(Channel1ComplementaryPin, CaptureCompare16bitInstance);
pin_trait!(Channel2Pin, CaptureCompare16bitInstance);
pin_trait!(Channel2ComplementaryPin, CaptureCompare16bitInstance);
pin_trait!(Channel3Pin, CaptureCompare16bitInstance);
pin_trait!(Channel3ComplementaryPin, CaptureCompare16bitInstance);
pin_trait!(Channel4Pin, CaptureCompare16bitInstance);
pin_trait!(Channel4ComplementaryPin, CaptureCompare16bitInstance);
pin_trait!(ExternalTriggerPin, CaptureCompare16bitInstance);
pin_trait!(BreakInputPin, CaptureCompare16bitInstance);
pin_trait!(BreakInputComparator1Pin, CaptureCompare16bitInstance);
pin_trait!(BreakInputComparator2Pin, CaptureCompare16bitInstance);
pin_trait!(BreakInput2Pin, CaptureCompare16bitInstance);
pin_trait!(BreakInput2Comparator1Pin, CaptureCompare16bitInstance);
pin_trait!(BreakInput2Comparator2Pin, CaptureCompare16bitInstance);
crate::pac::peripheral_pins!(
($inst:ident, timer, $block:ident, $pin:ident, CH1, $af:expr) => {
impl_pin!($inst, Channel1Pin, $pin, $af);
pin_trait_impl!(Channel1Pin, $inst, $pin, $af);
};
($inst:ident, timer, $block:ident, $pin:ident, CH1N, $af:expr) => {
impl_pin!($inst, Channel1ComplementaryPin, $pin, $af);
pin_trait_impl!(Channel1ComplementaryPin, $inst, $pin, $af);
};
($inst:ident, timer, $block:ident, $pin:ident, CH2, $af:expr) => {
impl_pin!($inst, Channel2Pin, $pin, $af);
pin_trait_impl!(Channel2Pin, $inst, $pin, $af);
};
($inst:ident, timer, $block:ident, $pin:ident, CH2N, $af:expr) => {
impl_pin!($inst, Channel2ComplementaryPin, $pin, $af);
pin_trait_impl!(Channel2ComplementaryPin, $inst, $pin, $af);
};
($inst:ident, timer, $block:ident, $pin:ident, CH3, $af:expr) => {
impl_pin!($inst, Channel3Pin, $pin, $af);
pin_trait_impl!(Channel3Pin, $inst, $pin, $af);
};
($inst:ident, timer, $block:ident, $pin:ident, CH3N, $af:expr) => {
impl_pin!($inst, Channel3ComplementaryPin, $pin, $af);
pin_trait_impl!(Channel3ComplementaryPin, $inst, $pin, $af);
};
($inst:ident, timer, $block:ident, $pin:ident, CH4, $af:expr) => {
impl_pin!($inst, Channel4Pin, $pin, $af);
pin_trait_impl!(Channel4Pin, $inst, $pin, $af);
};
($inst:ident, timer, $block:ident, $pin:ident, CH4N, $af:expr) => {
impl_pin!($inst, Channel4ComplementaryPin, $pin, $af);
pin_trait_impl!(Channel4ComplementaryPin, $inst, $pin, $af);
};
($inst:ident, timer, $block:ident, $pin:ident, ETR, $af:expr) => {
impl_pin!($inst, ExternalTriggerPin, $pin, $af);
pin_trait_impl!(ExternalTriggerPin, $inst, $pin, $af);
};
($inst:ident, timer, $block:ident, $pin:ident, BKIN, $af:expr) => {
impl_pin!($inst, BreakInputPin, $pin, $af);
pin_trait_impl!(BreakInputPin, $inst, $pin, $af);
};
($inst:ident, timer, $block:ident, $pin:ident, BKIN_COMP1, $af:expr) => {
impl_pin!($inst, BreakInputComparator1Pin, $pin, $af);
pin_trait_impl!(BreakInputComparator1Pin, $inst, $pin, $af);
};
($inst:ident, timer, $block:ident, $pin:ident, BKIN_COMP2, $af:expr) => {
impl_pin!($inst, BreakInputComparator2Pin, $pin, $af);
pin_trait_impl!(BreakInputComparator2Pin, $inst, $pin, $af);
};
($inst:ident, timer, $block:ident, $pin:ident, BKIN2, $af:expr) => {
impl_pin!($inst, BreakInput2Pin, $pin, $af);
pin_trait_impl!(BreakInput2Pin, $inst, $pin, $af);
};
($inst:ident, timer, $block:ident, $pin:ident, BKIN2_COMP1, $af:expr) => {
impl_pin!($inst, BreakInput2Comparator1Pin, $pin, $af);
pin_trait_impl!(BreakInput2Comparator1Pin, $inst, $pin, $af);
};
($inst:ident, timer, $block:ident, $pin:ident, BKIN2_COMP2, $af:expr) => {
impl_pin!($inst, BreakInput2Comparator2Pin, $pin, $af);
pin_trait_impl!(BreakInput2Comparator2Pin, $inst, $pin, $af);
};
);