diff --git a/examples/stm32wle5jc/src/bin/lora_rx.rs b/examples/stm32wle5jc/src/bin/lora_rx.rs new file mode 100644 index 0000000..c75ef13 --- /dev/null +++ b/examples/stm32wle5jc/src/bin/lora_rx.rs @@ -0,0 +1,60 @@ +#![no_std] +#![no_main] + +use defmt::{error, info, warn}; +use embassy_executor::Spawner; +use embassy_stm32::{ + Config, + gpio::{Level, Output, Speed}, + rcc::{MSIRange, Sysclk, mux}, + spi::Spi, +}; +use embassy_time::{Duration, Timer}; +use stm32wl_subghz::{ + Configure, PaSelection, Radio, RadioError, Receive, SubGhzSpiDevice, + modulations::lora::{Bandwidth, LoraConfig, LoraRadio, SpreadingFactor}, +}; +use {defmt_rtt as _, panic_probe as _}; + +#[embassy_executor::main] +async fn main(_spawner: Spawner) { + let mut config = Config::default(); + { + config.rcc.msi = Some(MSIRange::RANGE48M); + config.rcc.sys = Sysclk::MSI; + config.rcc.mux.rngsel = mux::Rngsel::MSI; + config.enable_debug_during_sleep = true; + } + let p = embassy_stm32::init(config); + + let spi = SubGhzSpiDevice(Spi::new_subghz(p.SUBGHZSPI, p.DMA1_CH1, p.DMA1_CH2)); + let rf_tx = Output::new(p.PC4, Level::Low, Speed::High); + let rf_rx = Output::new(p.PC5, Level::Low, Speed::High); + let rf_en = Output::new(p.PC3, Level::Low, Speed::High); + let mut radio = Radio::new(spi, rf_tx, rf_rx, rf_en); + radio.init().await.unwrap(); + + let mut lora = LoraRadio::new(&mut radio); + lora.configure(&LoraConfig { + frequency: 868_100_000, + sf: SpreadingFactor::SF9, + bw: Bandwidth::Bw7_8kHz, + pa: PaSelection::HighPower, + power_dbm: 22, + ..Default::default() + }) + .await + .unwrap(); + + info!("waiting for packet..."); + let mut buf = [0u8; 255]; + match lora.rx(&mut buf, 5_000).await { + Ok(len) => info!("rx {} bytes: {:x}", len, &buf[..len]), + Err(RadioError::Timeout) => warn!("no packet received (timeout)"), + Err(e) => error!("rx error: {:?}", e), + } + + loop { + Timer::after(Duration::from_secs(1)).await; + } +} diff --git a/examples/stm32wle5jc/src/bin/lora_tx.rs b/examples/stm32wle5jc/src/bin/lora_tx.rs new file mode 100644 index 0000000..45edf63 --- /dev/null +++ b/examples/stm32wle5jc/src/bin/lora_tx.rs @@ -0,0 +1,58 @@ +#![no_std] +#![no_main] + +use defmt::{error, info}; +use embassy_executor::Spawner; +use embassy_stm32::{ + Config, + gpio::{Level, Output, Speed}, + rcc::{MSIRange, Sysclk, mux}, + spi::Spi, +}; +use embassy_time::{Duration, Timer}; +use stm32wl_subghz::{ + Configure, PaSelection, Radio, SubGhzSpiDevice, Transmit, + modulations::lora::{Bandwidth, LoraConfig, LoraRadio, SpreadingFactor}, +}; +use {defmt_rtt as _, panic_probe as _}; + +#[embassy_executor::main] +async fn main(_spawner: Spawner) { + let mut config = Config::default(); + { + config.rcc.msi = Some(MSIRange::RANGE48M); + config.rcc.sys = Sysclk::MSI; + config.rcc.mux.rngsel = mux::Rngsel::MSI; + config.enable_debug_during_sleep = true; + } + let p = embassy_stm32::init(config); + + let spi = SubGhzSpiDevice(Spi::new_subghz(p.SUBGHZSPI, p.DMA1_CH1, p.DMA1_CH2)); + let rf_tx = Output::new(p.PC4, Level::Low, Speed::High); + let rf_rx = Output::new(p.PC5, Level::Low, Speed::High); + let rf_en = Output::new(p.PC3, Level::Low, Speed::High); + let mut radio = Radio::new(spi, rf_tx, rf_rx, rf_en); + radio.init().await.unwrap(); + + let mut lora = LoraRadio::new(&mut radio); + lora.configure(&LoraConfig { + frequency: 868_100_000, + sf: SpreadingFactor::SF9, + bw: Bandwidth::Bw7_8kHz, + pa: PaSelection::HighPower, + power_dbm: 22, + ..Default::default() + }) + .await + .unwrap(); + + info!("sending stuffs"); + match lora.tx(b"hiiiiiII!").await { + Ok(_) => info!("yay :3"), + Err(e) => error!("tx error: {:?}", e), + } + + loop { + Timer::after(Duration::from_secs(1)).await; + } +}