diff options
| -rw-r--r-- | embassy-extras/src/macros.rs | 2 | ||||
| -rw-r--r-- | embassy-macros/src/chip/stm32.rs | 6 | ||||
| -rw-r--r-- | embassy-stm32f4-examples/src/bin/serial.rs | 32 | ||||
| -rw-r--r-- | embassy-stm32f4-examples/src/bin/usb_serial.rs | 41 |
4 files changed, 19 insertions, 62 deletions
diff --git a/embassy-extras/src/macros.rs b/embassy-extras/src/macros.rs index e57b89ec7..5ce14a76d 100644 --- a/embassy-extras/src/macros.rs +++ b/embassy-extras/src/macros.rs | |||
| @@ -122,7 +122,7 @@ macro_rules! std_peripherals { | |||
| 122 | 122 | ||
| 123 | impl Peripherals { | 123 | impl Peripherals { |
| 124 | pub fn take() -> Option<(Peripherals, Clocks)> { | 124 | pub fn take() -> Option<(Peripherals, Clocks)> { |
| 125 | match unsafe {GLOBAL_CLOCKS} { | 125 | match unsafe {GLOBAL_CLOCKS.take()} { |
| 126 | Some(clocks) => { | 126 | Some(clocks) => { |
| 127 | let dp = unsafe { pac::Peripherals::steal() }; | 127 | let dp = unsafe { pac::Peripherals::steal() }; |
| 128 | let peripherals = Peripherals { | 128 | let peripherals = Peripherals { |
diff --git a/embassy-macros/src/chip/stm32.rs b/embassy-macros/src/chip/stm32.rs index 01c6a9cfd..e94c21a97 100644 --- a/embassy-macros/src/chip/stm32.rs +++ b/embassy-macros/src/chip/stm32.rs | |||
| @@ -11,6 +11,8 @@ pub struct Args { | |||
| 11 | pub sysclk: Option<u32>, | 11 | pub sysclk: Option<u32>, |
| 12 | #[darling(default)] | 12 | #[darling(default)] |
| 13 | pub pclk1: Option<u32>, | 13 | pub pclk1: Option<u32>, |
| 14 | #[darling(default)] | ||
| 15 | pub require_pll48clk: bool, | ||
| 14 | } | 16 | } |
| 15 | 17 | ||
| 16 | pub fn generate(args: Args) -> TokenStream { | 18 | pub fn generate(args: Args) -> TokenStream { |
| @@ -30,6 +32,10 @@ pub fn generate(args: Args) -> TokenStream { | |||
| 30 | clock_cfg_args = quote! { #clock_cfg_args.pclk1(#mhz.mhz()) }; | 32 | clock_cfg_args = quote! { #clock_cfg_args.pclk1(#mhz.mhz()) }; |
| 31 | } | 33 | } |
| 32 | 34 | ||
| 35 | if args.require_pll48clk { | ||
| 36 | clock_cfg_args = quote! { #clock_cfg_args.require_pll48clk() }; | ||
| 37 | } | ||
| 38 | |||
| 33 | quote!( | 39 | quote!( |
| 34 | use embassy_stm32::{rtc, interrupt, Peripherals, pac, hal::rcc::RccExt, hal::time::U32Ext}; | 40 | use embassy_stm32::{rtc, interrupt, Peripherals, pac, hal::rcc::RccExt, hal::time::U32Ext}; |
| 35 | 41 | ||
diff --git a/embassy-stm32f4-examples/src/bin/serial.rs b/embassy-stm32f4-examples/src/bin/serial.rs index 925fd68ff..1717cadb9 100644 --- a/embassy-stm32f4-examples/src/bin/serial.rs +++ b/embassy-stm32f4-examples/src/bin/serial.rs | |||
| @@ -11,7 +11,7 @@ use example_common::{panic, *}; | |||
| 11 | 11 | ||
| 12 | use cortex_m::singleton; | 12 | use cortex_m::singleton; |
| 13 | use cortex_m_rt::entry; | 13 | use cortex_m_rt::entry; |
| 14 | use embassy::executor::Executor; | 14 | use embassy::executor::{Executor, Spawner}; |
| 15 | use embassy::traits::uart::{Read, Write}; | 15 | use embassy::traits::uart::{Read, Write}; |
| 16 | use embassy::util::Forever; | 16 | use embassy::util::Forever; |
| 17 | use embassy_stm32f4::interrupt; | 17 | use embassy_stm32f4::interrupt; |
| @@ -22,26 +22,19 @@ use stm32f4xx_hal::prelude::*; | |||
| 22 | use stm32f4xx_hal::serial::config::Config; | 22 | use stm32f4xx_hal::serial::config::Config; |
| 23 | use stm32f4xx_hal::stm32; | 23 | use stm32f4xx_hal::stm32; |
| 24 | 24 | ||
| 25 | #[embassy::task] | 25 | #[embassy::main(use_hse = 16, sysclk = 48, pclk1 = 24)] |
| 26 | async fn run(dp: stm32::Peripherals, _cp: cortex_m::Peripherals) { | 26 | async fn main(spawner: Spawner) { |
| 27 | let (dp, clocks) = embassy_stm32::Peripherals::take().unwrap(); | ||
| 28 | let cp = cortex_m::peripheral::Peripherals::take().unwrap(); | ||
| 29 | |||
| 27 | dp.DBGMCU.cr.modify(|_, w| { | 30 | dp.DBGMCU.cr.modify(|_, w| { |
| 28 | w.dbg_sleep().set_bit(); | 31 | w.dbg_sleep().set_bit(); |
| 29 | w.dbg_standby().set_bit(); | 32 | w.dbg_standby().set_bit(); |
| 30 | w.dbg_stop().set_bit() | 33 | w.dbg_stop().set_bit() |
| 31 | }); | 34 | }); |
| 32 | dp.RCC.ahb1enr.modify(|_, w| w.dma1en().enabled()); | ||
| 33 | 35 | ||
| 34 | // https://gist.github.com/thalesfragoso/a07340c5df6eee3b04c42fdc69ecdcb1 | 36 | // https://gist.github.com/thalesfragoso/a07340c5df6eee3b04c42fdc69ecdcb1 |
| 35 | let gpioa = dp.GPIOA.split(); | 37 | let gpioa = dp.GPIOA.split(); |
| 36 | let rcc = dp.RCC.constrain(); | ||
| 37 | |||
| 38 | let clocks = rcc | ||
| 39 | .cfgr | ||
| 40 | .use_hse(16.mhz()) | ||
| 41 | .sysclk(48.mhz()) | ||
| 42 | .pclk1(24.mhz()) | ||
| 43 | .freeze(); | ||
| 44 | |||
| 45 | let streams = StreamsTuple::new(dp.DMA2); | 38 | let streams = StreamsTuple::new(dp.DMA2); |
| 46 | 39 | ||
| 47 | let _serial = unsafe { | 40 | let _serial = unsafe { |
| @@ -84,16 +77,3 @@ async fn run(dp: stm32::Peripherals, _cp: cortex_m::Peripherals) { | |||
| 84 | buf[5] = 0x01; | 77 | buf[5] = 0x01; |
| 85 | serial.write(buf).await.unwrap(); | 78 | serial.write(buf).await.unwrap(); |
| 86 | } | 79 | } |
| 87 | |||
| 88 | static EXECUTOR: Forever<Executor> = Forever::new(); | ||
| 89 | |||
| 90 | #[entry] | ||
| 91 | fn main() -> ! { | ||
| 92 | let dp = stm32::Peripherals::take().unwrap(); | ||
| 93 | let cp = cortex_m::peripheral::Peripherals::take().unwrap(); | ||
| 94 | |||
| 95 | let executor = EXECUTOR.put(Executor::new()); | ||
| 96 | executor.run(|spawner| { | ||
| 97 | unwrap!(spawner.spawn(run(dp, cp))); | ||
| 98 | }); | ||
| 99 | } | ||
diff --git a/embassy-stm32f4-examples/src/bin/usb_serial.rs b/embassy-stm32f4-examples/src/bin/usb_serial.rs index 6d3b2cc14..669d187d4 100644 --- a/embassy-stm32f4-examples/src/bin/usb_serial.rs +++ b/embassy-stm32f4-examples/src/bin/usb_serial.rs | |||
| @@ -10,7 +10,7 @@ use example_common::*; | |||
| 10 | 10 | ||
| 11 | use cortex_m_rt::entry; | 11 | use cortex_m_rt::entry; |
| 12 | use defmt::panic; | 12 | use defmt::panic; |
| 13 | use embassy::executor::Executor; | 13 | use embassy::executor::{Executor, Spawner}; |
| 14 | use embassy::interrupt::InterruptExt; | 14 | use embassy::interrupt::InterruptExt; |
| 15 | use embassy::io::{AsyncBufReadExt, AsyncWriteExt}; | 15 | use embassy::io::{AsyncBufReadExt, AsyncWriteExt}; |
| 16 | use embassy::time::{Duration, Timer}; | 16 | use embassy::time::{Duration, Timer}; |
| @@ -90,42 +90,15 @@ async fn run1(bus: &'static mut UsbBusAllocator<UsbBus<USB>>) { | |||
| 90 | } | 90 | } |
| 91 | } | 91 | } |
| 92 | 92 | ||
| 93 | static RTC: Forever<rtc::RTC<pac::TIM2>> = Forever::new(); | ||
| 94 | static ALARM: Forever<rtc::Alarm<pac::TIM2>> = Forever::new(); | ||
| 95 | static EXECUTOR: Forever<Executor> = Forever::new(); | ||
| 96 | static USB_BUS: Forever<UsbBusAllocator<UsbBus<USB>>> = Forever::new(); | 93 | static USB_BUS: Forever<UsbBusAllocator<UsbBus<USB>>> = Forever::new(); |
| 97 | 94 | ||
| 98 | #[entry] | 95 | #[embassy::main(use_hse = 25, sysclk = 48, require_pll48clk)] |
| 99 | fn main() -> ! { | 96 | async fn main(spawner: Spawner) -> ! { |
| 100 | static mut EP_MEMORY: [u32; 1024] = [0; 1024]; | 97 | static mut EP_MEMORY: [u32; 1024] = [0; 1024]; |
| 101 | 98 | ||
| 102 | info!("Hello World!"); | 99 | info!("Hello World!"); |
| 103 | 100 | ||
| 104 | let p = unwrap!(pac::Peripherals::take()); | 101 | let (p, clocks) = embassy_stm32::Peripherals::take().unwrap(); |
| 105 | |||
| 106 | p.RCC.ahb1enr.modify(|_, w| w.dma1en().enabled()); | ||
| 107 | let rcc = p.RCC.constrain(); | ||
| 108 | let clocks = rcc | ||
| 109 | .cfgr | ||
| 110 | .use_hse(25.mhz()) | ||
| 111 | .sysclk(48.mhz()) | ||
| 112 | .require_pll48clk() | ||
| 113 | .freeze(); | ||
| 114 | |||
| 115 | p.DBGMCU.cr.modify(|_, w| { | ||
| 116 | w.dbg_sleep().set_bit(); | ||
| 117 | w.dbg_standby().set_bit(); | ||
| 118 | w.dbg_stop().set_bit() | ||
| 119 | }); | ||
| 120 | |||
| 121 | let rtc = RTC.put(rtc::RTC::new(p.TIM2, interrupt::take!(TIM2), clocks)); | ||
| 122 | rtc.start(); | ||
| 123 | |||
| 124 | unsafe { embassy::time::set_clock(rtc) }; | ||
| 125 | |||
| 126 | let alarm = ALARM.put(rtc.alarm1()); | ||
| 127 | let executor = EXECUTOR.put(Executor::new()); | ||
| 128 | executor.set_alarm(alarm); | ||
| 129 | 102 | ||
| 130 | let gpioa = p.GPIOA.split(); | 103 | let gpioa = p.GPIOA.split(); |
| 131 | let usb = USB { | 104 | let usb = USB { |
| @@ -138,9 +111,7 @@ fn main() -> ! { | |||
| 138 | }; | 111 | }; |
| 139 | // Rust analyzer isn't recognizing the static ref magic `cortex-m` does | 112 | // Rust analyzer isn't recognizing the static ref magic `cortex-m` does |
| 140 | #[allow(unused_unsafe)] | 113 | #[allow(unused_unsafe)] |
| 141 | let usb_bus = USB_BUS.put(UsbBus::new(usb, unsafe { EP_MEMORY })); | 114 | let usb_bus = USB_BUS.put(UsbBus::new(usb, unsafe { &mut EP_MEMORY })); |
| 142 | 115 | ||
| 143 | executor.run(move |spawner| { | 116 | spawner.spawn(run1(usb_bus)).unwrap(); |
| 144 | unwrap!(spawner.spawn(run1(usb_bus))); | ||
| 145 | }); | ||
| 146 | } | 117 | } |
