aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--embassy-extras/src/macros.rs2
-rw-r--r--embassy-macros/src/chip/stm32.rs6
-rw-r--r--embassy-stm32f4-examples/src/bin/serial.rs32
-rw-r--r--embassy-stm32f4-examples/src/bin/usb_serial.rs41
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
16pub fn generate(args: Args) -> TokenStream { 18pub 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
12use cortex_m::singleton; 12use cortex_m::singleton;
13use cortex_m_rt::entry; 13use cortex_m_rt::entry;
14use embassy::executor::Executor; 14use embassy::executor::{Executor, Spawner};
15use embassy::traits::uart::{Read, Write}; 15use embassy::traits::uart::{Read, Write};
16use embassy::util::Forever; 16use embassy::util::Forever;
17use embassy_stm32f4::interrupt; 17use embassy_stm32f4::interrupt;
@@ -22,26 +22,19 @@ use stm32f4xx_hal::prelude::*;
22use stm32f4xx_hal::serial::config::Config; 22use stm32f4xx_hal::serial::config::Config;
23use stm32f4xx_hal::stm32; 23use stm32f4xx_hal::stm32;
24 24
25#[embassy::task] 25#[embassy::main(use_hse = 16, sysclk = 48, pclk1 = 24)]
26async fn run(dp: stm32::Peripherals, _cp: cortex_m::Peripherals) { 26async 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
88static EXECUTOR: Forever<Executor> = Forever::new();
89
90#[entry]
91fn 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
11use cortex_m_rt::entry; 11use cortex_m_rt::entry;
12use defmt::panic; 12use defmt::panic;
13use embassy::executor::Executor; 13use embassy::executor::{Executor, Spawner};
14use embassy::interrupt::InterruptExt; 14use embassy::interrupt::InterruptExt;
15use embassy::io::{AsyncBufReadExt, AsyncWriteExt}; 15use embassy::io::{AsyncBufReadExt, AsyncWriteExt};
16use embassy::time::{Duration, Timer}; 16use embassy::time::{Duration, Timer};
@@ -90,42 +90,15 @@ async fn run1(bus: &'static mut UsbBusAllocator<UsbBus<USB>>) {
90 } 90 }
91} 91}
92 92
93static RTC: Forever<rtc::RTC<pac::TIM2>> = Forever::new();
94static ALARM: Forever<rtc::Alarm<pac::TIM2>> = Forever::new();
95static EXECUTOR: Forever<Executor> = Forever::new();
96static USB_BUS: Forever<UsbBusAllocator<UsbBus<USB>>> = Forever::new(); 93static USB_BUS: Forever<UsbBusAllocator<UsbBus<USB>>> = Forever::new();
97 94
98#[entry] 95#[embassy::main(use_hse = 25, sysclk = 48, require_pll48clk)]
99fn main() -> ! { 96async 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}