diff options
| author | jrmoulton <[email protected]> | 2025-06-10 15:47:54 -0600 |
|---|---|---|
| committer | jrmoulton <[email protected]> | 2025-06-10 15:48:36 -0600 |
| commit | cfad9798ff99d4de0571a512d156b5fe1ef1d427 (patch) | |
| tree | fc3bf670f82d139de19466cddad1e909db7f3d2e /examples/nrf52840/src/bin | |
| parent | fc342915e6155dec7bafa3e135da7f37a9a07f5c (diff) | |
| parent | 6186d111a5c150946ee5b7e9e68d987a38c1a463 (diff) | |
merge new embassy changes
Diffstat (limited to 'examples/nrf52840/src/bin')
29 files changed, 259 insertions, 130 deletions
diff --git a/examples/nrf52840/src/bin/buffered_uart.rs b/examples/nrf52840/src/bin/buffered_uart.rs index 6ac72bcaf..f0a066818 100644 --- a/examples/nrf52840/src/bin/buffered_uart.rs +++ b/examples/nrf52840/src/bin/buffered_uart.rs | |||
| @@ -9,7 +9,7 @@ use embedded_io_async::Write; | |||
| 9 | use {defmt_rtt as _, panic_probe as _}; | 9 | use {defmt_rtt as _, panic_probe as _}; |
| 10 | 10 | ||
| 11 | bind_interrupts!(struct Irqs { | 11 | bind_interrupts!(struct Irqs { |
| 12 | UARTE0_UART0 => buffered_uarte::InterruptHandler<peripherals::UARTE0>; | 12 | UARTE0 => buffered_uarte::InterruptHandler<peripherals::UARTE0>; |
| 13 | }); | 13 | }); |
| 14 | 14 | ||
| 15 | #[embassy_executor::main] | 15 | #[embassy_executor::main] |
| @@ -28,9 +28,9 @@ async fn main(_spawner: Spawner) { | |||
| 28 | p.PPI_CH0, | 28 | p.PPI_CH0, |
| 29 | p.PPI_CH1, | 29 | p.PPI_CH1, |
| 30 | p.PPI_GROUP0, | 30 | p.PPI_GROUP0, |
| 31 | Irqs, | ||
| 32 | p.P0_08, | 31 | p.P0_08, |
| 33 | p.P0_06, | 32 | p.P0_06, |
| 33 | Irqs, | ||
| 34 | config, | 34 | config, |
| 35 | &mut rx_buffer, | 35 | &mut rx_buffer, |
| 36 | &mut tx_buffer, | 36 | &mut tx_buffer, |
diff --git a/examples/nrf52840/src/bin/channel.rs b/examples/nrf52840/src/bin/channel.rs index 7fcea9dbd..e06ba1c73 100644 --- a/examples/nrf52840/src/bin/channel.rs +++ b/examples/nrf52840/src/bin/channel.rs | |||
| @@ -35,8 +35,8 @@ async fn main(spawner: Spawner) { | |||
| 35 | 35 | ||
| 36 | loop { | 36 | loop { |
| 37 | match CHANNEL.receive().await { | 37 | match CHANNEL.receive().await { |
| 38 | LedState::On => led.set_high(), | 38 | LedState::On => led.set_low(), |
| 39 | LedState::Off => led.set_low(), | 39 | LedState::Off => led.set_high(), |
| 40 | } | 40 | } |
| 41 | } | 41 | } |
| 42 | } | 42 | } |
diff --git a/examples/nrf52840/src/bin/channel_sender_receiver.rs b/examples/nrf52840/src/bin/channel_sender_receiver.rs index 3095a04ec..74c62ca20 100644 --- a/examples/nrf52840/src/bin/channel_sender_receiver.rs +++ b/examples/nrf52840/src/bin/channel_sender_receiver.rs | |||
| @@ -3,7 +3,8 @@ | |||
| 3 | 3 | ||
| 4 | use defmt::unwrap; | 4 | use defmt::unwrap; |
| 5 | use embassy_executor::Spawner; | 5 | use embassy_executor::Spawner; |
| 6 | use embassy_nrf::gpio::{AnyPin, Level, Output, OutputDrive, Pin}; | 6 | use embassy_nrf::gpio::{AnyPin, Level, Output, OutputDrive}; |
| 7 | use embassy_nrf::Peri; | ||
| 7 | use embassy_sync::blocking_mutex::raw::NoopRawMutex; | 8 | use embassy_sync::blocking_mutex::raw::NoopRawMutex; |
| 8 | use embassy_sync::channel::{Channel, Receiver, Sender}; | 9 | use embassy_sync::channel::{Channel, Receiver, Sender}; |
| 9 | use embassy_time::Timer; | 10 | use embassy_time::Timer; |
| @@ -28,13 +29,13 @@ async fn send_task(sender: Sender<'static, NoopRawMutex, LedState, 1>) { | |||
| 28 | } | 29 | } |
| 29 | 30 | ||
| 30 | #[embassy_executor::task] | 31 | #[embassy_executor::task] |
| 31 | async fn recv_task(led: AnyPin, receiver: Receiver<'static, NoopRawMutex, LedState, 1>) { | 32 | async fn recv_task(led: Peri<'static, AnyPin>, receiver: Receiver<'static, NoopRawMutex, LedState, 1>) { |
| 32 | let mut led = Output::new(led, Level::Low, OutputDrive::Standard); | 33 | let mut led = Output::new(led, Level::Low, OutputDrive::Standard); |
| 33 | 34 | ||
| 34 | loop { | 35 | loop { |
| 35 | match receiver.receive().await { | 36 | match receiver.receive().await { |
| 36 | LedState::On => led.set_high(), | 37 | LedState::On => led.set_low(), |
| 37 | LedState::Off => led.set_low(), | 38 | LedState::Off => led.set_high(), |
| 38 | } | 39 | } |
| 39 | } | 40 | } |
| 40 | } | 41 | } |
| @@ -45,5 +46,5 @@ async fn main(spawner: Spawner) { | |||
| 45 | let channel = CHANNEL.init(Channel::new()); | 46 | let channel = CHANNEL.init(Channel::new()); |
| 46 | 47 | ||
| 47 | unwrap!(spawner.spawn(send_task(channel.sender()))); | 48 | unwrap!(spawner.spawn(send_task(channel.sender()))); |
| 48 | unwrap!(spawner.spawn(recv_task(p.P0_13.degrade(), channel.receiver()))); | 49 | unwrap!(spawner.spawn(recv_task(p.P0_13.into(), channel.receiver()))); |
| 49 | } | 50 | } |
diff --git a/examples/nrf52840/src/bin/ethernet_enc28j60.rs b/examples/nrf52840/src/bin/ethernet_enc28j60.rs index 94cf09c88..0946492fe 100644 --- a/examples/nrf52840/src/bin/ethernet_enc28j60.rs +++ b/examples/nrf52840/src/bin/ethernet_enc28j60.rs | |||
| @@ -4,7 +4,7 @@ | |||
| 4 | use defmt::*; | 4 | use defmt::*; |
| 5 | use embassy_executor::Spawner; | 5 | use embassy_executor::Spawner; |
| 6 | use embassy_net::tcp::TcpSocket; | 6 | use embassy_net::tcp::TcpSocket; |
| 7 | use embassy_net::{Stack, StackResources}; | 7 | use embassy_net::StackResources; |
| 8 | use embassy_net_enc28j60::Enc28j60; | 8 | use embassy_net_enc28j60::Enc28j60; |
| 9 | use embassy_nrf::gpio::{Level, Output, OutputDrive}; | 9 | use embassy_nrf::gpio::{Level, Output, OutputDrive}; |
| 10 | use embassy_nrf::rng::Rng; | 10 | use embassy_nrf::rng::Rng; |
| @@ -23,11 +23,12 @@ bind_interrupts!(struct Irqs { | |||
| 23 | 23 | ||
| 24 | #[embassy_executor::task] | 24 | #[embassy_executor::task] |
| 25 | async fn net_task( | 25 | async fn net_task( |
| 26 | stack: &'static Stack< | 26 | mut runner: embassy_net::Runner< |
| 27 | 'static, | ||
| 27 | Enc28j60<ExclusiveDevice<Spim<'static, peripherals::SPI3>, Output<'static>, Delay>, Output<'static>>, | 28 | Enc28j60<ExclusiveDevice<Spim<'static, peripherals::SPI3>, Output<'static>, Delay>, Output<'static>>, |
| 28 | >, | 29 | >, |
| 29 | ) -> ! { | 30 | ) -> ! { |
| 30 | stack.run().await | 31 | runner.run().await |
| 31 | } | 32 | } |
| 32 | 33 | ||
| 33 | #[embassy_executor::main] | 34 | #[embassy_executor::main] |
| @@ -67,12 +68,9 @@ async fn main(spawner: Spawner) { | |||
| 67 | 68 | ||
| 68 | // Init network stack | 69 | // Init network stack |
| 69 | static RESOURCES: StaticCell<StackResources<3>> = StaticCell::new(); | 70 | static RESOURCES: StaticCell<StackResources<3>> = StaticCell::new(); |
| 70 | static STACK: StaticCell< | 71 | let (stack, runner) = embassy_net::new(device, config, RESOURCES.init(StackResources::new()), seed); |
| 71 | Stack<Enc28j60<ExclusiveDevice<Spim<'static, peripherals::SPI3>, Output<'static>, Delay>, Output<'static>>>, | ||
| 72 | > = StaticCell::new(); | ||
| 73 | let stack = STACK.init(Stack::new(device, config, RESOURCES.init(StackResources::new()), seed)); | ||
| 74 | 72 | ||
| 75 | unwrap!(spawner.spawn(net_task(stack))); | 73 | unwrap!(spawner.spawn(net_task(runner))); |
| 76 | 74 | ||
| 77 | // And now we can use it! | 75 | // And now we can use it! |
| 78 | 76 | ||
diff --git a/examples/nrf52840/src/bin/ieee802154_receive.rs b/examples/nrf52840/src/bin/ieee802154_receive.rs new file mode 100644 index 000000000..ede8fca65 --- /dev/null +++ b/examples/nrf52840/src/bin/ieee802154_receive.rs | |||
| @@ -0,0 +1,38 @@ | |||
| 1 | #![no_std] | ||
| 2 | #![no_main] | ||
| 3 | |||
| 4 | use embassy_executor::Spawner; | ||
| 5 | use embassy_nrf::config::{Config, HfclkSource}; | ||
| 6 | use embassy_nrf::gpio::{Level, Output, OutputDrive}; | ||
| 7 | use embassy_nrf::radio::ieee802154::{self, Packet}; | ||
| 8 | use embassy_nrf::{peripherals, radio}; | ||
| 9 | use embassy_time::Timer; | ||
| 10 | use {defmt_rtt as _, panic_probe as _}; | ||
| 11 | |||
| 12 | embassy_nrf::bind_interrupts!(struct Irqs { | ||
| 13 | RADIO => radio::InterruptHandler<peripherals::RADIO>; | ||
| 14 | }); | ||
| 15 | |||
| 16 | #[embassy_executor::main] | ||
| 17 | async fn main(_spawner: Spawner) { | ||
| 18 | let mut config = Config::default(); | ||
| 19 | config.hfclk_source = HfclkSource::ExternalXtal; | ||
| 20 | let peripherals = embassy_nrf::init(config); | ||
| 21 | |||
| 22 | // assumes LED on P0_15 with active-high polarity | ||
| 23 | let mut gpo_led = Output::new(peripherals.P0_15, Level::Low, OutputDrive::Standard); | ||
| 24 | |||
| 25 | let mut radio = ieee802154::Radio::new(peripherals.RADIO, Irqs); | ||
| 26 | let mut packet = Packet::new(); | ||
| 27 | |||
| 28 | loop { | ||
| 29 | gpo_led.set_low(); | ||
| 30 | let rv = radio.receive(&mut packet).await; | ||
| 31 | gpo_led.set_high(); | ||
| 32 | match rv { | ||
| 33 | Err(_) => defmt::error!("receive() Err"), | ||
| 34 | Ok(_) => defmt::info!("receive() {:?}", *packet), | ||
| 35 | } | ||
| 36 | Timer::after_millis(100u64).await; | ||
| 37 | } | ||
| 38 | } | ||
diff --git a/examples/nrf52840/src/bin/ieee802154_send.rs b/examples/nrf52840/src/bin/ieee802154_send.rs new file mode 100644 index 000000000..7af9d1d06 --- /dev/null +++ b/examples/nrf52840/src/bin/ieee802154_send.rs | |||
| @@ -0,0 +1,39 @@ | |||
| 1 | #![no_std] | ||
| 2 | #![no_main] | ||
| 3 | |||
| 4 | use embassy_executor::Spawner; | ||
| 5 | use embassy_nrf::config::{Config, HfclkSource}; | ||
| 6 | use embassy_nrf::gpio::{Level, Output, OutputDrive}; | ||
| 7 | use embassy_nrf::radio::ieee802154::{self, Packet}; | ||
| 8 | use embassy_nrf::{peripherals, radio}; | ||
| 9 | use embassy_time::Timer; | ||
| 10 | use {defmt_rtt as _, panic_probe as _}; | ||
| 11 | |||
| 12 | embassy_nrf::bind_interrupts!(struct Irqs { | ||
| 13 | RADIO => radio::InterruptHandler<peripherals::RADIO>; | ||
| 14 | }); | ||
| 15 | |||
| 16 | #[embassy_executor::main] | ||
| 17 | async fn main(_spawner: Spawner) { | ||
| 18 | let mut config = Config::default(); | ||
| 19 | config.hfclk_source = HfclkSource::ExternalXtal; | ||
| 20 | let peripherals = embassy_nrf::init(config); | ||
| 21 | |||
| 22 | // assumes LED on P0_15 with active-high polarity | ||
| 23 | let mut gpo_led = Output::new(peripherals.P0_15, Level::Low, OutputDrive::Standard); | ||
| 24 | |||
| 25 | let mut radio = ieee802154::Radio::new(peripherals.RADIO, Irqs); | ||
| 26 | let mut packet = Packet::new(); | ||
| 27 | |||
| 28 | loop { | ||
| 29 | packet.copy_from_slice(&[0_u8; 16]); | ||
| 30 | gpo_led.set_high(); | ||
| 31 | let rv = radio.try_send(&mut packet).await; | ||
| 32 | gpo_led.set_low(); | ||
| 33 | match rv { | ||
| 34 | Err(_) => defmt::error!("try_send() Err"), | ||
| 35 | Ok(_) => defmt::info!("try_send() {:?}", *packet), | ||
| 36 | } | ||
| 37 | Timer::after_millis(1000u64).await; | ||
| 38 | } | ||
| 39 | } | ||
diff --git a/examples/nrf52840/src/bin/multiprio.rs b/examples/nrf52840/src/bin/multiprio.rs index 797be93a7..d58613da4 100644 --- a/examples/nrf52840/src/bin/multiprio.rs +++ b/examples/nrf52840/src/bin/multiprio.rs | |||
| @@ -112,12 +112,12 @@ static EXECUTOR_MED: InterruptExecutor = InterruptExecutor::new(); | |||
| 112 | static EXECUTOR_LOW: StaticCell<Executor> = StaticCell::new(); | 112 | static EXECUTOR_LOW: StaticCell<Executor> = StaticCell::new(); |
| 113 | 113 | ||
| 114 | #[interrupt] | 114 | #[interrupt] |
| 115 | unsafe fn SWI1_EGU1() { | 115 | unsafe fn EGU1_SWI1() { |
| 116 | EXECUTOR_HIGH.on_interrupt() | 116 | EXECUTOR_HIGH.on_interrupt() |
| 117 | } | 117 | } |
| 118 | 118 | ||
| 119 | #[interrupt] | 119 | #[interrupt] |
| 120 | unsafe fn SWI0_EGU0() { | 120 | unsafe fn EGU0_SWI0() { |
| 121 | EXECUTOR_MED.on_interrupt() | 121 | EXECUTOR_MED.on_interrupt() |
| 122 | } | 122 | } |
| 123 | 123 | ||
| @@ -127,14 +127,14 @@ fn main() -> ! { | |||
| 127 | 127 | ||
| 128 | let _p = embassy_nrf::init(Default::default()); | 128 | let _p = embassy_nrf::init(Default::default()); |
| 129 | 129 | ||
| 130 | // High-priority executor: SWI1_EGU1, priority level 6 | 130 | // High-priority executor: EGU1_SWI1, priority level 6 |
| 131 | interrupt::SWI1_EGU1.set_priority(Priority::P6); | 131 | interrupt::EGU1_SWI1.set_priority(Priority::P6); |
| 132 | let spawner = EXECUTOR_HIGH.start(interrupt::SWI1_EGU1); | 132 | let spawner = EXECUTOR_HIGH.start(interrupt::EGU1_SWI1); |
| 133 | unwrap!(spawner.spawn(run_high())); | 133 | unwrap!(spawner.spawn(run_high())); |
| 134 | 134 | ||
| 135 | // Medium-priority executor: SWI0_EGU0, priority level 7 | 135 | // Medium-priority executor: EGU0_SWI0, priority level 7 |
| 136 | interrupt::SWI0_EGU0.set_priority(Priority::P7); | 136 | interrupt::EGU0_SWI0.set_priority(Priority::P7); |
| 137 | let spawner = EXECUTOR_MED.start(interrupt::SWI0_EGU0); | 137 | let spawner = EXECUTOR_MED.start(interrupt::EGU0_SWI0); |
| 138 | unwrap!(spawner.spawn(run_med())); | 138 | unwrap!(spawner.spawn(run_med())); |
| 139 | 139 | ||
| 140 | // Low priority executor: runs in thread mode, using WFE/SEV | 140 | // Low priority executor: runs in thread mode, using WFE/SEV |
diff --git a/examples/nrf52840/src/bin/nfct.rs b/examples/nrf52840/src/bin/nfct.rs new file mode 100644 index 000000000..d559d006a --- /dev/null +++ b/examples/nrf52840/src/bin/nfct.rs | |||
| @@ -0,0 +1,79 @@ | |||
| 1 | #![no_std] | ||
| 2 | #![no_main] | ||
| 3 | |||
| 4 | use defmt::*; | ||
| 5 | use embassy_executor::Spawner; | ||
| 6 | use embassy_nrf::config::HfclkSource; | ||
| 7 | use embassy_nrf::nfct::{Config as NfcConfig, NfcId, NfcT}; | ||
| 8 | use embassy_nrf::{bind_interrupts, nfct}; | ||
| 9 | use {defmt_rtt as _, embassy_nrf as _, panic_probe as _}; | ||
| 10 | |||
| 11 | bind_interrupts!(struct Irqs { | ||
| 12 | NFCT => nfct::InterruptHandler; | ||
| 13 | }); | ||
| 14 | |||
| 15 | #[embassy_executor::main] | ||
| 16 | async fn main(_spawner: Spawner) { | ||
| 17 | let mut config = embassy_nrf::config::Config::default(); | ||
| 18 | config.hfclk_source = HfclkSource::ExternalXtal; | ||
| 19 | let p = embassy_nrf::init(config); | ||
| 20 | |||
| 21 | dbg!("Setting up..."); | ||
| 22 | let config = NfcConfig { | ||
| 23 | nfcid1: NfcId::DoubleSize([0x04, 0x68, 0x95, 0x71, 0xFA, 0x5C, 0x64]), | ||
| 24 | sdd_pat: nfct::SddPat::SDD00100, | ||
| 25 | plat_conf: 0b0000, | ||
| 26 | protocol: nfct::SelResProtocol::Type4A, | ||
| 27 | }; | ||
| 28 | |||
| 29 | let mut nfc = NfcT::new(p.NFCT, Irqs, &config); | ||
| 30 | |||
| 31 | let mut buf = [0u8; 256]; | ||
| 32 | |||
| 33 | loop { | ||
| 34 | info!("activating"); | ||
| 35 | nfc.activate().await; | ||
| 36 | |||
| 37 | loop { | ||
| 38 | info!("rxing"); | ||
| 39 | let n = match nfc.receive(&mut buf).await { | ||
| 40 | Ok(n) => n, | ||
| 41 | Err(e) => { | ||
| 42 | error!("rx error {}", e); | ||
| 43 | break; | ||
| 44 | } | ||
| 45 | }; | ||
| 46 | let req = &buf[..n]; | ||
| 47 | info!("received frame {:02x}", req); | ||
| 48 | |||
| 49 | let mut deselect = false; | ||
| 50 | let resp = match req { | ||
| 51 | [0xe0, ..] => { | ||
| 52 | info!("Got RATS, tx'ing ATS"); | ||
| 53 | &[0x06, 0x77, 0x77, 0x81, 0x02, 0x80][..] | ||
| 54 | } | ||
| 55 | [0xc2] => { | ||
| 56 | info!("Got deselect!"); | ||
| 57 | deselect = true; | ||
| 58 | &[0xc2] | ||
| 59 | } | ||
| 60 | _ => { | ||
| 61 | info!("Got unknown command!"); | ||
| 62 | &[0xFF] | ||
| 63 | } | ||
| 64 | }; | ||
| 65 | |||
| 66 | match nfc.transmit(resp).await { | ||
| 67 | Ok(()) => {} | ||
| 68 | Err(e) => { | ||
| 69 | error!("tx error {}", e); | ||
| 70 | break; | ||
| 71 | } | ||
| 72 | } | ||
| 73 | |||
| 74 | if deselect { | ||
| 75 | break; | ||
| 76 | } | ||
| 77 | } | ||
| 78 | } | ||
| 79 | } | ||
diff --git a/examples/nrf52840/src/bin/pdm_continuous.rs b/examples/nrf52840/src/bin/pdm_continuous.rs index e948203a5..0d76636b0 100644 --- a/examples/nrf52840/src/bin/pdm_continuous.rs +++ b/examples/nrf52840/src/bin/pdm_continuous.rs | |||
| @@ -20,14 +20,14 @@ bind_interrupts!(struct Irqs { | |||
| 20 | 20 | ||
| 21 | #[embassy_executor::main] | 21 | #[embassy_executor::main] |
| 22 | async fn main(_p: Spawner) { | 22 | async fn main(_p: Spawner) { |
| 23 | let mut p = embassy_nrf::init(Default::default()); | 23 | let p = embassy_nrf::init(Default::default()); |
| 24 | let mut config = Config::default(); | 24 | let mut config = Config::default(); |
| 25 | // Pins are correct for the onboard microphone on the Feather nRF52840 Sense. | 25 | // Pins are correct for the onboard microphone on the Feather nRF52840 Sense. |
| 26 | config.frequency = Frequency::_1280K; // 16 kHz sample rate | 26 | config.frequency = Frequency::_1280K; // 16 kHz sample rate |
| 27 | config.ratio = Ratio::RATIO80; | 27 | config.ratio = Ratio::RATIO80; |
| 28 | config.operation_mode = OperationMode::Mono; | 28 | config.operation_mode = OperationMode::Mono; |
| 29 | config.gain_left = I7F1::from_bits(5); // 2.5 dB | 29 | config.gain_left = I7F1::from_bits(5); // 2.5 dB |
| 30 | let mut pdm = Pdm::new(p.PDM, Irqs, &mut p.P0_00, &mut p.P0_01, config); | 30 | let mut pdm = Pdm::new(p.PDM, Irqs, p.P0_00, p.P0_01, config); |
| 31 | 31 | ||
| 32 | let mut bufs = [[0; 1024]; 2]; | 32 | let mut bufs = [[0; 1024]; 2]; |
| 33 | 33 | ||
diff --git a/examples/nrf52840/src/bin/pwm_sequence_ws2812b.rs b/examples/nrf52840/src/bin/pwm_sequence_ws2812b.rs index 751cf4425..df8da8800 100644 --- a/examples/nrf52840/src/bin/pwm_sequence_ws2812b.rs +++ b/examples/nrf52840/src/bin/pwm_sequence_ws2812b.rs | |||
| @@ -14,6 +14,16 @@ use {defmt_rtt as _, panic_probe as _}; | |||
| 14 | // https://cdn-shop.adafruit.com/datasheets/WS2812B.pdf. | 14 | // https://cdn-shop.adafruit.com/datasheets/WS2812B.pdf. |
| 15 | // This demo lights up a single LED in blue. It then proceeds | 15 | // This demo lights up a single LED in blue. It then proceeds |
| 16 | // to pulsate the LED rapidly. | 16 | // to pulsate the LED rapidly. |
| 17 | // | ||
| 18 | // /!\ NOTE FOR nRF52840-DK users /!\ | ||
| 19 | // | ||
| 20 | // If you're using the nRF52840-DK, the default "Vdd" power source | ||
| 21 | // will set the GPIO I/O voltage to 3.0v, using the onboard regulator. | ||
| 22 | // This can sometimes not be enough to drive the WS2812B signal if you | ||
| 23 | // are not using an external level shifter. If you set the board to "USB" | ||
| 24 | // power instead (and provide power via the "nRF USB" connector), the board | ||
| 25 | // will instead power the I/Os at 3.3v, which is often enough (but still | ||
| 26 | // out of official spec) for the WS2812Bs to work properly. | ||
| 17 | 27 | ||
| 18 | // In the following declarations, setting the high bit tells the PWM | 28 | // In the following declarations, setting the high bit tells the PWM |
| 19 | // to reverse polarity, which is what the WS2812B expects. | 29 | // to reverse polarity, which is what the WS2812B expects. |
diff --git a/examples/nrf52840/src/bin/qspi_lowpower.rs b/examples/nrf52840/src/bin/qspi_lowpower.rs index 516c9b481..238a0d941 100644 --- a/examples/nrf52840/src/bin/qspi_lowpower.rs +++ b/examples/nrf52840/src/bin/qspi_lowpower.rs | |||
| @@ -37,14 +37,14 @@ async fn main(_p: Spawner) { | |||
| 37 | }); | 37 | }); |
| 38 | 38 | ||
| 39 | let mut q = qspi::Qspi::new( | 39 | let mut q = qspi::Qspi::new( |
| 40 | &mut p.QSPI, | 40 | p.QSPI.reborrow(), |
| 41 | Irqs, | 41 | Irqs, |
| 42 | &mut p.P0_19, | 42 | p.P0_19.reborrow(), |
| 43 | &mut p.P0_17, | 43 | p.P0_17.reborrow(), |
| 44 | &mut p.P0_20, | 44 | p.P0_20.reborrow(), |
| 45 | &mut p.P0_21, | 45 | p.P0_21.reborrow(), |
| 46 | &mut p.P0_22, | 46 | p.P0_22.reborrow(), |
| 47 | &mut p.P0_23, | 47 | p.P0_23.reborrow(), |
| 48 | config, | 48 | config, |
| 49 | ); | 49 | ); |
| 50 | 50 | ||
diff --git a/examples/nrf52840/src/bin/rng.rs b/examples/nrf52840/src/bin/rng.rs index 326054c9a..f32d17cd9 100644..100755 --- a/examples/nrf52840/src/bin/rng.rs +++ b/examples/nrf52840/src/bin/rng.rs | |||
| @@ -22,7 +22,7 @@ async fn main(_spawner: Spawner) { | |||
| 22 | defmt::info!("Some random bytes: {:?}", bytes); | 22 | defmt::info!("Some random bytes: {:?}", bytes); |
| 23 | 23 | ||
| 24 | // Sync API with `rand` | 24 | // Sync API with `rand` |
| 25 | defmt::info!("A random number from 1 to 10: {:?}", rng.gen_range(1..=10)); | 25 | defmt::info!("A random number from 1 to 10: {:?}", rng.random_range(1..=10)); |
| 26 | 26 | ||
| 27 | let mut bytes = [0; 1024]; | 27 | let mut bytes = [0; 1024]; |
| 28 | rng.fill_bytes(&mut bytes).await; | 28 | rng.fill_bytes(&mut bytes).await; |
diff --git a/examples/nrf52840/src/bin/saadc.rs b/examples/nrf52840/src/bin/saadc.rs index 653b7d606..cf2d860ab 100644 --- a/examples/nrf52840/src/bin/saadc.rs +++ b/examples/nrf52840/src/bin/saadc.rs | |||
| @@ -16,7 +16,7 @@ bind_interrupts!(struct Irqs { | |||
| 16 | async fn main(_p: Spawner) { | 16 | async fn main(_p: Spawner) { |
| 17 | let mut p = embassy_nrf::init(Default::default()); | 17 | let mut p = embassy_nrf::init(Default::default()); |
| 18 | let config = Config::default(); | 18 | let config = Config::default(); |
| 19 | let channel_config = ChannelConfig::single_ended(&mut p.P0_02); | 19 | let channel_config = ChannelConfig::single_ended(p.P0_02.reborrow()); |
| 20 | let mut saadc = Saadc::new(p.SAADC, Irqs, config, [channel_config]); | 20 | let mut saadc = Saadc::new(p.SAADC, Irqs, config, [channel_config]); |
| 21 | 21 | ||
| 22 | loop { | 22 | loop { |
diff --git a/examples/nrf52840/src/bin/saadc_continuous.rs b/examples/nrf52840/src/bin/saadc_continuous.rs index f76fa3570..e8f169c8c 100644 --- a/examples/nrf52840/src/bin/saadc_continuous.rs +++ b/examples/nrf52840/src/bin/saadc_continuous.rs | |||
| @@ -18,9 +18,9 @@ bind_interrupts!(struct Irqs { | |||
| 18 | async fn main(_p: Spawner) { | 18 | async fn main(_p: Spawner) { |
| 19 | let mut p = embassy_nrf::init(Default::default()); | 19 | let mut p = embassy_nrf::init(Default::default()); |
| 20 | let config = Config::default(); | 20 | let config = Config::default(); |
| 21 | let channel_1_config = ChannelConfig::single_ended(&mut p.P0_02); | 21 | let channel_1_config = ChannelConfig::single_ended(p.P0_02.reborrow()); |
| 22 | let channel_2_config = ChannelConfig::single_ended(&mut p.P0_03); | 22 | let channel_2_config = ChannelConfig::single_ended(p.P0_03.reborrow()); |
| 23 | let channel_3_config = ChannelConfig::single_ended(&mut p.P0_04); | 23 | let channel_3_config = ChannelConfig::single_ended(p.P0_04.reborrow()); |
| 24 | let mut saadc = Saadc::new( | 24 | let mut saadc = Saadc::new( |
| 25 | p.SAADC, | 25 | p.SAADC, |
| 26 | Irqs, | 26 | Irqs, |
| @@ -40,9 +40,9 @@ async fn main(_p: Spawner) { | |||
| 40 | 40 | ||
| 41 | saadc | 41 | saadc |
| 42 | .run_task_sampler( | 42 | .run_task_sampler( |
| 43 | &mut p.TIMER0, | 43 | p.TIMER0.reborrow(), |
| 44 | &mut p.PPI_CH0, | 44 | p.PPI_CH0.reborrow(), |
| 45 | &mut p.PPI_CH1, | 45 | p.PPI_CH1.reborrow(), |
| 46 | Frequency::F1MHz, | 46 | Frequency::F1MHz, |
| 47 | 1000, // We want to sample at 1KHz | 47 | 1000, // We want to sample at 1KHz |
| 48 | &mut bufs, | 48 | &mut bufs, |
diff --git a/examples/nrf52840/src/bin/spis.rs b/examples/nrf52840/src/bin/spis.rs index 613cd37ab..4f28da07e 100644 --- a/examples/nrf52840/src/bin/spis.rs +++ b/examples/nrf52840/src/bin/spis.rs | |||
| @@ -8,7 +8,7 @@ use embassy_nrf::{bind_interrupts, peripherals, spis}; | |||
| 8 | use {defmt_rtt as _, panic_probe as _}; | 8 | use {defmt_rtt as _, panic_probe as _}; |
| 9 | 9 | ||
| 10 | bind_interrupts!(struct Irqs { | 10 | bind_interrupts!(struct Irqs { |
| 11 | SPIM2_SPIS2_SPI2 => spis::InterruptHandler<peripherals::SPI2>; | 11 | SPI2 => spis::InterruptHandler<peripherals::SPI2>; |
| 12 | }); | 12 | }); |
| 13 | 13 | ||
| 14 | #[embassy_executor::main] | 14 | #[embassy_executor::main] |
diff --git a/examples/nrf52840/src/bin/twim.rs b/examples/nrf52840/src/bin/twim.rs index a9a0765e8..e30a3855d 100644 --- a/examples/nrf52840/src/bin/twim.rs +++ b/examples/nrf52840/src/bin/twim.rs | |||
| @@ -9,12 +9,13 @@ use defmt::*; | |||
| 9 | use embassy_executor::Spawner; | 9 | use embassy_executor::Spawner; |
| 10 | use embassy_nrf::twim::{self, Twim}; | 10 | use embassy_nrf::twim::{self, Twim}; |
| 11 | use embassy_nrf::{bind_interrupts, peripherals}; | 11 | use embassy_nrf::{bind_interrupts, peripherals}; |
| 12 | use static_cell::ConstStaticCell; | ||
| 12 | use {defmt_rtt as _, panic_probe as _}; | 13 | use {defmt_rtt as _, panic_probe as _}; |
| 13 | 14 | ||
| 14 | const ADDRESS: u8 = 0x50; | 15 | const ADDRESS: u8 = 0x50; |
| 15 | 16 | ||
| 16 | bind_interrupts!(struct Irqs { | 17 | bind_interrupts!(struct Irqs { |
| 17 | SPIM0_SPIS0_TWIM0_TWIS0_SPI0_TWI0 => twim::InterruptHandler<peripherals::TWISPI0>; | 18 | TWISPI0 => twim::InterruptHandler<peripherals::TWISPI0>; |
| 18 | }); | 19 | }); |
| 19 | 20 | ||
| 20 | #[embassy_executor::main] | 21 | #[embassy_executor::main] |
| @@ -22,7 +23,8 @@ async fn main(_spawner: Spawner) { | |||
| 22 | let p = embassy_nrf::init(Default::default()); | 23 | let p = embassy_nrf::init(Default::default()); |
| 23 | info!("Initializing TWI..."); | 24 | info!("Initializing TWI..."); |
| 24 | let config = twim::Config::default(); | 25 | let config = twim::Config::default(); |
| 25 | let mut twi = Twim::new(p.TWISPI0, Irqs, p.P0_03, p.P0_04, config); | 26 | static RAM_BUFFER: ConstStaticCell<[u8; 16]> = ConstStaticCell::new([0; 16]); |
| 27 | let mut twi = Twim::new(p.TWISPI0, Irqs, p.P0_03, p.P0_04, config, RAM_BUFFER.take()); | ||
| 26 | 28 | ||
| 27 | info!("Reading..."); | 29 | info!("Reading..."); |
| 28 | 30 | ||
diff --git a/examples/nrf52840/src/bin/twim_lowpower.rs b/examples/nrf52840/src/bin/twim_lowpower.rs index c743614b8..f7380e20d 100644 --- a/examples/nrf52840/src/bin/twim_lowpower.rs +++ b/examples/nrf52840/src/bin/twim_lowpower.rs | |||
| @@ -19,7 +19,7 @@ use {defmt_rtt as _, panic_probe as _}; | |||
| 19 | const ADDRESS: u8 = 0x50; | 19 | const ADDRESS: u8 = 0x50; |
| 20 | 20 | ||
| 21 | bind_interrupts!(struct Irqs { | 21 | bind_interrupts!(struct Irqs { |
| 22 | SPIM0_SPIS0_TWIM0_TWIS0_SPI0_TWI0 => twim::InterruptHandler<peripherals::TWISPI0>; | 22 | TWISPI0 => twim::InterruptHandler<peripherals::TWISPI0>; |
| 23 | }); | 23 | }); |
| 24 | 24 | ||
| 25 | #[embassy_executor::main] | 25 | #[embassy_executor::main] |
| @@ -30,9 +30,17 @@ async fn main(_p: Spawner) { | |||
| 30 | loop { | 30 | loop { |
| 31 | info!("Initializing TWI..."); | 31 | info!("Initializing TWI..."); |
| 32 | let config = twim::Config::default(); | 32 | let config = twim::Config::default(); |
| 33 | let mut ram_buffer = [0u8; 16]; | ||
| 33 | 34 | ||
| 34 | // Create the TWIM instance with borrowed singletons, so they're not consumed. | 35 | // Create the TWIM instance with borrowed singletons, so they're not consumed. |
| 35 | let mut twi = Twim::new(&mut p.TWISPI0, Irqs, &mut p.P0_03, &mut p.P0_04, config); | 36 | let mut twi = Twim::new( |
| 37 | p.TWISPI0.reborrow(), | ||
| 38 | Irqs, | ||
| 39 | p.P0_03.reborrow(), | ||
| 40 | p.P0_04.reborrow(), | ||
| 41 | config, | ||
| 42 | &mut ram_buffer, | ||
| 43 | ); | ||
| 36 | 44 | ||
| 37 | info!("Reading..."); | 45 | info!("Reading..."); |
| 38 | 46 | ||
diff --git a/examples/nrf52840/src/bin/twis.rs b/examples/nrf52840/src/bin/twis.rs index 88bd4cceb..856b34140 100644 --- a/examples/nrf52840/src/bin/twis.rs +++ b/examples/nrf52840/src/bin/twis.rs | |||
| @@ -10,7 +10,7 @@ use embassy_nrf::{bind_interrupts, peripherals}; | |||
| 10 | use {defmt_rtt as _, panic_probe as _}; | 10 | use {defmt_rtt as _, panic_probe as _}; |
| 11 | 11 | ||
| 12 | bind_interrupts!(struct Irqs { | 12 | bind_interrupts!(struct Irqs { |
| 13 | SPIM0_SPIS0_TWIM0_TWIS0_SPI0_TWI0 => twis::InterruptHandler<peripherals::TWISPI0>; | 13 | TWISPI0 => twis::InterruptHandler<peripherals::TWISPI0>; |
| 14 | }); | 14 | }); |
| 15 | 15 | ||
| 16 | #[embassy_executor::main] | 16 | #[embassy_executor::main] |
diff --git a/examples/nrf52840/src/bin/uart.rs b/examples/nrf52840/src/bin/uart.rs index accaccea1..f9f8d74ab 100644 --- a/examples/nrf52840/src/bin/uart.rs +++ b/examples/nrf52840/src/bin/uart.rs | |||
| @@ -7,7 +7,7 @@ use embassy_nrf::{bind_interrupts, peripherals, uarte}; | |||
| 7 | use {defmt_rtt as _, panic_probe as _}; | 7 | use {defmt_rtt as _, panic_probe as _}; |
| 8 | 8 | ||
| 9 | bind_interrupts!(struct Irqs { | 9 | bind_interrupts!(struct Irqs { |
| 10 | UARTE0_UART0 => uarte::InterruptHandler<peripherals::UARTE0>; | 10 | UARTE0 => uarte::InterruptHandler<peripherals::UARTE0>; |
| 11 | }); | 11 | }); |
| 12 | 12 | ||
| 13 | #[embassy_executor::main] | 13 | #[embassy_executor::main] |
| @@ -17,7 +17,7 @@ async fn main(_spawner: Spawner) { | |||
| 17 | config.parity = uarte::Parity::EXCLUDED; | 17 | config.parity = uarte::Parity::EXCLUDED; |
| 18 | config.baudrate = uarte::Baudrate::BAUD115200; | 18 | config.baudrate = uarte::Baudrate::BAUD115200; |
| 19 | 19 | ||
| 20 | let mut uart = uarte::Uarte::new(p.UARTE0, Irqs, p.P0_08, p.P0_06, config); | 20 | let mut uart = uarte::Uarte::new(p.UARTE0, p.P0_08, p.P0_06, Irqs, config); |
| 21 | 21 | ||
| 22 | info!("uarte initialized!"); | 22 | info!("uarte initialized!"); |
| 23 | 23 | ||
diff --git a/examples/nrf52840/src/bin/uart_idle.rs b/examples/nrf52840/src/bin/uart_idle.rs index fa93bcf21..00e3ae904 100644 --- a/examples/nrf52840/src/bin/uart_idle.rs +++ b/examples/nrf52840/src/bin/uart_idle.rs | |||
| @@ -8,7 +8,7 @@ use embassy_nrf::{bind_interrupts, uarte}; | |||
| 8 | use {defmt_rtt as _, panic_probe as _}; | 8 | use {defmt_rtt as _, panic_probe as _}; |
| 9 | 9 | ||
| 10 | bind_interrupts!(struct Irqs { | 10 | bind_interrupts!(struct Irqs { |
| 11 | UARTE0_UART0 => uarte::InterruptHandler<UARTE0>; | 11 | UARTE0 => uarte::InterruptHandler<UARTE0>; |
| 12 | }); | 12 | }); |
| 13 | 13 | ||
| 14 | #[embassy_executor::main] | 14 | #[embassy_executor::main] |
| @@ -18,7 +18,7 @@ async fn main(_spawner: Spawner) { | |||
| 18 | config.parity = uarte::Parity::EXCLUDED; | 18 | config.parity = uarte::Parity::EXCLUDED; |
| 19 | config.baudrate = uarte::Baudrate::BAUD115200; | 19 | config.baudrate = uarte::Baudrate::BAUD115200; |
| 20 | 20 | ||
| 21 | let uart = uarte::Uarte::new(p.UARTE0, Irqs, p.P0_08, p.P0_06, config); | 21 | let uart = uarte::Uarte::new(p.UARTE0, p.P0_08, p.P0_06, Irqs, config); |
| 22 | let (mut tx, mut rx) = uart.split_with_idle(p.TIMER0, p.PPI_CH0, p.PPI_CH1); | 22 | let (mut tx, mut rx) = uart.split_with_idle(p.TIMER0, p.PPI_CH0, p.PPI_CH1); |
| 23 | 23 | ||
| 24 | info!("uarte initialized!"); | 24 | info!("uarte initialized!"); |
diff --git a/examples/nrf52840/src/bin/uart_split.rs b/examples/nrf52840/src/bin/uart_split.rs index c7510a9a8..46be8f636 100644 --- a/examples/nrf52840/src/bin/uart_split.rs +++ b/examples/nrf52840/src/bin/uart_split.rs | |||
| @@ -13,7 +13,7 @@ use {defmt_rtt as _, panic_probe as _}; | |||
| 13 | static CHANNEL: Channel<ThreadModeRawMutex, [u8; 8], 1> = Channel::new(); | 13 | static CHANNEL: Channel<ThreadModeRawMutex, [u8; 8], 1> = Channel::new(); |
| 14 | 14 | ||
| 15 | bind_interrupts!(struct Irqs { | 15 | bind_interrupts!(struct Irqs { |
| 16 | UARTE0_UART0 => uarte::InterruptHandler<UARTE0>; | 16 | UARTE0 => uarte::InterruptHandler<UARTE0>; |
| 17 | }); | 17 | }); |
| 18 | 18 | ||
| 19 | #[embassy_executor::main] | 19 | #[embassy_executor::main] |
| @@ -23,7 +23,7 @@ async fn main(spawner: Spawner) { | |||
| 23 | config.parity = uarte::Parity::EXCLUDED; | 23 | config.parity = uarte::Parity::EXCLUDED; |
| 24 | config.baudrate = uarte::Baudrate::BAUD115200; | 24 | config.baudrate = uarte::Baudrate::BAUD115200; |
| 25 | 25 | ||
| 26 | let uart = uarte::Uarte::new(p.UARTE0, Irqs, p.P0_08, p.P0_06, config); | 26 | let uart = uarte::Uarte::new(p.UARTE0, p.P0_08, p.P0_06, Irqs, config); |
| 27 | let (mut tx, rx) = uart.split(); | 27 | let (mut tx, rx) = uart.split(); |
| 28 | 28 | ||
| 29 | info!("uarte initialized!"); | 29 | info!("uarte initialized!"); |
diff --git a/examples/nrf52840/src/bin/usb_ethernet.rs b/examples/nrf52840/src/bin/usb_ethernet.rs index e56b215e3..49856012d 100644 --- a/examples/nrf52840/src/bin/usb_ethernet.rs +++ b/examples/nrf52840/src/bin/usb_ethernet.rs | |||
| @@ -1,12 +1,10 @@ | |||
| 1 | #![no_std] | 1 | #![no_std] |
| 2 | #![no_main] | 2 | #![no_main] |
| 3 | 3 | ||
| 4 | use core::mem; | ||
| 5 | |||
| 6 | use defmt::*; | 4 | use defmt::*; |
| 7 | use embassy_executor::Spawner; | 5 | use embassy_executor::Spawner; |
| 8 | use embassy_net::tcp::TcpSocket; | 6 | use embassy_net::tcp::TcpSocket; |
| 9 | use embassy_net::{Stack, StackResources}; | 7 | use embassy_net::StackResources; |
| 10 | use embassy_nrf::rng::Rng; | 8 | use embassy_nrf::rng::Rng; |
| 11 | use embassy_nrf::usb::vbus_detect::HardwareVbusDetect; | 9 | use embassy_nrf::usb::vbus_detect::HardwareVbusDetect; |
| 12 | use embassy_nrf::usb::Driver; | 10 | use embassy_nrf::usb::Driver; |
| @@ -20,7 +18,7 @@ use {defmt_rtt as _, panic_probe as _}; | |||
| 20 | 18 | ||
| 21 | bind_interrupts!(struct Irqs { | 19 | bind_interrupts!(struct Irqs { |
| 22 | USBD => usb::InterruptHandler<peripherals::USBD>; | 20 | USBD => usb::InterruptHandler<peripherals::USBD>; |
| 23 | POWER_CLOCK => usb::vbus_detect::InterruptHandler; | 21 | CLOCK_POWER => usb::vbus_detect::InterruptHandler; |
| 24 | RNG => rng::InterruptHandler<peripherals::RNG>; | 22 | RNG => rng::InterruptHandler<peripherals::RNG>; |
| 25 | }); | 23 | }); |
| 26 | 24 | ||
| @@ -39,18 +37,17 @@ async fn usb_ncm_task(class: Runner<'static, MyDriver, MTU>) -> ! { | |||
| 39 | } | 37 | } |
| 40 | 38 | ||
| 41 | #[embassy_executor::task] | 39 | #[embassy_executor::task] |
| 42 | async fn net_task(stack: &'static Stack<Device<'static, MTU>>) -> ! { | 40 | async fn net_task(mut runner: embassy_net::Runner<'static, Device<'static, MTU>>) -> ! { |
| 43 | stack.run().await | 41 | runner.run().await |
| 44 | } | 42 | } |
| 45 | 43 | ||
| 46 | #[embassy_executor::main] | 44 | #[embassy_executor::main] |
| 47 | async fn main(spawner: Spawner) { | 45 | async fn main(spawner: Spawner) { |
| 48 | let p = embassy_nrf::init(Default::default()); | 46 | let p = embassy_nrf::init(Default::default()); |
| 49 | let clock: pac::CLOCK = unsafe { mem::transmute(()) }; | ||
| 50 | 47 | ||
| 51 | info!("Enabling ext hfosc..."); | 48 | info!("Enabling ext hfosc..."); |
| 52 | clock.tasks_hfclkstart.write(|w| unsafe { w.bits(1) }); | 49 | pac::CLOCK.tasks_hfclkstart().write_value(1); |
| 53 | while clock.events_hfclkstarted.read().bits() != 1 {} | 50 | while pac::CLOCK.events_hfclkstarted().read() != 1 {} |
| 54 | 51 | ||
| 55 | // Create the driver, from the HAL. | 52 | // Create the driver, from the HAL. |
| 56 | let driver = Driver::new(p.USBD, Irqs, HardwareVbusDetect::new(Irqs)); | 53 | let driver = Driver::new(p.USBD, Irqs, HardwareVbusDetect::new(Irqs)); |
| @@ -63,12 +60,6 @@ async fn main(spawner: Spawner) { | |||
| 63 | config.max_power = 100; | 60 | config.max_power = 100; |
| 64 | config.max_packet_size_0 = 64; | 61 | config.max_packet_size_0 = 64; |
| 65 | 62 | ||
| 66 | // Required for Windows support. | ||
| 67 | config.composite_with_iads = true; | ||
| 68 | config.device_class = 0xEF; | ||
| 69 | config.device_sub_class = 0x02; | ||
| 70 | config.device_protocol = 0x01; | ||
| 71 | |||
| 72 | // Create embassy-usb DeviceBuilder using the driver and config. | 63 | // Create embassy-usb DeviceBuilder using the driver and config. |
| 73 | static CONFIG_DESC: StaticCell<[u8; 256]> = StaticCell::new(); | 64 | static CONFIG_DESC: StaticCell<[u8; 256]> = StaticCell::new(); |
| 74 | static BOS_DESC: StaticCell<[u8; 256]> = StaticCell::new(); | 65 | static BOS_DESC: StaticCell<[u8; 256]> = StaticCell::new(); |
| @@ -116,10 +107,9 @@ async fn main(spawner: Spawner) { | |||
| 116 | 107 | ||
| 117 | // Init network stack | 108 | // Init network stack |
| 118 | static RESOURCES: StaticCell<StackResources<3>> = StaticCell::new(); | 109 | static RESOURCES: StaticCell<StackResources<3>> = StaticCell::new(); |
| 119 | static STACK: StaticCell<Stack<Device<'static, MTU>>> = StaticCell::new(); | 110 | let (stack, runner) = embassy_net::new(device, config, RESOURCES.init(StackResources::new()), seed); |
| 120 | let stack = &*STACK.init(Stack::new(device, config, RESOURCES.init(StackResources::new()), seed)); | ||
| 121 | 111 | ||
| 122 | unwrap!(spawner.spawn(net_task(stack))); | 112 | unwrap!(spawner.spawn(net_task(runner))); |
| 123 | 113 | ||
| 124 | // And now we can use it! | 114 | // And now we can use it! |
| 125 | 115 | ||
diff --git a/examples/nrf52840/src/bin/usb_hid_keyboard.rs b/examples/nrf52840/src/bin/usb_hid_keyboard.rs index e33ee5866..5a9dc90a2 100644 --- a/examples/nrf52840/src/bin/usb_hid_keyboard.rs +++ b/examples/nrf52840/src/bin/usb_hid_keyboard.rs | |||
| @@ -1,7 +1,6 @@ | |||
| 1 | #![no_std] | 1 | #![no_std] |
| 2 | #![no_main] | 2 | #![no_main] |
| 3 | 3 | ||
| 4 | use core::mem; | ||
| 5 | use core::sync::atomic::{AtomicBool, Ordering}; | 4 | use core::sync::atomic::{AtomicBool, Ordering}; |
| 6 | 5 | ||
| 7 | use defmt::*; | 6 | use defmt::*; |
| @@ -22,7 +21,7 @@ use {defmt_rtt as _, panic_probe as _}; | |||
| 22 | 21 | ||
| 23 | bind_interrupts!(struct Irqs { | 22 | bind_interrupts!(struct Irqs { |
| 24 | USBD => usb::InterruptHandler<peripherals::USBD>; | 23 | USBD => usb::InterruptHandler<peripherals::USBD>; |
| 25 | POWER_CLOCK => usb::vbus_detect::InterruptHandler; | 24 | CLOCK_POWER => usb::vbus_detect::InterruptHandler; |
| 26 | }); | 25 | }); |
| 27 | 26 | ||
| 28 | static SUSPENDED: AtomicBool = AtomicBool::new(false); | 27 | static SUSPENDED: AtomicBool = AtomicBool::new(false); |
| @@ -30,11 +29,10 @@ static SUSPENDED: AtomicBool = AtomicBool::new(false); | |||
| 30 | #[embassy_executor::main] | 29 | #[embassy_executor::main] |
| 31 | async fn main(_spawner: Spawner) { | 30 | async fn main(_spawner: Spawner) { |
| 32 | let p = embassy_nrf::init(Default::default()); | 31 | let p = embassy_nrf::init(Default::default()); |
| 33 | let clock: pac::CLOCK = unsafe { mem::transmute(()) }; | ||
| 34 | 32 | ||
| 35 | info!("Enabling ext hfosc..."); | 33 | info!("Enabling ext hfosc..."); |
| 36 | clock.tasks_hfclkstart.write(|w| unsafe { w.bits(1) }); | 34 | pac::CLOCK.tasks_hfclkstart().write_value(1); |
| 37 | while clock.events_hfclkstarted.read().bits() != 1 {} | 35 | while pac::CLOCK.events_hfclkstarted().read() != 1 {} |
| 38 | 36 | ||
| 39 | // Create the driver, from the HAL. | 37 | // Create the driver, from the HAL. |
| 40 | let driver = Driver::new(p.USBD, Irqs, HardwareVbusDetect::new(Irqs)); | 38 | let driver = Driver::new(p.USBD, Irqs, HardwareVbusDetect::new(Irqs)); |
diff --git a/examples/nrf52840/src/bin/usb_hid_mouse.rs b/examples/nrf52840/src/bin/usb_hid_mouse.rs index 8076ac283..80cda70e3 100644 --- a/examples/nrf52840/src/bin/usb_hid_mouse.rs +++ b/examples/nrf52840/src/bin/usb_hid_mouse.rs | |||
| @@ -1,8 +1,6 @@ | |||
| 1 | #![no_std] | 1 | #![no_std] |
| 2 | #![no_main] | 2 | #![no_main] |
| 3 | 3 | ||
| 4 | use core::mem; | ||
| 5 | |||
| 6 | use defmt::*; | 4 | use defmt::*; |
| 7 | use embassy_executor::Spawner; | 5 | use embassy_executor::Spawner; |
| 8 | use embassy_futures::join::join; | 6 | use embassy_futures::join::join; |
| @@ -18,17 +16,16 @@ use {defmt_rtt as _, panic_probe as _}; | |||
| 18 | 16 | ||
| 19 | bind_interrupts!(struct Irqs { | 17 | bind_interrupts!(struct Irqs { |
| 20 | USBD => usb::InterruptHandler<peripherals::USBD>; | 18 | USBD => usb::InterruptHandler<peripherals::USBD>; |
| 21 | POWER_CLOCK => usb::vbus_detect::InterruptHandler; | 19 | CLOCK_POWER => usb::vbus_detect::InterruptHandler; |
| 22 | }); | 20 | }); |
| 23 | 21 | ||
| 24 | #[embassy_executor::main] | 22 | #[embassy_executor::main] |
| 25 | async fn main(_spawner: Spawner) { | 23 | async fn main(_spawner: Spawner) { |
| 26 | let p = embassy_nrf::init(Default::default()); | 24 | let p = embassy_nrf::init(Default::default()); |
| 27 | let clock: pac::CLOCK = unsafe { mem::transmute(()) }; | ||
| 28 | 25 | ||
| 29 | info!("Enabling ext hfosc..."); | 26 | info!("Enabling ext hfosc..."); |
| 30 | clock.tasks_hfclkstart.write(|w| unsafe { w.bits(1) }); | 27 | pac::CLOCK.tasks_hfclkstart().write_value(1); |
| 31 | while clock.events_hfclkstarted.read().bits() != 1 {} | 28 | while pac::CLOCK.events_hfclkstarted().read() != 1 {} |
| 32 | 29 | ||
| 33 | // Create the driver, from the HAL. | 30 | // Create the driver, from the HAL. |
| 34 | let driver = Driver::new(p.USBD, Irqs, HardwareVbusDetect::new(Irqs)); | 31 | let driver = Driver::new(p.USBD, Irqs, HardwareVbusDetect::new(Irqs)); |
diff --git a/examples/nrf52840/src/bin/usb_serial.rs b/examples/nrf52840/src/bin/usb_serial.rs index 02048e692..8d05df791 100644 --- a/examples/nrf52840/src/bin/usb_serial.rs +++ b/examples/nrf52840/src/bin/usb_serial.rs | |||
| @@ -1,8 +1,6 @@ | |||
| 1 | #![no_std] | 1 | #![no_std] |
| 2 | #![no_main] | 2 | #![no_main] |
| 3 | 3 | ||
| 4 | use core::mem; | ||
| 5 | |||
| 6 | use defmt::{info, panic}; | 4 | use defmt::{info, panic}; |
| 7 | use embassy_executor::Spawner; | 5 | use embassy_executor::Spawner; |
| 8 | use embassy_futures::join::join; | 6 | use embassy_futures::join::join; |
| @@ -16,17 +14,16 @@ use {defmt_rtt as _, panic_probe as _}; | |||
| 16 | 14 | ||
| 17 | bind_interrupts!(struct Irqs { | 15 | bind_interrupts!(struct Irqs { |
| 18 | USBD => usb::InterruptHandler<peripherals::USBD>; | 16 | USBD => usb::InterruptHandler<peripherals::USBD>; |
| 19 | POWER_CLOCK => usb::vbus_detect::InterruptHandler; | 17 | CLOCK_POWER => usb::vbus_detect::InterruptHandler; |
| 20 | }); | 18 | }); |
| 21 | 19 | ||
| 22 | #[embassy_executor::main] | 20 | #[embassy_executor::main] |
| 23 | async fn main(_spawner: Spawner) { | 21 | async fn main(_spawner: Spawner) { |
| 24 | let p = embassy_nrf::init(Default::default()); | 22 | let p = embassy_nrf::init(Default::default()); |
| 25 | let clock: pac::CLOCK = unsafe { mem::transmute(()) }; | ||
| 26 | 23 | ||
| 27 | info!("Enabling ext hfosc..."); | 24 | info!("Enabling ext hfosc..."); |
| 28 | clock.tasks_hfclkstart.write(|w| unsafe { w.bits(1) }); | 25 | pac::CLOCK.tasks_hfclkstart().write_value(1); |
| 29 | while clock.events_hfclkstarted.read().bits() != 1 {} | 26 | while pac::CLOCK.events_hfclkstarted().read() != 1 {} |
| 30 | 27 | ||
| 31 | // Create the driver, from the HAL. | 28 | // Create the driver, from the HAL. |
| 32 | let driver = Driver::new(p.USBD, Irqs, HardwareVbusDetect::new(Irqs)); | 29 | let driver = Driver::new(p.USBD, Irqs, HardwareVbusDetect::new(Irqs)); |
| @@ -39,13 +36,6 @@ async fn main(_spawner: Spawner) { | |||
| 39 | config.max_power = 100; | 36 | config.max_power = 100; |
| 40 | config.max_packet_size_0 = 64; | 37 | config.max_packet_size_0 = 64; |
| 41 | 38 | ||
| 42 | // Required for windows compatibility. | ||
| 43 | // https://developer.nordicsemi.com/nRF_Connect_SDK/doc/1.9.1/kconfig/CONFIG_CDC_ACM_IAD.html#help | ||
| 44 | config.device_class = 0xEF; | ||
| 45 | config.device_sub_class = 0x02; | ||
| 46 | config.device_protocol = 0x01; | ||
| 47 | config.composite_with_iads = true; | ||
| 48 | |||
| 49 | // Create embassy-usb DeviceBuilder using the driver and config. | 39 | // Create embassy-usb DeviceBuilder using the driver and config. |
| 50 | // It needs some buffers for building the descriptors. | 40 | // It needs some buffers for building the descriptors. |
| 51 | let mut config_descriptor = [0; 256]; | 41 | let mut config_descriptor = [0; 256]; |
diff --git a/examples/nrf52840/src/bin/usb_serial_multitask.rs b/examples/nrf52840/src/bin/usb_serial_multitask.rs index 895cca8b9..5e5b4de35 100644 --- a/examples/nrf52840/src/bin/usb_serial_multitask.rs +++ b/examples/nrf52840/src/bin/usb_serial_multitask.rs | |||
| @@ -1,8 +1,6 @@ | |||
| 1 | #![no_std] | 1 | #![no_std] |
| 2 | #![no_main] | 2 | #![no_main] |
| 3 | 3 | ||
| 4 | use core::mem; | ||
| 5 | |||
| 6 | use defmt::{info, panic, unwrap}; | 4 | use defmt::{info, panic, unwrap}; |
| 7 | use embassy_executor::Spawner; | 5 | use embassy_executor::Spawner; |
| 8 | use embassy_nrf::usb::vbus_detect::HardwareVbusDetect; | 6 | use embassy_nrf::usb::vbus_detect::HardwareVbusDetect; |
| @@ -16,7 +14,7 @@ use {defmt_rtt as _, panic_probe as _}; | |||
| 16 | 14 | ||
| 17 | bind_interrupts!(struct Irqs { | 15 | bind_interrupts!(struct Irqs { |
| 18 | USBD => usb::InterruptHandler<peripherals::USBD>; | 16 | USBD => usb::InterruptHandler<peripherals::USBD>; |
| 19 | POWER_CLOCK => usb::vbus_detect::InterruptHandler; | 17 | CLOCK_POWER => usb::vbus_detect::InterruptHandler; |
| 20 | }); | 18 | }); |
| 21 | 19 | ||
| 22 | type MyDriver = Driver<'static, peripherals::USBD, HardwareVbusDetect>; | 20 | type MyDriver = Driver<'static, peripherals::USBD, HardwareVbusDetect>; |
| @@ -39,11 +37,10 @@ async fn echo_task(mut class: CdcAcmClass<'static, MyDriver>) { | |||
| 39 | #[embassy_executor::main] | 37 | #[embassy_executor::main] |
| 40 | async fn main(spawner: Spawner) { | 38 | async fn main(spawner: Spawner) { |
| 41 | let p = embassy_nrf::init(Default::default()); | 39 | let p = embassy_nrf::init(Default::default()); |
| 42 | let clock: pac::CLOCK = unsafe { mem::transmute(()) }; | ||
| 43 | 40 | ||
| 44 | info!("Enabling ext hfosc..."); | 41 | info!("Enabling ext hfosc..."); |
| 45 | clock.tasks_hfclkstart.write(|w| unsafe { w.bits(1) }); | 42 | pac::CLOCK.tasks_hfclkstart().write_value(1); |
| 46 | while clock.events_hfclkstarted.read().bits() != 1 {} | 43 | while pac::CLOCK.events_hfclkstarted().read() != 1 {} |
| 47 | 44 | ||
| 48 | // Create the driver, from the HAL. | 45 | // Create the driver, from the HAL. |
| 49 | let driver = Driver::new(p.USBD, Irqs, HardwareVbusDetect::new(Irqs)); | 46 | let driver = Driver::new(p.USBD, Irqs, HardwareVbusDetect::new(Irqs)); |
| @@ -56,13 +53,6 @@ async fn main(spawner: Spawner) { | |||
| 56 | config.max_power = 100; | 53 | config.max_power = 100; |
| 57 | config.max_packet_size_0 = 64; | 54 | config.max_packet_size_0 = 64; |
| 58 | 55 | ||
| 59 | // Required for windows compatibility. | ||
| 60 | // https://developer.nordicsemi.com/nRF_Connect_SDK/doc/1.9.1/kconfig/CONFIG_CDC_ACM_IAD.html#help | ||
| 61 | config.device_class = 0xEF; | ||
| 62 | config.device_sub_class = 0x02; | ||
| 63 | config.device_protocol = 0x01; | ||
| 64 | config.composite_with_iads = true; | ||
| 65 | |||
| 66 | static STATE: StaticCell<State> = StaticCell::new(); | 56 | static STATE: StaticCell<State> = StaticCell::new(); |
| 67 | let state = STATE.init(State::new()); | 57 | let state = STATE.init(State::new()); |
| 68 | 58 | ||
diff --git a/examples/nrf52840/src/bin/usb_serial_winusb.rs b/examples/nrf52840/src/bin/usb_serial_winusb.rs index c6675a3d3..8a20ce673 100644 --- a/examples/nrf52840/src/bin/usb_serial_winusb.rs +++ b/examples/nrf52840/src/bin/usb_serial_winusb.rs | |||
| @@ -1,8 +1,6 @@ | |||
| 1 | #![no_std] | 1 | #![no_std] |
| 2 | #![no_main] | 2 | #![no_main] |
| 3 | 3 | ||
| 4 | use core::mem; | ||
| 5 | |||
| 6 | use defmt::{info, panic}; | 4 | use defmt::{info, panic}; |
| 7 | use embassy_executor::Spawner; | 5 | use embassy_executor::Spawner; |
| 8 | use embassy_futures::join::join; | 6 | use embassy_futures::join::join; |
| @@ -18,7 +16,7 @@ use {defmt_rtt as _, panic_probe as _}; | |||
| 18 | 16 | ||
| 19 | bind_interrupts!(struct Irqs { | 17 | bind_interrupts!(struct Irqs { |
| 20 | USBD => usb::InterruptHandler<peripherals::USBD>; | 18 | USBD => usb::InterruptHandler<peripherals::USBD>; |
| 21 | POWER_CLOCK => usb::vbus_detect::InterruptHandler; | 19 | CLOCK_POWER => usb::vbus_detect::InterruptHandler; |
| 22 | }); | 20 | }); |
| 23 | 21 | ||
| 24 | // This is a randomly generated GUID to allow clients on Windows to find our device | 22 | // This is a randomly generated GUID to allow clients on Windows to find our device |
| @@ -27,11 +25,10 @@ const DEVICE_INTERFACE_GUIDS: &[&str] = &["{EAA9A5DC-30BA-44BC-9232-606CDC875321 | |||
| 27 | #[embassy_executor::main] | 25 | #[embassy_executor::main] |
| 28 | async fn main(_spawner: Spawner) { | 26 | async fn main(_spawner: Spawner) { |
| 29 | let p = embassy_nrf::init(Default::default()); | 27 | let p = embassy_nrf::init(Default::default()); |
| 30 | let clock: pac::CLOCK = unsafe { mem::transmute(()) }; | ||
| 31 | 28 | ||
| 32 | info!("Enabling ext hfosc..."); | 29 | info!("Enabling ext hfosc..."); |
| 33 | clock.tasks_hfclkstart.write(|w| unsafe { w.bits(1) }); | 30 | pac::CLOCK.tasks_hfclkstart().write_value(1); |
| 34 | while clock.events_hfclkstarted.read().bits() != 1 {} | 31 | while pac::CLOCK.events_hfclkstarted().read() != 1 {} |
| 35 | 32 | ||
| 36 | // Create the driver, from the HAL. | 33 | // Create the driver, from the HAL. |
| 37 | let driver = Driver::new(p.USBD, Irqs, HardwareVbusDetect::new(Irqs)); | 34 | let driver = Driver::new(p.USBD, Irqs, HardwareVbusDetect::new(Irqs)); |
| @@ -44,13 +41,6 @@ async fn main(_spawner: Spawner) { | |||
| 44 | config.max_power = 100; | 41 | config.max_power = 100; |
| 45 | config.max_packet_size_0 = 64; | 42 | config.max_packet_size_0 = 64; |
| 46 | 43 | ||
| 47 | // Required for windows compatibility. | ||
| 48 | // https://developer.nordicsemi.com/nRF_Connect_SDK/doc/1.9.1/kconfig/CONFIG_CDC_ACM_IAD.html#help | ||
| 49 | config.device_class = 0xEF; | ||
| 50 | config.device_sub_class = 0x02; | ||
| 51 | config.device_protocol = 0x01; | ||
| 52 | config.composite_with_iads = true; | ||
| 53 | |||
| 54 | // Create embassy-usb DeviceBuilder using the driver and config. | 44 | // Create embassy-usb DeviceBuilder using the driver and config. |
| 55 | // It needs some buffers for building the descriptors. | 45 | // It needs some buffers for building the descriptors. |
| 56 | let mut config_descriptor = [0; 256]; | 46 | let mut config_descriptor = [0; 256]; |
diff --git a/examples/nrf52840/src/bin/wdt.rs b/examples/nrf52840/src/bin/wdt.rs index ede88cc26..0d9ee3cf8 100644 --- a/examples/nrf52840/src/bin/wdt.rs +++ b/examples/nrf52840/src/bin/wdt.rs | |||
| @@ -4,7 +4,7 @@ | |||
| 4 | use defmt::*; | 4 | use defmt::*; |
| 5 | use embassy_executor::Spawner; | 5 | use embassy_executor::Spawner; |
| 6 | use embassy_nrf::gpio::{Input, Pull}; | 6 | use embassy_nrf::gpio::{Input, Pull}; |
| 7 | use embassy_nrf::wdt::{Config, Watchdog}; | 7 | use embassy_nrf::wdt::{Config, HaltConfig, Watchdog}; |
| 8 | use {defmt_rtt as _, panic_probe as _}; | 8 | use {defmt_rtt as _, panic_probe as _}; |
| 9 | 9 | ||
| 10 | #[embassy_executor::main] | 10 | #[embassy_executor::main] |
| @@ -17,7 +17,7 @@ async fn main(_spawner: Spawner) { | |||
| 17 | 17 | ||
| 18 | // This is needed for `probe-rs run` to be able to catch the panic message | 18 | // This is needed for `probe-rs run` to be able to catch the panic message |
| 19 | // in the WDT interrupt. The core resets 2 ticks after firing the interrupt. | 19 | // in the WDT interrupt. The core resets 2 ticks after firing the interrupt. |
| 20 | config.run_during_debug_halt = false; | 20 | config.action_during_debug_halt = HaltConfig::PAUSE; |
| 21 | 21 | ||
| 22 | let (_wdt, [mut handle]) = match Watchdog::try_new(p.WDT, config) { | 22 | let (_wdt, [mut handle]) = match Watchdog::try_new(p.WDT, config) { |
| 23 | Ok(x) => x, | 23 | Ok(x) => x, |
diff --git a/examples/nrf52840/src/bin/wifi_esp_hosted.rs b/examples/nrf52840/src/bin/wifi_esp_hosted.rs index a3b69a99b..26eaf485e 100644 --- a/examples/nrf52840/src/bin/wifi_esp_hosted.rs +++ b/examples/nrf52840/src/bin/wifi_esp_hosted.rs | |||
| @@ -4,7 +4,7 @@ | |||
| 4 | use defmt::{info, unwrap, warn}; | 4 | use defmt::{info, unwrap, warn}; |
| 5 | use embassy_executor::Spawner; | 5 | use embassy_executor::Spawner; |
| 6 | use embassy_net::tcp::TcpSocket; | 6 | use embassy_net::tcp::TcpSocket; |
| 7 | use embassy_net::{Stack, StackResources}; | 7 | use embassy_net::StackResources; |
| 8 | use embassy_nrf::gpio::{Input, Level, Output, OutputDrive, Pull}; | 8 | use embassy_nrf::gpio::{Input, Level, Output, OutputDrive, Pull}; |
| 9 | use embassy_nrf::rng::Rng; | 9 | use embassy_nrf::rng::Rng; |
| 10 | use embassy_nrf::spim::{self, Spim}; | 10 | use embassy_nrf::spim::{self, Spim}; |
| @@ -36,8 +36,8 @@ async fn wifi_task( | |||
| 36 | } | 36 | } |
| 37 | 37 | ||
| 38 | #[embassy_executor::task] | 38 | #[embassy_executor::task] |
| 39 | async fn net_task(stack: &'static Stack<hosted::NetDriver<'static>>) -> ! { | 39 | async fn net_task(mut runner: embassy_net::Runner<'static, hosted::NetDriver<'static>>) -> ! { |
| 40 | stack.run().await | 40 | runner.run().await |
| 41 | } | 41 | } |
| 42 | 42 | ||
| 43 | #[embassy_executor::main] | 43 | #[embassy_executor::main] |
| @@ -90,10 +90,9 @@ async fn main(spawner: Spawner) { | |||
| 90 | 90 | ||
| 91 | // Init network stack | 91 | // Init network stack |
| 92 | static RESOURCES: StaticCell<StackResources<3>> = StaticCell::new(); | 92 | static RESOURCES: StaticCell<StackResources<3>> = StaticCell::new(); |
| 93 | static STACK: StaticCell<Stack<hosted::NetDriver<'static>>> = StaticCell::new(); | 93 | let (stack, runner) = embassy_net::new(device, config, RESOURCES.init(StackResources::new()), seed); |
| 94 | let stack = &*STACK.init(Stack::new(device, config, RESOURCES.init(StackResources::new()), seed)); | ||
| 95 | 94 | ||
| 96 | unwrap!(spawner.spawn(net_task(stack))); | 95 | unwrap!(spawner.spawn(net_task(runner))); |
| 97 | 96 | ||
| 98 | // And now we can use it! | 97 | // And now we can use it! |
| 99 | 98 | ||
