Add MCO support for stm32wl family
This commit is contained in:
@ -4,14 +4,18 @@ use embassy_hal_internal::into_ref;
|
||||
|
||||
use crate::gpio::sealed::AFType;
|
||||
use crate::gpio::Speed;
|
||||
#[cfg(not(stm32wl))]
|
||||
pub use crate::pac::rcc::vals::{Mco1 as Mco1Source, Mco2 as Mco2Source};
|
||||
#[cfg(stm32wl)]
|
||||
pub use crate::pac::rcc::vals::{Mcopre, Mcosel};
|
||||
use crate::pac::RCC;
|
||||
use crate::{peripherals, Peripheral};
|
||||
|
||||
pub(crate) mod sealed {
|
||||
pub trait McoInstance {
|
||||
type Source;
|
||||
unsafe fn apply_clock_settings(source: Self::Source, prescaler: u8);
|
||||
type Prescaler;
|
||||
unsafe fn apply_clock_settings(source: Self::Source, prescaler: Self::Prescaler);
|
||||
}
|
||||
}
|
||||
|
||||
@ -20,11 +24,12 @@ pub trait McoInstance: sealed::McoInstance + 'static {}
|
||||
pin_trait!(McoPin, McoInstance);
|
||||
|
||||
macro_rules! impl_peri {
|
||||
($peri:ident, $source:ident, $set_source:ident, $set_prescaler:ident) => {
|
||||
($peri:ident, $source:ident, $prescaler:ident, $set_source:ident, $set_prescaler:ident) => {
|
||||
impl sealed::McoInstance for peripherals::$peri {
|
||||
type Source = $source;
|
||||
type Prescaler = $prescaler;
|
||||
|
||||
unsafe fn apply_clock_settings(source: Self::Source, prescaler: u8) {
|
||||
unsafe fn apply_clock_settings(source: Self::Source, prescaler: Self::Prescaler) {
|
||||
RCC.cfgr().modify(|w| {
|
||||
w.$set_source(source);
|
||||
w.$set_prescaler(prescaler);
|
||||
@ -36,8 +41,12 @@ macro_rules! impl_peri {
|
||||
};
|
||||
}
|
||||
|
||||
impl_peri!(MCO1, Mco1Source, set_mco1, set_mco1pre);
|
||||
impl_peri!(MCO2, Mco2Source, set_mco2, set_mco2pre);
|
||||
#[cfg(not(stm32wl))]
|
||||
impl_peri!(MCO1, Mco1Source, u8, set_mco1, set_mco1pre);
|
||||
#[cfg(not(stm32wl))]
|
||||
impl_peri!(MCO2, Mco2Source, u8, set_mco2, set_mco2pre);
|
||||
#[cfg(stm32wl)]
|
||||
impl_peri!(MCO, Mcosel, Mcopre, set_mcosel, set_mcopre);
|
||||
|
||||
pub struct Mco<'d, T: McoInstance> {
|
||||
phantom: PhantomData<&'d mut T>,
|
||||
@ -46,15 +55,16 @@ pub struct Mco<'d, T: McoInstance> {
|
||||
impl<'d, T: McoInstance> Mco<'d, T> {
|
||||
/// Create a new MCO instance.
|
||||
///
|
||||
/// `prescaler` must be between 1 and 15.
|
||||
/// `prescaler` must be between 1 and 15 for implementations not using Presel enum.
|
||||
pub fn new(
|
||||
_peri: impl Peripheral<P = T> + 'd,
|
||||
pin: impl Peripheral<P = impl McoPin<T>> + 'd,
|
||||
source: T::Source,
|
||||
prescaler: u8,
|
||||
prescaler: T::Prescaler,
|
||||
) -> Self {
|
||||
into_ref!(pin);
|
||||
|
||||
#[cfg(not(stm32wl))]
|
||||
assert!(
|
||||
1 <= prescaler && prescaler <= 15,
|
||||
"Mco prescaler must be between 1 and 15. Refer to the reference manual for more information."
|
||||
|
Reference in New Issue
Block a user