aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--embassy-stm32/Cargo.toml4
-rw-r--r--embassy-stm32/src/rng.rs86
-rw-r--r--examples/stm32f4/src/bin/eth.rs6
-rw-r--r--examples/stm32f4/src/bin/usb_ethernet.rs5
-rw-r--r--examples/stm32f7/src/bin/eth.rs6
-rw-r--r--examples/stm32h5/src/bin/eth.rs6
-rw-r--r--examples/stm32h5/src/bin/rng.rs7
-rw-r--r--examples/stm32h7/src/bin/eth.rs6
-rw-r--r--examples/stm32h7/src/bin/eth_client.rs6
-rw-r--r--examples/stm32h7/src/bin/rng.rs7
-rw-r--r--examples/stm32l0/src/bin/lora_lorawan.rs8
-rw-r--r--examples/stm32l4/src/bin/rng.rs8
-rw-r--r--examples/stm32l5/src/bin/rng.rs8
-rw-r--r--examples/stm32l5/src/bin/usb_ethernet.rs5
-rw-r--r--examples/stm32wl/src/bin/lora_lorawan.rs7
-rw-r--r--examples/stm32wl/src/bin/random.rs10
16 files changed, 103 insertions, 82 deletions
diff --git a/embassy-stm32/Cargo.toml b/embassy-stm32/Cargo.toml
index ba279f795..a1323e85b 100644
--- a/embassy-stm32/Cargo.toml
+++ b/embassy-stm32/Cargo.toml
@@ -57,7 +57,7 @@ sdio-host = "0.5.0"
57embedded-sdmmc = { git = "https://github.com/embassy-rs/embedded-sdmmc-rs", rev = "a4f293d3a6f72158385f79c98634cb8a14d0d2fc", optional = true } 57embedded-sdmmc = { git = "https://github.com/embassy-rs/embedded-sdmmc-rs", rev = "a4f293d3a6f72158385f79c98634cb8a14d0d2fc", optional = true }
58critical-section = "1.1" 58critical-section = "1.1"
59atomic-polyfill = "1.0.1" 59atomic-polyfill = "1.0.1"
60stm32-metapac = "13" 60stm32-metapac = { git = "https://github.com/embassy-rs/stm32-data-generated", tag = "stm32-data-1f8ab493e029fc601edebc6bac105a63cc9858fe" }
61vcell = "0.1.3" 61vcell = "0.1.3"
62bxcan = "0.7.0" 62bxcan = "0.7.0"
63nb = "1.0.0" 63nb = "1.0.0"
@@ -75,7 +75,7 @@ critical-section = { version = "1.1", features = ["std"] }
75[build-dependencies] 75[build-dependencies]
76proc-macro2 = "1.0.36" 76proc-macro2 = "1.0.36"
77quote = "1.0.15" 77quote = "1.0.15"
78stm32-metapac = { version = "13", default-features = false, features = ["metadata"]} 78stm32-metapac = { git = "https://github.com/embassy-rs/stm32-data-generated", tag = "stm32-data-1f8ab493e029fc601edebc6bac105a63cc9858fe", default-features = false, features = ["metadata"]}
79 79
80[features] 80[features]
81default = ["rt"] 81default = ["rt"]
diff --git a/embassy-stm32/src/rng.rs b/embassy-stm32/src/rng.rs
index c4b77d019..2a4978ec5 100644
--- a/embassy-stm32/src/rng.rs
+++ b/embassy-stm32/src/rng.rs
@@ -1,16 +1,17 @@
1#![macro_use] 1#![macro_use]
2 2
3use core::future::poll_fn; 3use core::future::poll_fn;
4use core::marker::PhantomData;
4use core::task::Poll; 5use core::task::Poll;
5 6
6use embassy_hal_internal::interrupt::InterruptExt;
7use embassy_hal_internal::{into_ref, PeripheralRef}; 7use embassy_hal_internal::{into_ref, PeripheralRef};
8use embassy_sync::waitqueue::AtomicWaker; 8use embassy_sync::waitqueue::AtomicWaker;
9use rand_core::{CryptoRng, RngCore}; 9use rand_core::{CryptoRng, RngCore};
10 10
11use crate::interrupt::typelevel::Interrupt;
11use crate::{interrupt, pac, peripherals, Peripheral}; 12use crate::{interrupt, pac, peripherals, Peripheral};
12 13
13pub(crate) static RNG_WAKER: AtomicWaker = AtomicWaker::new(); 14static RNG_WAKER: AtomicWaker = AtomicWaker::new();
14 15
15#[cfg_attr(feature = "defmt", derive(defmt::Format))] 16#[cfg_attr(feature = "defmt", derive(defmt::Format))]
16pub enum Error { 17pub enum Error {
@@ -18,20 +19,38 @@ pub enum Error {
18 ClockError, 19 ClockError,
19} 20}
20 21
22pub struct InterruptHandler<T: Instance> {
23 _phantom: PhantomData<T>,
24}
25
26impl<T: Instance> interrupt::typelevel::Handler<T::Interrupt> for InterruptHandler<T> {
27 unsafe fn on_interrupt() {
28 let bits = T::regs().sr().read();
29 if bits.drdy() || bits.seis() || bits.ceis() {
30 T::regs().cr().modify(|reg| reg.set_ie(false));
31 RNG_WAKER.wake();
32 }
33 }
34}
35
21pub struct Rng<'d, T: Instance> { 36pub struct Rng<'d, T: Instance> {
22 _inner: PeripheralRef<'d, T>, 37 _inner: PeripheralRef<'d, T>,
23} 38}
24 39
25impl<'d, T: Instance> Rng<'d, T> { 40impl<'d, T: Instance> Rng<'d, T> {
26 pub fn new(inner: impl Peripheral<P = T> + 'd) -> Self { 41 pub fn new(
42 inner: impl Peripheral<P = T> + 'd,
43 _irq: impl interrupt::typelevel::Binding<T::Interrupt, InterruptHandler<T>> + 'd,
44 ) -> Self {
27 T::enable(); 45 T::enable();
28 T::reset(); 46 T::reset();
29 into_ref!(inner); 47 into_ref!(inner);
30 let mut random = Self { _inner: inner }; 48 let mut random = Self { _inner: inner };
31 random.reset(); 49 random.reset();
32 unsafe { 50
33 interrupt::RNG.enable(); 51 T::Interrupt::unpend();
34 } 52 unsafe { T::Interrupt::enable() };
53
35 random 54 random
36 } 55 }
37 56
@@ -189,57 +208,20 @@ pub(crate) mod sealed {
189 } 208 }
190} 209}
191 210
192pub trait Instance: sealed::Instance + crate::rcc::RccPeripheral {} 211pub trait Instance: sealed::Instance + Peripheral<P = Self> + crate::rcc::RccPeripheral + 'static + Send {
212 type Interrupt: interrupt::typelevel::Interrupt;
213}
193 214
194foreach_peripheral!( 215foreach_interrupt!(
195 (rng, $inst:ident) => { 216 ($inst:ident, rng, RNG, GLOBAL, $irq:ident) => {
196 impl Instance for peripherals::$inst {} 217 impl Instance for peripherals::$inst {
218 type Interrupt = crate::interrupt::typelevel::$irq;
219 }
197 220
198 impl sealed::Instance for peripherals::$inst { 221 impl sealed::Instance for peripherals::$inst {
199 fn regs() -> crate::pac::rng::Rng { 222 fn regs() -> crate::pac::rng::Rng {
200 crate::pac::RNG 223 crate::pac::$inst
201 }
202 }
203 };
204);
205
206#[cfg(feature = "rt")]
207macro_rules! irq {
208 ($irq:ident) => {
209 mod rng_irq {
210 use crate::interrupt;
211
212 #[interrupt]
213 unsafe fn $irq() {
214 let bits = $crate::pac::RNG.sr().read();
215 if bits.drdy() || bits.seis() || bits.ceis() {
216 $crate::pac::RNG.cr().modify(|reg| reg.set_ie(false));
217 $crate::rng::RNG_WAKER.wake();
218 }
219 } 224 }
220 } 225 }
221 }; 226 };
222}
223
224#[cfg(feature = "rt")]
225foreach_interrupt!(
226 (RNG) => {
227 irq!(RNG);
228 };
229
230 (RNG_LPUART1) => {
231 irq!(RNG_LPUART1);
232 };
233
234 (AES_RNG_LPUART1) => {
235 irq!(AES_RNG_LPUART1);
236 };
237
238 (AES_RNG) => {
239 irq!(AES_RNG);
240 };
241
242 (HASH_RNG) => {
243 irq!(HASH_RNG);
244 };
245); 227);
diff --git a/examples/stm32f4/src/bin/eth.rs b/examples/stm32f4/src/bin/eth.rs
index d0b164393..496016687 100644
--- a/examples/stm32f4/src/bin/eth.rs
+++ b/examples/stm32f4/src/bin/eth.rs
@@ -11,13 +11,15 @@ use embassy_stm32::eth::{Ethernet, PacketQueue};
11use embassy_stm32::peripherals::ETH; 11use embassy_stm32::peripherals::ETH;
12use embassy_stm32::rng::Rng; 12use embassy_stm32::rng::Rng;
13use embassy_stm32::time::mhz; 13use embassy_stm32::time::mhz;
14use embassy_stm32::{bind_interrupts, eth, Config}; 14use embassy_stm32::{bind_interrupts, eth, peripherals, rng, Config};
15use embassy_time::{Duration, Timer}; 15use embassy_time::{Duration, Timer};
16use embedded_io::asynch::Write; 16use embedded_io::asynch::Write;
17use static_cell::make_static; 17use static_cell::make_static;
18use {defmt_rtt as _, panic_probe as _}; 18use {defmt_rtt as _, panic_probe as _};
19
19bind_interrupts!(struct Irqs { 20bind_interrupts!(struct Irqs {
20 ETH => eth::InterruptHandler; 21 ETH => eth::InterruptHandler;
22 HASH_RNG => rng::InterruptHandler<peripherals::RNG>;
21}); 23});
22 24
23type Device = Ethernet<'static, ETH, GenericSMI>; 25type Device = Ethernet<'static, ETH, GenericSMI>;
@@ -36,7 +38,7 @@ async fn main(spawner: Spawner) -> ! {
36 info!("Hello World!"); 38 info!("Hello World!");
37 39
38 // Generate random seed. 40 // Generate random seed.
39 let mut rng = Rng::new(p.RNG); 41 let mut rng = Rng::new(p.RNG, Irqs);
40 let mut seed = [0; 8]; 42 let mut seed = [0; 8];
41 let _ = rng.async_fill_bytes(&mut seed).await; 43 let _ = rng.async_fill_bytes(&mut seed).await;
42 let seed = u64::from_le_bytes(seed); 44 let seed = u64::from_le_bytes(seed);
diff --git a/examples/stm32f4/src/bin/usb_ethernet.rs b/examples/stm32f4/src/bin/usb_ethernet.rs
index b1f01417c..740d3018e 100644
--- a/examples/stm32f4/src/bin/usb_ethernet.rs
+++ b/examples/stm32f4/src/bin/usb_ethernet.rs
@@ -6,7 +6,7 @@ use defmt::*;
6use embassy_executor::Spawner; 6use embassy_executor::Spawner;
7use embassy_net::tcp::TcpSocket; 7use embassy_net::tcp::TcpSocket;
8use embassy_net::{Stack, StackResources}; 8use embassy_net::{Stack, StackResources};
9use embassy_stm32::rng::Rng; 9use embassy_stm32::rng::{self, Rng};
10use embassy_stm32::time::mhz; 10use embassy_stm32::time::mhz;
11use embassy_stm32::usb_otg::Driver; 11use embassy_stm32::usb_otg::Driver;
12use embassy_stm32::{bind_interrupts, peripherals, usb_otg, Config}; 12use embassy_stm32::{bind_interrupts, peripherals, usb_otg, Config};
@@ -38,6 +38,7 @@ async fn net_task(stack: &'static Stack<Device<'static, MTU>>) -> ! {
38 38
39bind_interrupts!(struct Irqs { 39bind_interrupts!(struct Irqs {
40 OTG_FS => usb_otg::InterruptHandler<peripherals::USB_OTG_FS>; 40 OTG_FS => usb_otg::InterruptHandler<peripherals::USB_OTG_FS>;
41 HASH_RNG => rng::InterruptHandler<peripherals::RNG>;
41}); 42});
42 43
43#[embassy_executor::main] 44#[embassy_executor::main]
@@ -104,7 +105,7 @@ async fn main(spawner: Spawner) {
104 //}); 105 //});
105 106
106 // Generate random seed 107 // Generate random seed
107 let mut rng = Rng::new(p.RNG); 108 let mut rng = Rng::new(p.RNG, Irqs);
108 let mut seed = [0; 8]; 109 let mut seed = [0; 8];
109 unwrap!(rng.async_fill_bytes(&mut seed).await); 110 unwrap!(rng.async_fill_bytes(&mut seed).await);
110 let seed = u64::from_le_bytes(seed); 111 let seed = u64::from_le_bytes(seed);
diff --git a/examples/stm32f7/src/bin/eth.rs b/examples/stm32f7/src/bin/eth.rs
index c6b2ba45c..e5abf52bc 100644
--- a/examples/stm32f7/src/bin/eth.rs
+++ b/examples/stm32f7/src/bin/eth.rs
@@ -11,14 +11,16 @@ use embassy_stm32::eth::{Ethernet, PacketQueue};
11use embassy_stm32::peripherals::ETH; 11use embassy_stm32::peripherals::ETH;
12use embassy_stm32::rng::Rng; 12use embassy_stm32::rng::Rng;
13use embassy_stm32::time::mhz; 13use embassy_stm32::time::mhz;
14use embassy_stm32::{bind_interrupts, eth, Config}; 14use embassy_stm32::{bind_interrupts, eth, peripherals, rng, Config};
15use embassy_time::{Duration, Timer}; 15use embassy_time::{Duration, Timer};
16use embedded_io::asynch::Write; 16use embedded_io::asynch::Write;
17use rand_core::RngCore; 17use rand_core::RngCore;
18use static_cell::make_static; 18use static_cell::make_static;
19use {defmt_rtt as _, panic_probe as _}; 19use {defmt_rtt as _, panic_probe as _};
20
20bind_interrupts!(struct Irqs { 21bind_interrupts!(struct Irqs {
21 ETH => eth::InterruptHandler; 22 ETH => eth::InterruptHandler;
23 RNG => rng::InterruptHandler<peripherals::RNG>;
22}); 24});
23 25
24type Device = Ethernet<'static, ETH, GenericSMI>; 26type Device = Ethernet<'static, ETH, GenericSMI>;
@@ -37,7 +39,7 @@ async fn main(spawner: Spawner) -> ! {
37 info!("Hello World!"); 39 info!("Hello World!");
38 40
39 // Generate random seed. 41 // Generate random seed.
40 let mut rng = Rng::new(p.RNG); 42 let mut rng = Rng::new(p.RNG, Irqs);
41 let mut seed = [0; 8]; 43 let mut seed = [0; 8];
42 rng.fill_bytes(&mut seed); 44 rng.fill_bytes(&mut seed);
43 let seed = u64::from_le_bytes(seed); 45 let seed = u64::from_le_bytes(seed);
diff --git a/examples/stm32h5/src/bin/eth.rs b/examples/stm32h5/src/bin/eth.rs
index 0bff85ed8..2aa2ab62b 100644
--- a/examples/stm32h5/src/bin/eth.rs
+++ b/examples/stm32h5/src/bin/eth.rs
@@ -12,14 +12,16 @@ use embassy_stm32::peripherals::ETH;
12use embassy_stm32::rcc::{AHBPrescaler, APBPrescaler, Hse, HseMode, Pll, PllSource, Sysclk, VoltageScale}; 12use embassy_stm32::rcc::{AHBPrescaler, APBPrescaler, Hse, HseMode, Pll, PllSource, Sysclk, VoltageScale};
13use embassy_stm32::rng::Rng; 13use embassy_stm32::rng::Rng;
14use embassy_stm32::time::Hertz; 14use embassy_stm32::time::Hertz;
15use embassy_stm32::{bind_interrupts, eth, Config}; 15use embassy_stm32::{bind_interrupts, eth, peripherals, rng, Config};
16use embassy_time::{Duration, Timer}; 16use embassy_time::{Duration, Timer};
17use embedded_io::asynch::Write; 17use embedded_io::asynch::Write;
18use rand_core::RngCore; 18use rand_core::RngCore;
19use static_cell::make_static; 19use static_cell::make_static;
20use {defmt_rtt as _, panic_probe as _}; 20use {defmt_rtt as _, panic_probe as _};
21
21bind_interrupts!(struct Irqs { 22bind_interrupts!(struct Irqs {
22 ETH => eth::InterruptHandler; 23 ETH => eth::InterruptHandler;
24 RNG => rng::InterruptHandler<peripherals::RNG>;
23}); 25});
24 26
25type Device = Ethernet<'static, ETH, GenericSMI>; 27type Device = Ethernet<'static, ETH, GenericSMI>;
@@ -56,7 +58,7 @@ async fn main(spawner: Spawner) -> ! {
56 info!("Hello World!"); 58 info!("Hello World!");
57 59
58 // Generate random seed. 60 // Generate random seed.
59 let mut rng = Rng::new(p.RNG); 61 let mut rng = Rng::new(p.RNG, Irqs);
60 let mut seed = [0; 8]; 62 let mut seed = [0; 8];
61 rng.fill_bytes(&mut seed); 63 rng.fill_bytes(&mut seed);
62 let seed = u64::from_le_bytes(seed); 64 let seed = u64::from_le_bytes(seed);
diff --git a/examples/stm32h5/src/bin/rng.rs b/examples/stm32h5/src/bin/rng.rs
index af9be0b62..7c8c50eca 100644
--- a/examples/stm32h5/src/bin/rng.rs
+++ b/examples/stm32h5/src/bin/rng.rs
@@ -5,14 +5,19 @@
5use defmt::*; 5use defmt::*;
6use embassy_executor::Spawner; 6use embassy_executor::Spawner;
7use embassy_stm32::rng::Rng; 7use embassy_stm32::rng::Rng;
8use embassy_stm32::{bind_interrupts, peripherals, rng};
8use {defmt_rtt as _, panic_probe as _}; 9use {defmt_rtt as _, panic_probe as _};
9 10
11bind_interrupts!(struct Irqs {
12 RNG => rng::InterruptHandler<peripherals::RNG>;
13});
14
10#[embassy_executor::main] 15#[embassy_executor::main]
11async fn main(_spawner: Spawner) { 16async fn main(_spawner: Spawner) {
12 let p = embassy_stm32::init(Default::default()); 17 let p = embassy_stm32::init(Default::default());
13 info!("Hello World!"); 18 info!("Hello World!");
14 19
15 let mut rng = Rng::new(p.RNG); 20 let mut rng = Rng::new(p.RNG, Irqs);
16 21
17 let mut buf = [0u8; 16]; 22 let mut buf = [0u8; 16];
18 unwrap!(rng.async_fill_bytes(&mut buf).await); 23 unwrap!(rng.async_fill_bytes(&mut buf).await);
diff --git a/examples/stm32h7/src/bin/eth.rs b/examples/stm32h7/src/bin/eth.rs
index cfafcaed1..c93be9f00 100644
--- a/examples/stm32h7/src/bin/eth.rs
+++ b/examples/stm32h7/src/bin/eth.rs
@@ -11,14 +11,16 @@ use embassy_stm32::eth::{Ethernet, PacketQueue};
11use embassy_stm32::peripherals::ETH; 11use embassy_stm32::peripherals::ETH;
12use embassy_stm32::rng::Rng; 12use embassy_stm32::rng::Rng;
13use embassy_stm32::time::mhz; 13use embassy_stm32::time::mhz;
14use embassy_stm32::{bind_interrupts, eth, Config}; 14use embassy_stm32::{bind_interrupts, eth, peripherals, rng, Config};
15use embassy_time::{Duration, Timer}; 15use embassy_time::{Duration, Timer};
16use embedded_io::asynch::Write; 16use embedded_io::asynch::Write;
17use rand_core::RngCore; 17use rand_core::RngCore;
18use static_cell::make_static; 18use static_cell::make_static;
19use {defmt_rtt as _, panic_probe as _}; 19use {defmt_rtt as _, panic_probe as _};
20
20bind_interrupts!(struct Irqs { 21bind_interrupts!(struct Irqs {
21 ETH => eth::InterruptHandler; 22 ETH => eth::InterruptHandler;
23 RNG => rng::InterruptHandler<peripherals::RNG>;
22}); 24});
23 25
24type Device = Ethernet<'static, ETH, GenericSMI>; 26type Device = Ethernet<'static, ETH, GenericSMI>;
@@ -38,7 +40,7 @@ async fn main(spawner: Spawner) -> ! {
38 info!("Hello World!"); 40 info!("Hello World!");
39 41
40 // Generate random seed. 42 // Generate random seed.
41 let mut rng = Rng::new(p.RNG); 43 let mut rng = Rng::new(p.RNG, Irqs);
42 let mut seed = [0; 8]; 44 let mut seed = [0; 8];
43 rng.fill_bytes(&mut seed); 45 rng.fill_bytes(&mut seed);
44 let seed = u64::from_le_bytes(seed); 46 let seed = u64::from_le_bytes(seed);
diff --git a/examples/stm32h7/src/bin/eth_client.rs b/examples/stm32h7/src/bin/eth_client.rs
index 4ed737578..78005e91f 100644
--- a/examples/stm32h7/src/bin/eth_client.rs
+++ b/examples/stm32h7/src/bin/eth_client.rs
@@ -11,15 +11,17 @@ use embassy_stm32::eth::{Ethernet, PacketQueue};
11use embassy_stm32::peripherals::ETH; 11use embassy_stm32::peripherals::ETH;
12use embassy_stm32::rng::Rng; 12use embassy_stm32::rng::Rng;
13use embassy_stm32::time::mhz; 13use embassy_stm32::time::mhz;
14use embassy_stm32::{bind_interrupts, eth, Config}; 14use embassy_stm32::{bind_interrupts, eth, peripherals, rng, Config};
15use embassy_time::{Duration, Timer}; 15use embassy_time::{Duration, Timer};
16use embedded_io::asynch::Write; 16use embedded_io::asynch::Write;
17use embedded_nal_async::{Ipv4Addr, SocketAddr, SocketAddrV4, TcpConnect}; 17use embedded_nal_async::{Ipv4Addr, SocketAddr, SocketAddrV4, TcpConnect};
18use rand_core::RngCore; 18use rand_core::RngCore;
19use static_cell::make_static; 19use static_cell::make_static;
20use {defmt_rtt as _, panic_probe as _}; 20use {defmt_rtt as _, panic_probe as _};
21
21bind_interrupts!(struct Irqs { 22bind_interrupts!(struct Irqs {
22 ETH => eth::InterruptHandler; 23 ETH => eth::InterruptHandler;
24 RNG => rng::InterruptHandler<peripherals::RNG>;
23}); 25});
24 26
25type Device = Ethernet<'static, ETH, GenericSMI>; 27type Device = Ethernet<'static, ETH, GenericSMI>;
@@ -39,7 +41,7 @@ async fn main(spawner: Spawner) -> ! {
39 info!("Hello World!"); 41 info!("Hello World!");
40 42
41 // Generate random seed. 43 // Generate random seed.
42 let mut rng = Rng::new(p.RNG); 44 let mut rng = Rng::new(p.RNG, Irqs);
43 let mut seed = [0; 8]; 45 let mut seed = [0; 8];
44 rng.fill_bytes(&mut seed); 46 rng.fill_bytes(&mut seed);
45 let seed = u64::from_le_bytes(seed); 47 let seed = u64::from_le_bytes(seed);
diff --git a/examples/stm32h7/src/bin/rng.rs b/examples/stm32h7/src/bin/rng.rs
index af9be0b62..7c8c50eca 100644
--- a/examples/stm32h7/src/bin/rng.rs
+++ b/examples/stm32h7/src/bin/rng.rs
@@ -5,14 +5,19 @@
5use defmt::*; 5use defmt::*;
6use embassy_executor::Spawner; 6use embassy_executor::Spawner;
7use embassy_stm32::rng::Rng; 7use embassy_stm32::rng::Rng;
8use embassy_stm32::{bind_interrupts, peripherals, rng};
8use {defmt_rtt as _, panic_probe as _}; 9use {defmt_rtt as _, panic_probe as _};
9 10
11bind_interrupts!(struct Irqs {
12 RNG => rng::InterruptHandler<peripherals::RNG>;
13});
14
10#[embassy_executor::main] 15#[embassy_executor::main]
11async fn main(_spawner: Spawner) { 16async fn main(_spawner: Spawner) {
12 let p = embassy_stm32::init(Default::default()); 17 let p = embassy_stm32::init(Default::default());
13 info!("Hello World!"); 18 info!("Hello World!");
14 19
15 let mut rng = Rng::new(p.RNG); 20 let mut rng = Rng::new(p.RNG, Irqs);
16 21
17 let mut buf = [0u8; 16]; 22 let mut buf = [0u8; 16];
18 unwrap!(rng.async_fill_bytes(&mut buf).await); 23 unwrap!(rng.async_fill_bytes(&mut buf).await);
diff --git a/examples/stm32l0/src/bin/lora_lorawan.rs b/examples/stm32l0/src/bin/lora_lorawan.rs
index c397edd58..03c793b32 100644
--- a/examples/stm32l0/src/bin/lora_lorawan.rs
+++ b/examples/stm32l0/src/bin/lora_lorawan.rs
@@ -12,8 +12,8 @@ use embassy_lora::LoraTimer;
12use embassy_stm32::exti::{Channel, ExtiInput}; 12use embassy_stm32::exti::{Channel, ExtiInput};
13use embassy_stm32::gpio::{Input, Level, Output, Pin, Pull, Speed}; 13use embassy_stm32::gpio::{Input, Level, Output, Pin, Pull, Speed};
14use embassy_stm32::rng::Rng; 14use embassy_stm32::rng::Rng;
15use embassy_stm32::spi;
16use embassy_stm32::time::khz; 15use embassy_stm32::time::khz;
16use embassy_stm32::{bind_interrupts, peripherals, rng, spi};
17use embassy_time::Delay; 17use embassy_time::Delay;
18use lora_phy::mod_params::*; 18use lora_phy::mod_params::*;
19use lora_phy::sx1276_7_8_9::SX1276_7_8_9; 19use lora_phy::sx1276_7_8_9::SX1276_7_8_9;
@@ -23,6 +23,10 @@ use lorawan_device::async_device::lora_radio::LoRaRadio;
23use lorawan_device::async_device::{region, Device, JoinMode}; 23use lorawan_device::async_device::{region, Device, JoinMode};
24use {defmt_rtt as _, panic_probe as _}; 24use {defmt_rtt as _, panic_probe as _};
25 25
26bind_interrupts!(struct Irqs {
27 RNG_LPUART1 => rng::InterruptHandler<peripherals::RNG>;
28});
29
26const LORAWAN_REGION: region::Region = region::Region::EU868; // warning: set this appropriately for the region 30const LORAWAN_REGION: region::Region = region::Region::EU868; // warning: set this appropriately for the region
27 31
28#[embassy_executor::main] 32#[embassy_executor::main]
@@ -66,7 +70,7 @@ async fn main(_spawner: Spawner) {
66 70
67 let radio = LoRaRadio::new(lora); 71 let radio = LoRaRadio::new(lora);
68 let region: region::Configuration = region::Configuration::new(LORAWAN_REGION); 72 let region: region::Configuration = region::Configuration::new(LORAWAN_REGION);
69 let mut device: Device<_, Crypto, _, _> = Device::new(region, radio, LoraTimer::new(), Rng::new(p.RNG)); 73 let mut device: Device<_, Crypto, _, _> = Device::new(region, radio, LoraTimer::new(), Rng::new(p.RNG, Irqs));
70 74
71 defmt::info!("Joining LoRaWAN network"); 75 defmt::info!("Joining LoRaWAN network");
72 76
diff --git a/examples/stm32l4/src/bin/rng.rs b/examples/stm32l4/src/bin/rng.rs
index c9302bb99..806e49f59 100644
--- a/examples/stm32l4/src/bin/rng.rs
+++ b/examples/stm32l4/src/bin/rng.rs
@@ -6,9 +6,13 @@ use defmt::*;
6use embassy_executor::Spawner; 6use embassy_executor::Spawner;
7use embassy_stm32::rcc::{ClockSrc, PLLClkDiv, PLLMul, PLLSource, PLLSrcDiv}; 7use embassy_stm32::rcc::{ClockSrc, PLLClkDiv, PLLMul, PLLSource, PLLSrcDiv};
8use embassy_stm32::rng::Rng; 8use embassy_stm32::rng::Rng;
9use embassy_stm32::Config; 9use embassy_stm32::{bind_interrupts, peripherals, rng, Config};
10use {defmt_rtt as _, panic_probe as _}; 10use {defmt_rtt as _, panic_probe as _};
11 11
12bind_interrupts!(struct Irqs {
13 RNG => rng::InterruptHandler<peripherals::RNG>;
14});
15
12#[embassy_executor::main] 16#[embassy_executor::main]
13async fn main(_spawner: Spawner) { 17async fn main(_spawner: Spawner) {
14 let mut config = Config::default(); 18 let mut config = Config::default();
@@ -24,7 +28,7 @@ async fn main(_spawner: Spawner) {
24 28
25 info!("Hello World!"); 29 info!("Hello World!");
26 30
27 let mut rng = Rng::new(p.RNG); 31 let mut rng = Rng::new(p.RNG, Irqs);
28 32
29 let mut buf = [0u8; 16]; 33 let mut buf = [0u8; 16];
30 unwrap!(rng.async_fill_bytes(&mut buf).await); 34 unwrap!(rng.async_fill_bytes(&mut buf).await);
diff --git a/examples/stm32l5/src/bin/rng.rs b/examples/stm32l5/src/bin/rng.rs
index d359847e8..9549d64d8 100644
--- a/examples/stm32l5/src/bin/rng.rs
+++ b/examples/stm32l5/src/bin/rng.rs
@@ -6,9 +6,13 @@ use defmt::*;
6use embassy_executor::Spawner; 6use embassy_executor::Spawner;
7use embassy_stm32::rcc::{ClockSrc, PLLClkDiv, PLLMul, PLLSource, PLLSrcDiv}; 7use embassy_stm32::rcc::{ClockSrc, PLLClkDiv, PLLMul, PLLSource, PLLSrcDiv};
8use embassy_stm32::rng::Rng; 8use embassy_stm32::rng::Rng;
9use embassy_stm32::Config; 9use embassy_stm32::{bind_interrupts, peripherals, rng, Config};
10use {defmt_rtt as _, panic_probe as _}; 10use {defmt_rtt as _, panic_probe as _};
11 11
12bind_interrupts!(struct Irqs {
13 RNG => rng::InterruptHandler<peripherals::RNG>;
14});
15
12#[embassy_executor::main] 16#[embassy_executor::main]
13async fn main(_spawner: Spawner) { 17async fn main(_spawner: Spawner) {
14 let mut config = Config::default(); 18 let mut config = Config::default();
@@ -23,7 +27,7 @@ async fn main(_spawner: Spawner) {
23 27
24 info!("Hello World!"); 28 info!("Hello World!");
25 29
26 let mut rng = Rng::new(p.RNG); 30 let mut rng = Rng::new(p.RNG, Irqs);
27 31
28 let mut buf = [0u8; 16]; 32 let mut buf = [0u8; 16];
29 unwrap!(rng.async_fill_bytes(&mut buf).await); 33 unwrap!(rng.async_fill_bytes(&mut buf).await);
diff --git a/examples/stm32l5/src/bin/usb_ethernet.rs b/examples/stm32l5/src/bin/usb_ethernet.rs
index 32eba4277..5e75b21c9 100644
--- a/examples/stm32l5/src/bin/usb_ethernet.rs
+++ b/examples/stm32l5/src/bin/usb_ethernet.rs
@@ -9,7 +9,7 @@ use embassy_net::{Stack, StackResources};
9use embassy_stm32::rcc::*; 9use embassy_stm32::rcc::*;
10use embassy_stm32::rng::Rng; 10use embassy_stm32::rng::Rng;
11use embassy_stm32::usb::Driver; 11use embassy_stm32::usb::Driver;
12use embassy_stm32::{bind_interrupts, peripherals, usb, Config}; 12use embassy_stm32::{bind_interrupts, peripherals, rng, usb, Config};
13use embassy_usb::class::cdc_ncm::embassy_net::{Device, Runner, State as NetState}; 13use embassy_usb::class::cdc_ncm::embassy_net::{Device, Runner, State as NetState};
14use embassy_usb::class::cdc_ncm::{CdcNcmClass, State}; 14use embassy_usb::class::cdc_ncm::{CdcNcmClass, State};
15use embassy_usb::{Builder, UsbDevice}; 15use embassy_usb::{Builder, UsbDevice};
@@ -24,6 +24,7 @@ const MTU: usize = 1514;
24 24
25bind_interrupts!(struct Irqs { 25bind_interrupts!(struct Irqs {
26 USB_FS => usb::InterruptHandler<peripherals::USB>; 26 USB_FS => usb::InterruptHandler<peripherals::USB>;
27 RNG => rng::InterruptHandler<peripherals::RNG>;
27}); 28});
28 29
29#[embassy_executor::task] 30#[embassy_executor::task]
@@ -99,7 +100,7 @@ async fn main(spawner: Spawner) {
99 //}); 100 //});
100 101
101 // Generate random seed 102 // Generate random seed
102 let mut rng = Rng::new(p.RNG); 103 let mut rng = Rng::new(p.RNG, Irqs);
103 let seed = rng.next_u64(); 104 let seed = rng.next_u64();
104 105
105 // Init network stack 106 // Init network stack
diff --git a/examples/stm32wl/src/bin/lora_lorawan.rs b/examples/stm32wl/src/bin/lora_lorawan.rs
index 805d21418..2c9c98861 100644
--- a/examples/stm32wl/src/bin/lora_lorawan.rs
+++ b/examples/stm32wl/src/bin/lora_lorawan.rs
@@ -10,9 +10,9 @@ use embassy_executor::Spawner;
10use embassy_lora::iv::{InterruptHandler, Stm32wlInterfaceVariant}; 10use embassy_lora::iv::{InterruptHandler, Stm32wlInterfaceVariant};
11use embassy_lora::LoraTimer; 11use embassy_lora::LoraTimer;
12use embassy_stm32::gpio::{Level, Output, Pin, Speed}; 12use embassy_stm32::gpio::{Level, Output, Pin, Speed};
13use embassy_stm32::rng::Rng; 13use embassy_stm32::rng::{self, Rng};
14use embassy_stm32::spi::Spi; 14use embassy_stm32::spi::Spi;
15use embassy_stm32::{bind_interrupts, pac}; 15use embassy_stm32::{bind_interrupts, pac, peripherals};
16use embassy_time::Delay; 16use embassy_time::Delay;
17use lora_phy::mod_params::*; 17use lora_phy::mod_params::*;
18use lora_phy::sx1261_2::SX1261_2; 18use lora_phy::sx1261_2::SX1261_2;
@@ -26,6 +26,7 @@ const LORAWAN_REGION: region::Region = region::Region::EU868; // warning: set th
26 26
27bind_interrupts!(struct Irqs{ 27bind_interrupts!(struct Irqs{
28 SUBGHZ_RADIO => InterruptHandler; 28 SUBGHZ_RADIO => InterruptHandler;
29 RNG => rng::InterruptHandler<peripherals::RNG>;
29}); 30});
30 31
31#[embassy_executor::main] 32#[embassy_executor::main]
@@ -58,7 +59,7 @@ async fn main(_spawner: Spawner) {
58 }; 59 };
59 let radio = LoRaRadio::new(lora); 60 let radio = LoRaRadio::new(lora);
60 let region: region::Configuration = region::Configuration::new(LORAWAN_REGION); 61 let region: region::Configuration = region::Configuration::new(LORAWAN_REGION);
61 let mut device: Device<_, Crypto, _, _> = Device::new(region, radio, LoraTimer::new(), Rng::new(p.RNG)); 62 let mut device: Device<_, Crypto, _, _> = Device::new(region, radio, LoraTimer::new(), Rng::new(p.RNG, Irqs));
62 63
63 defmt::info!("Joining LoRaWAN network"); 64 defmt::info!("Joining LoRaWAN network");
64 65
diff --git a/examples/stm32wl/src/bin/random.rs b/examples/stm32wl/src/bin/random.rs
index d8562fca5..592e65f40 100644
--- a/examples/stm32wl/src/bin/random.rs
+++ b/examples/stm32wl/src/bin/random.rs
@@ -4,10 +4,14 @@
4 4
5use defmt::*; 5use defmt::*;
6use embassy_executor::Spawner; 6use embassy_executor::Spawner;
7use embassy_stm32::pac; 7use embassy_stm32::rng::{self, Rng};
8use embassy_stm32::rng::Rng; 8use embassy_stm32::{bind_interrupts, pac, peripherals};
9use {defmt_rtt as _, panic_probe as _}; 9use {defmt_rtt as _, panic_probe as _};
10 10
11bind_interrupts!(struct Irqs{
12 RNG => rng::InterruptHandler<peripherals::RNG>;
13});
14
11#[embassy_executor::main] 15#[embassy_executor::main]
12async fn main(_spawner: Spawner) { 16async fn main(_spawner: Spawner) {
13 let mut config = embassy_stm32::Config::default(); 17 let mut config = embassy_stm32::Config::default();
@@ -21,7 +25,7 @@ async fn main(_spawner: Spawner) {
21 25
22 info!("Hello World!"); 26 info!("Hello World!");
23 27
24 let mut rng = Rng::new(p.RNG); 28 let mut rng = Rng::new(p.RNG, Irqs);
25 29
26 let mut buf = [0u8; 16]; 30 let mut buf = [0u8; 16];
27 unwrap!(rng.async_fill_bytes(&mut buf).await); 31 unwrap!(rng.async_fill_bytes(&mut buf).await);