From f916fe54760b51a12876b8d060531aa773a75e6d Mon Sep 17 00:00:00 2001 From: Dario Nieuwenhuis Date: Wed, 14 Jul 2021 22:19:04 +0200 Subject: [PATCH 1/2] all hals: reexport PAC if `unstable-pac` feature is set. --- embassy-nrf/Cargo.toml | 7 +++++++ embassy-nrf/src/lib.rs | 4 ++++ embassy-rp/Cargo.toml | 7 +++++++ embassy-rp/src/lib.rs | 3 +++ embassy-stm32/Cargo.toml | 6 ++++++ embassy-stm32/src/lib.rs | 3 +++ 6 files changed, 30 insertions(+) diff --git a/embassy-nrf/Cargo.toml b/embassy-nrf/Cargo.toml index 85ded1df4..1fdc83fb3 100644 --- a/embassy-nrf/Cargo.toml +++ b/embassy-nrf/Cargo.toml @@ -5,6 +5,13 @@ authors = ["Dario Nieuwenhuis "] edition = "2018" [features] + +# Reexport the PAC for the currently enabled chip at `embassy_nrf::pac`. +# This is unstable because semver-minor (non-breaking) releases of embassy-nrf may major-bump (breaking) the PAC version. +# If this is an issue for you, you're encouraged to directly depend on a fixed version of the PAC. +# There are no plans to make this stable. +unstable-pac = [] + defmt-trace = [ ] defmt-debug = [ ] defmt-info = [ ] diff --git a/embassy-nrf/src/lib.rs b/embassy-nrf/src/lib.rs index c2e461cf1..35815f792 100644 --- a/embassy-nrf/src/lib.rs +++ b/embassy-nrf/src/lib.rs @@ -65,7 +65,11 @@ mod chip; #[path = "chips/nrf52840.rs"] mod chip; +#[cfg(feature = "unstable-pac")] +pub use chip::pac; +#[cfg(not(feature = "unstable-pac"))] pub(crate) use chip::pac; + pub use chip::{peripherals, Peripherals}; pub mod interrupt { diff --git a/embassy-rp/Cargo.toml b/embassy-rp/Cargo.toml index ba9984a80..c61b8c997 100644 --- a/embassy-rp/Cargo.toml +++ b/embassy-rp/Cargo.toml @@ -5,6 +5,13 @@ authors = ["Dario Nieuwenhuis "] edition = "2018" [features] + +# Reexport the PAC for the currently enabled chip at `embassy_rp::pac`. +# This is unstable because semver-minor (non-breaking) releases of embassy-nrf may major-bump (breaking) the PAC version. +# If this is an issue for you, you're encouraged to directly depend on a fixed version of the PAC. +# There are no plans to make this stable. +unstable-pac = [] + defmt-trace = [ ] defmt-debug = [ ] defmt-info = [ ] diff --git a/embassy-rp/src/lib.rs b/embassy-rp/src/lib.rs index aefc86c00..c53d2e58d 100644 --- a/embassy-rp/src/lib.rs +++ b/embassy-rp/src/lib.rs @@ -5,7 +5,10 @@ #![feature(never_type)] #![allow(incomplete_features)] +#[cfg(feature = "unstable-pac")] pub use rp2040_pac2 as pac; +#[cfg(not(feature = "unstable-pac"))] +pub(crate) use rp2040_pac2 as pac; // This mod MUST go first, so that the others see its macros. pub(crate) mod fmt; diff --git a/embassy-stm32/Cargo.toml b/embassy-stm32/Cargo.toml index 654bc98ef..4e4d7ff82 100644 --- a/embassy-stm32/Cargo.toml +++ b/embassy-stm32/Cargo.toml @@ -43,6 +43,12 @@ defmt-error = [ ] sdmmc-rs = ["embedded-sdmmc"] net = ["embassy-net", "vcell"] +# Reexport stm32-metapac at `embassy_stm32::pac`. +# This is unstable because semver-minor (non-breaking) releases of embassy-stm32 may major-bump (breaking) the stm32-metapac version. +# If this is an issue for you, you're encouraged to directly depend on a fixed version of the PAC. +# There are no plans to make this stable. +unstable-pac = [] + # BEGIN GENERATED FEATURES # Generated by gen_features.py. DO NOT EDIT. stm32f030c6 = [ "stm32-metapac/stm32f030c6",] diff --git a/embassy-stm32/src/lib.rs b/embassy-stm32/src/lib.rs index 4b2826ae8..22999a69e 100644 --- a/embassy-stm32/src/lib.rs +++ b/embassy-stm32/src/lib.rs @@ -6,6 +6,9 @@ #![feature(type_alias_impl_trait)] #![allow(incomplete_features)] +#[cfg(feature = "unstable-pac")] +pub use stm32_metapac as pac; +#[cfg(not(feature = "unstable-pac"))] pub(crate) use stm32_metapac as pac; // This must go FIRST so that all the other modules see its macros. From 71c8d7aa7d84175810b6495c72d3767179d6b341 Mon Sep 17 00:00:00 2001 From: Dario Nieuwenhuis Date: Thu, 15 Jul 2021 00:30:31 +0200 Subject: [PATCH 2/2] stm32l4/examples: remove old-pac uses. --- examples/stm32l4/Cargo.toml | 2 +- examples/stm32l4/src/bin/blinky.rs | 36 +++++++------- examples/stm32l4/src/bin/button.rs | 38 ++++++++------- examples/stm32l4/src/bin/button_exti.rs | 43 ++++++++--------- examples/stm32l4/src/bin/spi.rs | 42 +++++++++-------- examples/stm32l4/src/bin/usart.rs | 62 +++++++++++-------------- examples/stm32l4/src/bin/usart_dma.rs | 62 +++++++++++-------------- 7 files changed, 135 insertions(+), 150 deletions(-) diff --git a/examples/stm32l4/Cargo.toml b/examples/stm32l4/Cargo.toml index 48125c4f8..069c1434d 100644 --- a/examples/stm32l4/Cargo.toml +++ b/examples/stm32l4/Cargo.toml @@ -19,7 +19,7 @@ defmt-error = [] [dependencies] embassy = { version = "0.1.0", path = "../../embassy", features = ["defmt", "defmt-trace"] } embassy-traits = { version = "0.1.0", path = "../../embassy-traits", features = ["defmt"] } -embassy-stm32 = { version = "0.1.0", path = "../../embassy-stm32", features = ["defmt", "defmt-trace", "stm32l4s5vi"] } +embassy-stm32 = { version = "0.1.0", path = "../../embassy-stm32", features = ["defmt", "defmt-trace", "unstable-pac", "stm32l4s5vi"] } embassy-extras = {version = "0.1.0", path = "../../embassy-extras" } stm32l4 = { version = "0.13", features = ["stm32l4x5" ] } stm32l4xx-hal = { version = "0.6.0", features = ["stm32l4x5"] } diff --git a/examples/stm32l4/src/bin/blinky.rs b/examples/stm32l4/src/bin/blinky.rs index ae4b3d1d1..0af16867f 100644 --- a/examples/stm32l4/src/bin/blinky.rs +++ b/examples/stm32l4/src/bin/blinky.rs @@ -8,34 +8,32 @@ #[path = "../example_common.rs"] mod example_common; +use cortex_m_rt::entry; use embassy_stm32::gpio::{Level, Output, Speed}; +use embassy_stm32::pac; use embedded_hal::digital::v2::OutputPin; use example_common::*; -use cortex_m_rt::entry; -use stm32l4::stm32l4x5 as pac; - #[entry] fn main() -> ! { info!("Hello World!"); - let pp = pac::Peripherals::take().unwrap(); + unsafe { + pac::DBGMCU.cr().modify(|w| { + w.set_dbg_sleep(true); + w.set_dbg_standby(true); + w.set_dbg_stop(true); + }); - pp.DBGMCU.cr.modify(|_, w| { - w.dbg_sleep().set_bit(); - w.dbg_standby().set_bit(); - w.dbg_stop().set_bit() - }); - - pp.RCC.ahb2enr.modify(|_, w| { - w.gpioaen().set_bit(); - w.gpioben().set_bit(); - w.gpiocen().set_bit(); - w.gpioden().set_bit(); - w.gpioeen().set_bit(); - w.gpiofen().set_bit(); - w - }); + pac::RCC.ahb2enr().modify(|w| { + w.set_gpioaen(true); + w.set_gpioben(true); + w.set_gpiocen(true); + w.set_gpioden(true); + w.set_gpioeen(true); + w.set_gpiofen(true); + }); + } let p = embassy_stm32::init(Default::default()); diff --git a/examples/stm32l4/src/bin/button.rs b/examples/stm32l4/src/bin/button.rs index 3efeee20f..c72463605 100644 --- a/examples/stm32l4/src/bin/button.rs +++ b/examples/stm32l4/src/bin/button.rs @@ -8,34 +8,36 @@ #[path = "../example_common.rs"] mod example_common; +use cortex_m_rt::entry; use embassy_stm32::gpio::{Input, Level, Output, Pull, Speed}; +use embassy_stm32::pac; use embedded_hal::digital::v2::{InputPin, OutputPin}; use example_common::*; -use cortex_m_rt::entry; -use stm32l4::stm32l4x5 as pac; - #[entry] fn main() -> ! { info!("Hello World!"); - let pp = pac::Peripherals::take().unwrap(); + unsafe { + pac::DBGMCU.cr().modify(|w| { + w.set_dbg_sleep(true); + w.set_dbg_standby(true); + w.set_dbg_stop(true); + }); - pp.DBGMCU.cr.modify(|_, w| { - w.dbg_sleep().set_bit(); - w.dbg_standby().set_bit(); - w.dbg_stop().set_bit() - }); + pac::RCC.apb2enr().modify(|w| { + w.set_syscfgen(true); + }); - pp.RCC.ahb2enr.modify(|_, w| { - w.gpioaen().set_bit(); - w.gpioben().set_bit(); - w.gpiocen().set_bit(); - w.gpioden().set_bit(); - w.gpioeen().set_bit(); - w.gpiofen().set_bit(); - w - }); + pac::RCC.ahb2enr().modify(|w| { + w.set_gpioaen(true); + w.set_gpioben(true); + w.set_gpiocen(true); + w.set_gpioden(true); + w.set_gpioeen(true); + w.set_gpiofen(true); + }); + } let p = embassy_stm32::init(Default::default()); diff --git a/examples/stm32l4/src/bin/button_exti.rs b/examples/stm32l4/src/bin/button_exti.rs index c6b7c83ec..6a06e4370 100644 --- a/examples/stm32l4/src/bin/button_exti.rs +++ b/examples/stm32l4/src/bin/button_exti.rs @@ -8,17 +8,16 @@ #[path = "../example_common.rs"] mod example_common; +use cortex_m_rt::entry; use embassy::executor::Executor; use embassy::time::Clock; use embassy::util::Forever; use embassy_stm32::exti::ExtiInput; use embassy_stm32::gpio::{Input, Pull}; +use embassy_stm32::pac; use embassy_traits::gpio::{WaitForFallingEdge, WaitForRisingEdge}; use example_common::*; -use cortex_m_rt::entry; -use stm32l4::stm32l4x5 as pac; - #[embassy::task] async fn main_task() { let p = embassy_stm32::init(Default::default()); @@ -50,28 +49,26 @@ static EXECUTOR: Forever = Forever::new(); fn main() -> ! { info!("Hello World!"); - let pp = pac::Peripherals::take().unwrap(); + unsafe { + pac::DBGMCU.cr().modify(|w| { + w.set_dbg_sleep(true); + w.set_dbg_standby(true); + w.set_dbg_stop(true); + }); - pp.DBGMCU.cr.modify(|_, w| { - w.dbg_sleep().set_bit(); - w.dbg_standby().set_bit(); - w.dbg_stop().set_bit() - }); + pac::RCC.apb2enr().modify(|w| { + w.set_syscfgen(true); + }); - pp.RCC.ahb2enr.modify(|_, w| { - w.gpioaen().set_bit(); - w.gpioben().set_bit(); - w.gpiocen().set_bit(); - w.gpioden().set_bit(); - w.gpioeen().set_bit(); - w.gpiofen().set_bit(); - w - }); - - pp.RCC.apb2enr.modify(|_, w| { - w.syscfgen().set_bit(); - w - }); + pac::RCC.ahb2enr().modify(|w| { + w.set_gpioaen(true); + w.set_gpioben(true); + w.set_gpiocen(true); + w.set_gpioden(true); + w.set_gpioeen(true); + w.set_gpiofen(true); + }); + } unsafe { embassy::time::set_clock(&ZeroClock) }; diff --git a/examples/stm32l4/src/bin/spi.rs b/examples/stm32l4/src/bin/spi.rs index 28c563c19..45ccfcebc 100644 --- a/examples/stm32l4/src/bin/spi.rs +++ b/examples/stm32l4/src/bin/spi.rs @@ -9,37 +9,39 @@ #[path = "../example_common.rs"] mod example_common; -use embassy_stm32::gpio::{Level, Output, Speed}; -use embedded_hal::digital::v2::OutputPin; -use example_common::*; - use cortex_m_rt::entry; +use embassy_stm32::gpio::{Level, Output, Speed}; +use embassy_stm32::pac; use embassy_stm32::spi::{Config, Spi}; use embassy_stm32::time::Hertz; use embedded_hal::blocking::spi::Transfer; -use stm32l4::stm32l4x5 as pac; +use embedded_hal::digital::v2::OutputPin; +use example_common::*; #[entry] fn main() -> ! { info!("Hello World, dude!"); - let pp = pac::Peripherals::take().unwrap(); + unsafe { + pac::DBGMCU.cr().modify(|w| { + w.set_dbg_sleep(true); + w.set_dbg_standby(true); + w.set_dbg_stop(true); + }); - pp.DBGMCU.cr.modify(|_, w| { - w.dbg_sleep().set_bit(); - w.dbg_standby().set_bit(); - w.dbg_stop().set_bit() - }); + pac::RCC.apb2enr().modify(|w| { + w.set_syscfgen(true); + }); - pp.RCC.ahb2enr.modify(|_, w| { - w.gpioaen().set_bit(); - w.gpioben().set_bit(); - w.gpiocen().set_bit(); - w.gpioden().set_bit(); - w.gpioeen().set_bit(); - w.gpiofen().set_bit(); - w - }); + pac::RCC.ahb2enr().modify(|w| { + w.set_gpioaen(true); + w.set_gpioben(true); + w.set_gpiocen(true); + w.set_gpioden(true); + w.set_gpioeen(true); + w.set_gpiofen(true); + }); + } let p = embassy_stm32::init(Default::default()); diff --git a/examples/stm32l4/src/bin/usart.rs b/examples/stm32l4/src/bin/usart.rs index dc0f649b7..e9a44f151 100644 --- a/examples/stm32l4/src/bin/usart.rs +++ b/examples/stm32l4/src/bin/usart.rs @@ -1,4 +1,3 @@ - #![no_std] #![no_main] #![feature(trait_alias)] @@ -10,16 +9,15 @@ #[path = "../example_common.rs"] mod example_common; use cortex_m::prelude::_embedded_hal_blocking_serial_Write; +use cortex_m_rt::entry; use embassy::executor::Executor; use embassy::time::Clock; use embassy::util::Forever; +use embassy_stm32::dma_traits::NoDma; +use embassy_stm32::pac; use embassy_stm32::usart::{Config, Uart}; use example_common::*; -use cortex_m_rt::entry; -use stm32l4::stm32l4x5 as pac; -use embassy_stm32::dma_traits::NoDma; - #[embassy::task] async fn main_task() { let p = embassy_stm32::init(Default::default()); @@ -51,38 +49,34 @@ static EXECUTOR: Forever = Forever::new(); fn main() -> ! { info!("Hello World!"); - let pp = pac::Peripherals::take().unwrap(); + unsafe { + pac::DBGMCU.cr().modify(|w| { + w.set_dbg_sleep(true); + w.set_dbg_standby(true); + w.set_dbg_stop(true); + }); - pp.DBGMCU.cr.modify(|_, w| { - w.dbg_sleep().set_bit(); - w.dbg_standby().set_bit(); - w.dbg_stop().set_bit() - }); + pac::RCC.ahb1enr().modify(|w| { + w.set_dma1en(true); + }); - pp.RCC.ahb1enr.modify(|_, w| { - w.dma1en().set_bit(); - w - }); + pac::RCC.ahb2enr().modify(|w| { + w.set_gpioaen(true); + w.set_gpioben(true); + w.set_gpiocen(true); + w.set_gpioden(true); + w.set_gpioeen(true); + w.set_gpiofen(true); + }); - pp.RCC.ahb2enr.modify(|_, w| { - w.gpioaen().set_bit(); - w.gpioben().set_bit(); - w.gpiocen().set_bit(); - w.gpioden().set_bit(); - w.gpioeen().set_bit(); - w.gpiofen().set_bit(); - w - }); + pac::RCC.apb1enr1().modify(|w| { + w.set_uart4en(true); + }); - pp.RCC.apb1enr1.modify(|_, w| { - w.uart4en().set_bit(); - w - }); - - pp.RCC.apb2enr.modify(|_, w| { - w.syscfgen().set_bit(); - w - }); + pac::RCC.apb2enr().modify(|w| { + w.set_syscfgen(true); + }); + } unsafe { embassy::time::set_clock(&ZeroClock) }; @@ -91,4 +85,4 @@ fn main() -> ! { executor.run(|spawner| { unwrap!(spawner.spawn(main_task())); }) -} \ No newline at end of file +} diff --git a/examples/stm32l4/src/bin/usart_dma.rs b/examples/stm32l4/src/bin/usart_dma.rs index 6a2341859..1eadd3ad4 100644 --- a/examples/stm32l4/src/bin/usart_dma.rs +++ b/examples/stm32l4/src/bin/usart_dma.rs @@ -13,12 +13,12 @@ use cortex_m_rt::entry; use embassy::executor::Executor; use embassy::time::Clock; use embassy::util::Forever; +use embassy_stm32::dma_traits::NoDma; +use embassy_stm32::pac; use embassy_stm32::usart::{Config, Uart}; +use embassy_traits::uart::Write as _; use example_common::*; use heapless::String; -use stm32l4::stm32l4x5 as pac; -use embassy_stm32::dma_traits::NoDma; -use embassy_traits::uart::Write as AsyncWrite; #[embassy::task] async fn main_task() { @@ -31,7 +31,7 @@ async fn main_task() { let mut s: String<128> = String::new(); core::write!(&mut s, "Hello DMA World {}!\r\n", n).unwrap(); - usart.write( s.as_bytes() ).await.ok(); + usart.write(s.as_bytes()).await.ok(); info!("wrote DMA"); } @@ -51,40 +51,32 @@ static EXECUTOR: Forever = Forever::new(); fn main() -> ! { info!("Hello World!"); - let pp = pac::Peripherals::take().unwrap(); + unsafe { + pac::DBGMCU.cr().modify(|w| { + w.set_dbg_sleep(true); + w.set_dbg_standby(true); + w.set_dbg_stop(true); + }); - pp.DBGMCU.cr.modify(|_, w| { - w.dbg_sleep().set_bit(); - w.dbg_standby().set_bit(); - w.dbg_stop().set_bit() - }); + pac::RCC.apb2enr().modify(|w| { + w.set_syscfgen(true); + }); - pp.RCC.ahb1enr.modify(|_, w| { - unsafe { - w.bits( 0x07 ); - } - w - //w.dmamuxen().set_bit(); - //w.dma1en().set_bit(); - //w.dma2en().set_bit(); - //w - }); - - pp.RCC.ahb2enr.modify(|_, w| { - w.gpioaen().set_bit(); - w.gpioben().set_bit(); - w.gpiocen().set_bit(); - w.gpioden().set_bit(); - w.gpioeen().set_bit(); - w.gpiofen().set_bit(); - w - }); - - pp.RCC.apb2enr.modify(|_, w| { - w.syscfgen().set_bit(); - w - }); + pac::RCC.ahb1enr().modify(|w| { + w.set_dmamux1en(true); + w.set_dma1en(true); + w.set_dma2en(true); + }); + pac::RCC.ahb2enr().modify(|w| { + w.set_gpioaen(true); + w.set_gpioben(true); + w.set_gpiocen(true); + w.set_gpioden(true); + w.set_gpioeen(true); + w.set_gpiofen(true); + }); + } unsafe { embassy::time::set_clock(&ZeroClock) };