#![allow(unsafe_op_in_unsafe_fn)]
#![no_std]
#![allow(unused_unsafe)]
#[cfg(not(any(
feature = "f301",
feature = "f302",
feature = "f303",
feature = "f373",
feature = "f3x4",
feature = "f401",
feature = "f405",
feature = "f407",
feature = "f410",
feature = "f411",
feature = "f412",
feature = "f413",
feature = "f427",
feature = "f429",
feature = "f446",
feature = "f469",
feature = "l4x1",
feature = "l4x2",
feature = "l412",
feature = "l4x3",
feature = "l4x5",
feature = "l4x6",
feature = "l552",
feature = "l562",
feature = "g030",
feature = "g031",
feature = "g041",
feature = "g050",
feature = "g051",
feature = "g061",
feature = "g070",
feature = "g071",
feature = "g081",
feature = "g0b0",
feature = "g0b1",
feature = "g0c1",
feature = "g431",
feature = "g441",
feature = "g471",
feature = "g473",
feature = "g474",
feature = "g483",
feature = "g484",
feature = "g491",
feature = "g4a1",
feature = "h503",
feature = "h562",
feature = "h563",
feature = "h573",
feature = "h735",
feature = "h743",
feature = "h743v",
feature = "h747cm4",
feature = "h747cm7",
feature = "h753",
feature = "h753v",
feature = "h7b3",
feature = "wb55",
feature = "wle5",
feature = "c011",
feature = "c031",
feature = "c071",
)))]
compile_error!("This crate requires an MCU-specifying feature to be enabled. eg `l552`.");
use cfg_if::cfg_if;
use cortex_m::{self, delay::Delay};
#[cfg(feature = "c011")]
pub use stm32c0::stm32c011 as pac;
#[cfg(feature = "c031")]
pub use stm32c0::stm32c031 as pac;
#[cfg(feature = "c071")]
pub use stm32c0::stm32c071 as pac;
#[cfg(feature = "f3x4")]
pub use stm32f3::stm32f3x4 as pac;
#[cfg(feature = "f301")]
pub use stm32f3::stm32f301 as pac;
#[cfg(feature = "f302")]
pub use stm32f3::stm32f302 as pac;
#[cfg(feature = "f303")]
pub use stm32f3::stm32f303 as pac;
#[cfg(feature = "f373")]
pub use stm32f3::stm32f373 as pac;
#[cfg(feature = "f401")]
pub use stm32f4::stm32f401 as pac;
#[cfg(feature = "f405")]
pub use stm32f4::stm32f405 as pac;
#[cfg(feature = "f407")]
pub use stm32f4::stm32f407 as pac;
#[cfg(feature = "f410")]
pub use stm32f4::stm32f410 as pac;
#[cfg(feature = "f411")]
pub use stm32f4::stm32f411 as pac;
#[cfg(feature = "f412")]
pub use stm32f4::stm32f412 as pac;
#[cfg(feature = "f413")]
pub use stm32f4::stm32f413 as pac;
#[cfg(feature = "f427")]
pub use stm32f4::stm32f427 as pac;
#[cfg(feature = "f429")]
pub use stm32f4::stm32f429 as pac;
#[cfg(feature = "f446")]
pub use stm32f4::stm32f446 as pac;
#[cfg(feature = "f469")]
pub use stm32f4::stm32f469 as pac;
#[cfg(feature = "g0b0")]
pub use stm32g0::stm32g0b0 as pac;
#[cfg(feature = "g0b1")]
pub use stm32g0::stm32g0b1 as pac;
#[cfg(feature = "g0c1")]
pub use stm32g0::stm32g0c1 as pac;
#[cfg(feature = "g030")]
pub use stm32g0::stm32g030 as pac;
#[cfg(feature = "g031")]
pub use stm32g0::stm32g031 as pac;
#[cfg(feature = "g041")]
pub use stm32g0::stm32g041 as pac;
#[cfg(feature = "g050")]
pub use stm32g0::stm32g050 as pac;
#[cfg(feature = "g051")]
pub use stm32g0::stm32g051 as pac;
#[cfg(feature = "g061")]
pub use stm32g0::stm32g061 as pac;
#[cfg(feature = "g070")]
pub use stm32g0::stm32g070 as pac;
#[cfg(feature = "g071")]
pub use stm32g0::stm32g071 as pac;
#[cfg(feature = "g081")]
pub use stm32g0::stm32g081 as pac;
#[cfg(feature = "g4a1")]
pub use stm32g4::stm32g4a1 as pac;
#[cfg(feature = "g431")]
pub use stm32g4::stm32g431 as pac;
#[cfg(feature = "g441")]
pub use stm32g4::stm32g441 as pac;
#[cfg(feature = "g471")]
pub use stm32g4::stm32g471 as pac;
#[cfg(feature = "g473")]
pub use stm32g4::stm32g473 as pac;
#[cfg(feature = "g474")]
pub use stm32g4::stm32g474 as pac;
#[cfg(feature = "g483")]
pub use stm32g4::stm32g483 as pac;
#[cfg(feature = "g484")]
pub use stm32g4::stm32g484 as pac;
#[cfg(feature = "g491")]
pub use stm32g4::stm32g491 as pac;
#[cfg(feature = "h503")]
pub use stm32h5::stm32h503 as pac;
#[cfg(feature = "h562")]
pub use stm32h5::stm32h562 as pac;
#[cfg(feature = "h563")]
pub use stm32h5::stm32h563 as pac;
#[cfg(feature = "h573")]
pub use stm32h5::stm32h573 as pac;
#[cfg(feature = "h7b3")]
pub use stm32h7::stm32h7b3 as pac;
#[cfg(feature = "h735")]
pub use stm32h7::stm32h735 as pac;
#[cfg(feature = "h743")]
pub use stm32h7::stm32h743 as pac;
#[cfg(feature = "h743v")]
pub use stm32h7::stm32h743v as pac;
#[cfg(feature = "h747cm4")]
pub use stm32h7::stm32h747cm4 as pac;
#[cfg(feature = "h747cm7")]
pub use stm32h7::stm32h747cm7 as pac;
#[cfg(feature = "h753")]
pub use stm32h7::stm32h753 as pac;
#[cfg(feature = "h753v")]
pub use stm32h7::stm32h753v as pac;
#[cfg(feature = "l4x1")]
pub use stm32l4::stm32l4x1 as pac;
#[cfg(feature = "l4x2")]
pub use stm32l4::stm32l4x2 as pac;
#[cfg(feature = "l4x3")]
pub use stm32l4::stm32l4x3 as pac;
#[cfg(feature = "l4x5")]
pub use stm32l4::stm32l4x5 as pac;
#[cfg(feature = "l4x6")]
pub use stm32l4::stm32l4x6 as pac;
#[cfg(feature = "l412")]
pub use stm32l4::stm32l412 as pac;
#[cfg(feature = "l552")]
pub use stm32l5::stm32l552 as pac;
#[cfg(feature = "l562")]
pub use stm32l5::stm32l562 as pac;
#[cfg(feature = "wb55")]
pub use stm32wb::stm32wb55 as pac;
#[cfg(feature = "wle5")]
pub use stm32wl::stm32wle5 as pac;
pub mod macros;
#[cfg(not(any(feature = "f301", feature = "f302", feature = "c0")))]
pub mod adc;
#[cfg(all(any(feature = "can_bx", feature = "can_fd_g", feature = "can_fd_h"),))]
pub mod can;
pub mod clocks;
#[cfg(not(any(feature = "f", feature = "wb", feature = "wl",)))]
pub mod crc;
#[cfg(not(any(
feature = "f401",
feature = "f411",
feature = "f412",
feature = "l412",
feature = "wb",
feature = "g0",
feature = "c0",
)))]
pub mod dac;
#[cfg(not(any(
feature = "f",
feature = "l4x1",
feature = "l4x2",
feature = "l412",
feature = "l4x3",
feature = "l4x5",
feature = "g0",
feature = "g4",
feature = "wb",
feature = "wl",
feature = "h5", // todo: Check PAC and impl A/R.
feature = "c0",
// todo: DFSDM support for other platforms that don't support clustering
)))]
pub mod dfsdm;
#[cfg(not(feature = "f4"))]
pub mod dma;
pub mod error;
pub use error::Error;
#[cfg(all(feature = "h7", feature = "net"))]
pub mod ethernet;
#[cfg(not(feature = "h735"))]
pub mod flash;
pub mod gpio;
#[cfg(feature = "wb")]
pub mod hsem;
#[cfg(not(any(feature = "f4")))]
pub mod i2c;
#[cfg(feature = "f4")]
pub mod i2c_f4;
#[cfg(feature = "f4")]
pub use i2c_f4 as i2c;
#[cfg(feature = "wb")]
pub mod ipcc;
pub mod iwdg;
pub mod low_power;
#[cfg(any(feature = "h747cm4", feature = "h747cm7"))]
pub mod power;
#[cfg(not(any(
feature = "f",
feature = "l4x3", // todo: PAC bug?
feature = "g0",
feature = "g431",
feature = "g441",
feature = "g471",
feature = "g491",
feature = "g4a1",
feature = "wl",
feature = "l5", // todo: PAC errors on some regs.
feature = "h5",
feature = "c0",
)))]
pub mod qspi;
#[cfg(not(any(feature = "f", feature = "g0", feature = "c0",)))]
pub mod rng;
pub mod rtc;
#[cfg(not(any(
feature = "f",
feature = "g0",
feature = "h7b3",
feature = "wl",
feature = "h5", // todo
feature = "c0", // todo
feature = "l412",
)))]
pub mod sai;
#[cfg(not(feature = "f301"))]
pub mod spi;
pub mod timer;
pub mod usart;
#[cfg(not(any(
feature = "f",
feature = "l",
feature = "g0",
feature = "wl",
feature = "c0"
)))]
pub mod lpuart;
cfg_if! {
if #[cfg(all(
feature = "usb",
all(
any(
feature = "f303",
feature = "l4x2",
feature = "l412",
feature = "l4x3",
feature = "l4x5",
feature = "l5",
feature = "g4",
feature = "wb",
feature = "c071", // Only C071 from C0 has USB.
),
not(feature = "g4a1"))
))] {
pub mod usb;
} else if #[cfg(all(
// H7 has HS (high-speed), while F4 and L4 have FS. The names get confusing, starting
// on ST's side.
any(feature = "usbotg_fs", feature = "usbotg_hs"),
any(feature = "f4", feature = "l4x6", feature = "h7"),
not(feature = "f410")
))] {
pub mod usb_otg;
pub use usb_otg as usb;
}
}
pub mod instant;
mod util;
pub use util::{BaudPeriph, RccPeriph};
#[cfg(not(any(feature = "g0", feature = "c0", feature = "h747cm4")))]
pub fn debug_workaround() {
let dbgmcu = unsafe { &(*pac::DBGMCU::ptr()) };
cfg_if! {
if #[cfg(all(feature = "h7", not(any(feature = "h747cm4", feature = "h747cm7"))))] {
dbgmcu.cr().modify(|_, w| w.dbgsleep_d1().bit(true));
dbgmcu.cr().modify(|_, w| w.dbgstop_d1().bit(true));
dbgmcu.cr().modify(|_, w| w.dbgstby_d1().bit(true));
} else if #[cfg(feature = "h7")] {
dbgmcu.cr().modify(|_, w| w.dbgslpd1().bit(true));
dbgmcu.cr().modify(|_, w| w.dbgstpd1().bit(true));
dbgmcu.cr().modify(|_, w| w.dbgstbd1().bit(true));
} else {
#[cfg(not(any(feature = "l5", feature = "h5")))]
dbgmcu.cr().modify(|_, w| w.dbg_sleep().bit(true));
dbgmcu.cr().modify(|_, w| w.dbg_stop().bit(true));
dbgmcu.cr().modify(|_, w| w.dbg_standby().bit(true));
}
}
let rcc = unsafe { &(*pac::RCC::ptr()) };
cfg_if! {
if #[cfg(feature = "f3")] {
rcc.ahbenr().modify(|_, w| w.dma1en().bit(true));
} else if #[cfg(feature = "h5")] {
rcc.ahb1enr().modify(|_, w| w.gpdma1en().bit(true));
} else {
rcc.ahb1enr().modify(|_, w| w.dma1en().bit(true));
}
}
}
pub fn delay_ms(num_ms: u32, ahb_freq: u32) {
let cp = unsafe { cortex_m::Peripherals::steal() };
let mut delay = Delay::new(cp.SYST, ahb_freq);
delay.delay_ms(num_ms);
}
pub fn delay_us(num_us: u32, ahb_freq: u32) {
let cp = unsafe { cortex_m::Peripherals::steal() };
let mut delay = Delay::new(cp.SYST, ahb_freq);
delay.delay_us(num_us);
}
pub mod prelude {
pub use crate::{
access_global, access_globals, copy_be, copy_le, init_globals, make_globals,
make_simple_globals, parse_be, parse_le, setup_nvic,
};
}