diff --git a/embassy-stm32/src/lib.rs b/embassy-stm32/src/lib.rs index 7df5f9246..a58bc3697 100644 --- a/embassy-stm32/src/lib.rs +++ b/embassy-stm32/src/lib.rs @@ -65,14 +65,7 @@ pub use generated::{peripherals, Peripherals}; #[non_exhaustive] pub struct Config { - rcc: rcc::Config, -} - -impl Config { - pub fn rcc(mut self, rcc: rcc::Config) -> Self { - self.rcc = rcc; - self - } + pub rcc: rcc::Config, } impl Default for Config { diff --git a/embassy-stm32/src/rcc/h7/mod.rs b/embassy-stm32/src/rcc/h7/mod.rs index 70632f280..2d9602a34 100644 --- a/embassy-stm32/src/rcc/h7/mod.rs +++ b/embassy-stm32/src/rcc/h7/mod.rs @@ -68,83 +68,7 @@ pub struct Config { pub pll1: PllConfig, pub pll2: PllConfig, pub pll3: PllConfig, -} - -impl Config { - pub fn sys_ck<T: Into<Hertz>>(mut self, freq: T) -> Self { - self.sys_ck = Some(freq.into()); - self - } - - pub fn per_ck<T: Into<Hertz>>(mut self, freq: T) -> Self { - self.per_ck = Some(freq.into()); - self - } - - pub fn pclk1<T: Into<Hertz>>(mut self, freq: T) -> Self { - self.pclk1 = Some(freq.into()); - self - } - - pub fn pclk2<T: Into<Hertz>>(mut self, freq: T) -> Self { - self.pclk2 = Some(freq.into()); - self - } - - pub fn pclk3<T: Into<Hertz>>(mut self, freq: T) -> Self { - self.pclk3 = Some(freq.into()); - self - } - - pub fn pclk4<T: Into<Hertz>>(mut self, freq: T) -> Self { - self.pclk4 = Some(freq.into()); - self - } - - pub fn pll1_p<T: Into<Hertz>>(mut self, freq: T) -> Self { - self.pll1.p_ck = Some(freq.into()); - self - } - - pub fn pll1_q<T: Into<Hertz>>(mut self, freq: T) -> Self { - self.pll1.q_ck = Some(freq.into()); - self - } - - pub fn pll1_r<T: Into<Hertz>>(mut self, freq: T) -> Self { - self.pll1.r_ck = Some(freq.into()); - self - } - - pub fn pll2_p<T: Into<Hertz>>(mut self, freq: T) -> Self { - self.pll2.p_ck = Some(freq.into()); - self - } - - pub fn pll2_q<T: Into<Hertz>>(mut self, freq: T) -> Self { - self.pll2.q_ck = Some(freq.into()); - self - } - - pub fn pll2_r<T: Into<Hertz>>(mut self, freq: T) -> Self { - self.pll2.r_ck = Some(freq.into()); - self - } - - pub fn pll3_p<T: Into<Hertz>>(mut self, freq: T) -> Self { - self.pll3.p_ck = Some(freq.into()); - self - } - - pub fn pll3_q<T: Into<Hertz>>(mut self, freq: T) -> Self { - self.pll3.q_ck = Some(freq.into()); - self - } - - pub fn pll3_r<T: Into<Hertz>>(mut self, freq: T) -> Self { - self.pll3.r_ck = Some(freq.into()); - self - } + pub enable_dma1: bool, } pub struct Rcc<'d> { @@ -402,6 +326,10 @@ impl<'d> Rcc<'d> { }); while !SYSCFG.cccsr().read().ready() {} + if self.config.enable_dma1 { + RCC.ahb1enr().modify(|w| w.set_dma1en(true)); + } + CoreClocks { hclk: Hertz(rcc_hclk), pclk1: Hertz(rcc_pclk1), diff --git a/examples/stm32f0/src/example_common.rs b/examples/stm32f0/src/example_common.rs index e0ba4cd01..f50119653 100644 --- a/examples/stm32f0/src/example_common.rs +++ b/examples/stm32f0/src/example_common.rs @@ -6,13 +6,12 @@ use panic_probe as _; pub use defmt::*; use core::sync::atomic::{AtomicUsize, Ordering}; -use embassy_stm32::rcc; use embassy_stm32::Config; pub fn config() -> Config { - let mut rcc_config = rcc::Config::default(); - rcc_config.enable_debug_wfe = true; - Config::default().rcc(rcc_config) + let mut config = Config::default(); + config.rcc.enable_debug_wfe = true; + config } defmt::timestamp! {"{=u64}", { diff --git a/examples/stm32f4/src/bin/hello.rs b/examples/stm32f4/src/bin/hello.rs index a16748f4e..41d808406 100644 --- a/examples/stm32f4/src/bin/hello.rs +++ b/examples/stm32f4/src/bin/hello.rs @@ -7,7 +7,6 @@ use defmt::{info, panic}; use embassy::executor::Spawner; use embassy::time::{Duration, Timer}; -use embassy_stm32::rcc::Config as RccConfig; use embassy_stm32::time::Hertz; use embassy_stm32::Config; use embassy_stm32::Peripherals; @@ -16,11 +15,10 @@ use embassy_stm32::Peripherals; mod example_common; fn config() -> Config { - let mut rcc_config = RccConfig::default(); - rcc_config.sys_ck = Some(Hertz(84_000_000)); - rcc_config.enable_debug_wfe = true; - - Config::default().rcc(rcc_config) + let mut config = Config::default(); + config.rcc.sys_ck = Some(Hertz(84_000_000)); + config.rcc.enable_debug_wfe = true; + config } #[embassy::main(config = "config()")] diff --git a/examples/stm32h7/src/bin/dac.rs b/examples/stm32h7/src/bin/dac.rs index fcbb0c236..8816f63c2 100644 --- a/examples/stm32h7/src/bin/dac.rs +++ b/examples/stm32h7/src/bin/dac.rs @@ -12,17 +12,12 @@ use example_common::*; use cortex_m_rt::entry; use embassy_stm32::dac::{Channel, Dac, Value}; -use embassy_stm32::rcc; -use embassy_stm32::time::U32Ext; -use embassy_stm32::Config; #[entry] fn main() -> ! { info!("Hello World, dude!"); - let p = embassy_stm32::init( - Config::default().rcc(rcc::Config::default().sys_ck(400.mhz()).pll1_q(100.mhz())), - ); + let p = embassy_stm32::init(config()); unsafe { Dbgmcu::enable_all(); diff --git a/examples/stm32h7/src/bin/eth.rs b/examples/stm32h7/src/bin/eth.rs index 0c544a879..6c4ba6eb9 100644 --- a/examples/stm32h7/src/bin/eth.rs +++ b/examples/stm32h7/src/bin/eth.rs @@ -4,7 +4,9 @@ #![feature(trait_alias)] #![feature(type_alias_impl_trait)] -use core::sync::atomic::{AtomicUsize, Ordering}; +#[path = "../example_common.rs"] +mod example_common; +use example_common::config; use cortex_m_rt::entry; use defmt::{info, unwrap}; @@ -18,25 +20,15 @@ use embassy_net::{ Config as NetConfig, Ipv4Address, Ipv4Cidr, StackResources, StaticConfigurator, TcpSocket, }; use embassy_stm32::clock::{Alarm, Clock}; +use embassy_stm32::dbgmcu::Dbgmcu; use embassy_stm32::eth::lan8742a::LAN8742A; use embassy_stm32::eth::{Ethernet, State}; -use embassy_stm32::rcc::{Config as RccConfig, Rcc}; use embassy_stm32::rng::Random; -use embassy_stm32::time::Hertz; -use embassy_stm32::{interrupt, peripherals, Config}; +use embassy_stm32::{interrupt, peripherals}; use heapless::Vec; use panic_probe as _; use peripherals::{RNG, TIM2}; -defmt::timestamp! {"{=u64}", { - static COUNT: AtomicUsize = AtomicUsize::new(0); - // NOTE(no-CAS) `timestamps` runs with interrupts disabled - let n = COUNT.load(Ordering::Relaxed); - COUNT.store(n + 1, Ordering::Relaxed); - n as u64 - } -} - #[embassy::task] async fn main_task( device: &'static mut Ethernet<'static, LAN8742A, 4, 4>, @@ -106,17 +98,12 @@ fn main() -> ! { info!("Hello World!"); info!("Setup RCC..."); - let mut rcc_config = RccConfig::default(); - rcc_config.sys_ck = Some(Hertz(400_000_000)); - rcc_config.pll1.q_ck = Some(Hertz(100_000_000)); - let config = Config::default().rcc(rcc_config); - let mut p = embassy_stm32::init(config); + unsafe { + Dbgmcu::enable_all(); + } - // Constrain and Freeze clock - - let mut rcc = Rcc::new(&mut p.RCC, RccConfig::default()); - rcc.enable_debug_wfe(&mut p.DBGMCU, true); + let p = embassy_stm32::init(config()); let rtc_int = interrupt_take!(TIM2); let rtc = TIMER_RTC.put(Clock::new(p.TIM2, rtc_int)); diff --git a/examples/stm32h7/src/bin/spi.rs b/examples/stm32h7/src/bin/spi.rs index 026960a14..5175538df 100644 --- a/examples/stm32h7/src/bin/spi.rs +++ b/examples/stm32h7/src/bin/spi.rs @@ -12,9 +12,7 @@ use embassy::executor::Executor; use embassy::time::Clock; use embassy::util::Forever; use embassy_stm32::dma::NoDma; -use embassy_stm32::rcc; use embassy_stm32::spi; -use embassy_stm32::Config; use embedded_hal::blocking::spi::Transfer; use example_common::*; @@ -58,9 +56,7 @@ fn main() -> ! { Dbgmcu::enable_all(); } - let p = embassy_stm32::init( - Config::default().rcc(rcc::Config::default().sys_ck(400.mhz()).pll1_q(100.mhz())), - ); + let p = embassy_stm32::init(config()); let spi = spi::Spi::new( p.SPI3, diff --git a/examples/stm32h7/src/bin/spi_dma.rs b/examples/stm32h7/src/bin/spi_dma.rs index 7750ad192..3b9043bc2 100644 --- a/examples/stm32h7/src/bin/spi_dma.rs +++ b/examples/stm32h7/src/bin/spi_dma.rs @@ -6,6 +6,7 @@ #[path = "../example_common.rs"] mod example_common; + use core::fmt::Write; use embassy::executor::Executor; use embassy::time::Clock; @@ -18,9 +19,7 @@ use core::str::from_utf8; use cortex_m_rt::entry; use embassy_stm32::dbgmcu::Dbgmcu; use embassy_stm32::peripherals::{DMA1_CH3, DMA1_CH4, SPI3}; -use embassy_stm32::rcc; use embassy_stm32::spi; -use embassy_stm32::Config; use heapless::String; #[embassy::task] @@ -53,9 +52,7 @@ fn main() -> ! { Dbgmcu::enable_all(); } - let p = embassy_stm32::init( - Config::default().rcc(rcc::Config::default().sys_ck(400.mhz()).pll1_q(100.mhz())), - ); + let p = embassy_stm32::init(config()); let spi = spi::Spi::new( p.SPI3, diff --git a/examples/stm32h7/src/example_common.rs b/examples/stm32h7/src/example_common.rs index 54d633837..2e26730fa 100644 --- a/examples/stm32h7/src/example_common.rs +++ b/examples/stm32h7/src/example_common.rs @@ -6,6 +6,8 @@ use panic_probe as _; pub use defmt::*; use core::sync::atomic::{AtomicUsize, Ordering}; +use embassy_stm32::time::U32Ext; +use embassy_stm32::Config; defmt::timestamp! {"{=u64}", { static COUNT: AtomicUsize = AtomicUsize::new(0); @@ -15,3 +17,12 @@ defmt::timestamp! {"{=u64}", { n as u64 } } + +#[allow(unused)] +pub fn config() -> Config { + let mut config = Config::default(); + config.rcc.sys_ck = Some(400.mhz().into()); + config.rcc.pll1.q_ck = Some(100.mhz().into()); + config.rcc.enable_dma1 = true; + config +}