add lora examples
This commit is contained in:
60
examples/stm32wle5jc/src/bin/lora_rx.rs
Normal file
60
examples/stm32wle5jc/src/bin/lora_rx.rs
Normal file
@@ -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;
|
||||
}
|
||||
}
|
||||
58
examples/stm32wle5jc/src/bin/lora_tx.rs
Normal file
58
examples/stm32wle5jc/src/bin/lora_tx.rs
Normal file
@@ -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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user