aboutsummaryrefslogtreecommitdiff
path: root/examples/stm32l0/src
diff options
context:
space:
mode:
authorceekdee <[email protected]>2023-04-23 18:32:34 -0500
committerceekdee <[email protected]>2023-04-23 18:32:34 -0500
commit73f25093c7793ad2e8bd6fceeca46d9b5b1031ad (patch)
tree9374f5a637e1337ceb40a51426f24f3fe68249ef /examples/stm32l0/src
parenta3f727e2e1dd81fe00f19d74f7e0e590250a6970 (diff)
Add lora-phy examples.
Diffstat (limited to 'examples/stm32l0/src')
-rw-r--r--examples/stm32l0/src/bin/lora_cad.rs105
-rw-r--r--examples/stm32l0/src/bin/lora_lorawan.rs88
-rw-r--r--examples/stm32l0/src/bin/lora_p2p_receive.rs11
-rw-r--r--examples/stm32l0/src/bin/lora_p2p_send.rs110
-rw-r--r--examples/stm32l0/src/bin/lorawan.rs74
5 files changed, 312 insertions, 76 deletions
diff --git a/examples/stm32l0/src/bin/lora_cad.rs b/examples/stm32l0/src/bin/lora_cad.rs
new file mode 100644
index 000000000..588cea1e5
--- /dev/null
+++ b/examples/stm32l0/src/bin/lora_cad.rs
@@ -0,0 +1,105 @@
1//! This example runs on the STM32 LoRa Discovery board, which has a builtin Semtech Sx1276 radio.
2//! It demonstrates LORA P2P CAD functionality.
3#![no_std]
4#![no_main]
5#![macro_use]
6#![feature(type_alias_impl_trait)]
7
8use defmt::*;
9use embassy_executor::Spawner;
10use embassy_lora::iv::Stm32l0InterfaceVariant;
11use embassy_stm32::exti::{Channel, ExtiInput};
12use embassy_stm32::gpio::{Input, Level, Output, Pin, Pull, Speed};
13use embassy_stm32::spi;
14use embassy_stm32::time::khz;
15use embassy_time::{Delay, Duration, Timer};
16use lora_phy::mod_params::*;
17use lora_phy::sx1276_7_8_9::SX1276_7_8_9;
18use lora_phy::LoRa;
19use {defmt_rtt as _, panic_probe as _};
20
21const LORA_FREQUENCY_IN_HZ: u32 = 903_900_000; // warning: set this appropriately for the region
22
23#[embassy_executor::main]
24async fn main(_spawner: Spawner) {
25 let mut config = embassy_stm32::Config::default();
26 config.rcc.mux = embassy_stm32::rcc::ClockSrc::HSI16;
27 config.rcc.enable_hsi48 = true;
28 let p = embassy_stm32::init(config);
29
30 // SPI for sx1276
31 let spi = spi::Spi::new(
32 p.SPI1,
33 p.PB3,
34 p.PA7,
35 p.PA6,
36 p.DMA1_CH3,
37 p.DMA1_CH2,
38 khz(200),
39 spi::Config::default(),
40 );
41
42 let nss = Output::new(p.PA15.degrade(), Level::High, Speed::Low);
43 let reset = Output::new(p.PC0.degrade(), Level::High, Speed::Low);
44
45 let irq_pin = Input::new(p.PB4.degrade(), Pull::Up);
46 let irq = ExtiInput::new(irq_pin, p.EXTI4.degrade());
47
48 let iv = Stm32l0InterfaceVariant::new(nss, reset, irq, None, None).unwrap();
49
50 let mut delay = Delay;
51
52 let mut lora = {
53 match LoRa::new(SX1276_7_8_9::new(BoardType::Stm32l0Sx1276, spi, iv), false, &mut delay).await {
54 Ok(l) => l,
55 Err(err) => {
56 info!("Radio error = {}", err);
57 return;
58 }
59 }
60 };
61
62 let mut debug_indicator = Output::new(p.PB5, Level::Low, Speed::Low);
63 let mut start_indicator = Output::new(p.PB6, Level::Low, Speed::Low);
64
65 start_indicator.set_high();
66 Timer::after(Duration::from_secs(5)).await;
67 start_indicator.set_low();
68
69 let mdltn_params = {
70 match lora.create_modulation_params(
71 SpreadingFactor::_10,
72 Bandwidth::_250KHz,
73 CodingRate::_4_8,
74 LORA_FREQUENCY_IN_HZ,
75 ) {
76 Ok(mp) => mp,
77 Err(err) => {
78 info!("Radio error = {}", err);
79 return;
80 }
81 }
82 };
83
84 match lora.prepare_for_cad(&mdltn_params, true).await {
85 Ok(()) => {}
86 Err(err) => {
87 info!("Radio error = {}", err);
88 return;
89 }
90 };
91
92 match lora.cad().await {
93 Ok(cad_activity_detected) => {
94 if cad_activity_detected {
95 info!("cad successful with activity detected")
96 } else {
97 info!("cad successful without activity detected")
98 }
99 debug_indicator.set_high();
100 Timer::after(Duration::from_secs(5)).await;
101 debug_indicator.set_low();
102 }
103 Err(err) => info!("cad unsuccessful = {}", err),
104 }
105}
diff --git a/examples/stm32l0/src/bin/lora_lorawan.rs b/examples/stm32l0/src/bin/lora_lorawan.rs
new file mode 100644
index 000000000..c397edd58
--- /dev/null
+++ b/examples/stm32l0/src/bin/lora_lorawan.rs
@@ -0,0 +1,88 @@
1//! This example runs on the STM32 LoRa Discovery board, which has a builtin Semtech Sx1276 radio.
2//! It demonstrates LoRaWAN join functionality.
3#![no_std]
4#![no_main]
5#![macro_use]
6#![feature(type_alias_impl_trait)]
7
8use defmt::*;
9use embassy_executor::Spawner;
10use embassy_lora::iv::Stm32l0InterfaceVariant;
11use embassy_lora::LoraTimer;
12use embassy_stm32::exti::{Channel, ExtiInput};
13use embassy_stm32::gpio::{Input, Level, Output, Pin, Pull, Speed};
14use embassy_stm32::rng::Rng;
15use embassy_stm32::spi;
16use embassy_stm32::time::khz;
17use embassy_time::Delay;
18use lora_phy::mod_params::*;
19use lora_phy::sx1276_7_8_9::SX1276_7_8_9;
20use lora_phy::LoRa;
21use lorawan::default_crypto::DefaultFactory as Crypto;
22use lorawan_device::async_device::lora_radio::LoRaRadio;
23use lorawan_device::async_device::{region, Device, JoinMode};
24use {defmt_rtt as _, panic_probe as _};
25
26const LORAWAN_REGION: region::Region = region::Region::EU868; // warning: set this appropriately for the region
27
28#[embassy_executor::main]
29async fn main(_spawner: Spawner) {
30 let mut config = embassy_stm32::Config::default();
31 config.rcc.mux = embassy_stm32::rcc::ClockSrc::HSI16;
32 config.rcc.enable_hsi48 = true;
33 let p = embassy_stm32::init(config);
34
35 // SPI for sx1276
36 let spi = spi::Spi::new(
37 p.SPI1,
38 p.PB3,
39 p.PA7,
40 p.PA6,
41 p.DMA1_CH3,
42 p.DMA1_CH2,
43 khz(200),
44 spi::Config::default(),
45 );
46
47 let nss = Output::new(p.PA15.degrade(), Level::High, Speed::Low);
48 let reset = Output::new(p.PC0.degrade(), Level::High, Speed::Low);
49
50 let irq_pin = Input::new(p.PB4.degrade(), Pull::Up);
51 let irq = ExtiInput::new(irq_pin, p.EXTI4.degrade());
52
53 let iv = Stm32l0InterfaceVariant::new(nss, reset, irq, None, None).unwrap();
54
55 let mut delay = Delay;
56
57 let lora = {
58 match LoRa::new(SX1276_7_8_9::new(BoardType::Stm32l0Sx1276, spi, iv), true, &mut delay).await {
59 Ok(l) => l,
60 Err(err) => {
61 info!("Radio error = {}", err);
62 return;
63 }
64 }
65 };
66
67 let radio = LoRaRadio::new(lora);
68 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));
70
71 defmt::info!("Joining LoRaWAN network");
72
73 // TODO: Adjust the EUI and Keys according to your network credentials
74 match device
75 .join(&JoinMode::OTAA {
76 deveui: [0, 0, 0, 0, 0, 0, 0, 0],
77 appeui: [0, 0, 0, 0, 0, 0, 0, 0],
78 appkey: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
79 })
80 .await
81 {
82 Ok(()) => defmt::info!("LoRaWAN network joined"),
83 Err(err) => {
84 info!("Radio error = {}", err);
85 return;
86 }
87 };
88}
diff --git a/examples/stm32l0/src/bin/lora_p2p_receive.rs b/examples/stm32l0/src/bin/lora_p2p_receive.rs
index a5c5f75ea..bb7509509 100644
--- a/examples/stm32l0/src/bin/lora_p2p_receive.rs
+++ b/examples/stm32l0/src/bin/lora_p2p_receive.rs
@@ -1,5 +1,5 @@
1//! This example runs on the STM32 LoRa Discovery board, which has a builtin Semtech Sx1276 radio. 1//! This example runs on the STM32 LoRa Discovery board, which has a builtin Semtech Sx1276 radio.
2//! It demonstrates LORA P2P receive functionality. 2//! It demonstrates LORA P2P receive functionality in conjunction with the lora_p2p_send example.
3#![no_std] 3#![no_std]
4#![no_main] 4#![no_main]
5#![macro_use] 5#![macro_use]
@@ -18,6 +18,8 @@ use lora_phy::sx1276_7_8_9::SX1276_7_8_9;
18use lora_phy::LoRa; 18use lora_phy::LoRa;
19use {defmt_rtt as _, panic_probe as _}; 19use {defmt_rtt as _, panic_probe as _};
20 20
21const LORA_FREQUENCY_IN_HZ: u32 = 903_900_000; // warning: set this appropriately for the region
22
21#[embassy_executor::main] 23#[embassy_executor::main]
22async fn main(_spawner: Spawner) { 24async fn main(_spawner: Spawner) {
23 let mut config = embassy_stm32::Config::default(); 25 let mut config = embassy_stm32::Config::default();
@@ -67,7 +69,12 @@ async fn main(_spawner: Spawner) {
67 let mut receiving_buffer = [00u8; 100]; 69 let mut receiving_buffer = [00u8; 100];
68 70
69 let mdltn_params = { 71 let mdltn_params = {
70 match lora.create_modulation_params(SpreadingFactor::_10, Bandwidth::_250KHz, CodingRate::_4_8, 903900000) { 72 match lora.create_modulation_params(
73 SpreadingFactor::_10,
74 Bandwidth::_250KHz,
75 CodingRate::_4_8,
76 LORA_FREQUENCY_IN_HZ,
77 ) {
71 Ok(mp) => mp, 78 Ok(mp) => mp,
72 Err(err) => { 79 Err(err) => {
73 info!("Radio error = {}", err); 80 info!("Radio error = {}", err);
diff --git a/examples/stm32l0/src/bin/lora_p2p_send.rs b/examples/stm32l0/src/bin/lora_p2p_send.rs
new file mode 100644
index 000000000..e6fadc01d
--- /dev/null
+++ b/examples/stm32l0/src/bin/lora_p2p_send.rs
@@ -0,0 +1,110 @@
1//! This example runs on the STM32 LoRa Discovery board, which has a builtin Semtech Sx1276 radio.
2//! It demonstrates LORA P2P send functionality.
3#![no_std]
4#![no_main]
5#![macro_use]
6#![feature(type_alias_impl_trait)]
7
8use defmt::*;
9use embassy_executor::Spawner;
10use embassy_lora::iv::Stm32l0InterfaceVariant;
11use embassy_stm32::exti::{Channel, ExtiInput};
12use embassy_stm32::gpio::{Input, Level, Output, Pin, Pull, Speed};
13use embassy_stm32::spi;
14use embassy_stm32::time::khz;
15use embassy_time::Delay;
16use lora_phy::mod_params::*;
17use lora_phy::sx1276_7_8_9::SX1276_7_8_9;
18use lora_phy::LoRa;
19use {defmt_rtt as _, panic_probe as _};
20
21const LORA_FREQUENCY_IN_HZ: u32 = 903_900_000; // warning: set this appropriately for the region
22
23#[embassy_executor::main]
24async fn main(_spawner: Spawner) {
25 let mut config = embassy_stm32::Config::default();
26 config.rcc.mux = embassy_stm32::rcc::ClockSrc::HSI16;
27 config.rcc.enable_hsi48 = true;
28 let p = embassy_stm32::init(config);
29
30 // SPI for sx1276
31 let spi = spi::Spi::new(
32 p.SPI1,
33 p.PB3,
34 p.PA7,
35 p.PA6,
36 p.DMA1_CH3,
37 p.DMA1_CH2,
38 khz(200),
39 spi::Config::default(),
40 );
41
42 let nss = Output::new(p.PA15.degrade(), Level::High, Speed::Low);
43 let reset = Output::new(p.PC0.degrade(), Level::High, Speed::Low);
44
45 let irq_pin = Input::new(p.PB4.degrade(), Pull::Up);
46 let irq = ExtiInput::new(irq_pin, p.EXTI4.degrade());
47
48 let iv = Stm32l0InterfaceVariant::new(nss, reset, irq, None, None).unwrap();
49
50 let mut delay = Delay;
51
52 let mut lora = {
53 match LoRa::new(SX1276_7_8_9::new(BoardType::Stm32l0Sx1276, spi, iv), false, &mut delay).await {
54 Ok(l) => l,
55 Err(err) => {
56 info!("Radio error = {}", err);
57 return;
58 }
59 }
60 };
61
62 let mdltn_params = {
63 match lora.create_modulation_params(
64 SpreadingFactor::_10,
65 Bandwidth::_250KHz,
66 CodingRate::_4_8,
67 LORA_FREQUENCY_IN_HZ,
68 ) {
69 Ok(mp) => mp,
70 Err(err) => {
71 info!("Radio error = {}", err);
72 return;
73 }
74 }
75 };
76
77 let mut tx_pkt_params = {
78 match lora.create_tx_packet_params(4, false, true, false, &mdltn_params) {
79 Ok(pp) => pp,
80 Err(err) => {
81 info!("Radio error = {}", err);
82 return;
83 }
84 }
85 };
86
87 match lora.prepare_for_tx(&mdltn_params, 17, true).await {
88 Ok(()) => {}
89 Err(err) => {
90 info!("Radio error = {}", err);
91 return;
92 }
93 };
94
95 let buffer = [0x01u8, 0x02u8, 0x03u8];
96 match lora.tx(&mdltn_params, &mut tx_pkt_params, &buffer, 0xffffff).await {
97 Ok(()) => {
98 info!("TX DONE");
99 }
100 Err(err) => {
101 info!("Radio error = {}", err);
102 return;
103 }
104 };
105
106 match lora.sleep(&mut delay).await {
107 Ok(()) => info!("Sleep successful"),
108 Err(err) => info!("Sleep unsuccessful = {}", err),
109 }
110}
diff --git a/examples/stm32l0/src/bin/lorawan.rs b/examples/stm32l0/src/bin/lorawan.rs
deleted file mode 100644
index ea01f610c..000000000
--- a/examples/stm32l0/src/bin/lorawan.rs
+++ /dev/null
@@ -1,74 +0,0 @@
1//! This example runs on the STM32 LoRa Discovery board which has a builtin Semtech Sx127x radio
2#![no_std]
3#![no_main]
4#![macro_use]
5#![allow(dead_code)]
6#![feature(type_alias_impl_trait)]
7
8use embassy_executor::Spawner;
9use embassy_lora::sx127x::*;
10use embassy_lora::LoraTimer;
11use embassy_stm32::exti::ExtiInput;
12use embassy_stm32::gpio::{Input, Level, Output, Pull, Speed};
13use embassy_stm32::rng::Rng;
14use embassy_stm32::spi;
15use embassy_stm32::time::khz;
16use lorawan::default_crypto::DefaultFactory as Crypto;
17use lorawan_device::async_device::{region, Device, JoinMode};
18use {defmt_rtt as _, panic_probe as _};
19
20#[embassy_executor::main]
21async fn main(_spawner: Spawner) {
22 let mut config = embassy_stm32::Config::default();
23 config.rcc.mux = embassy_stm32::rcc::ClockSrc::HSI16;
24 config.rcc.enable_hsi48 = true;
25 let p = embassy_stm32::init(config);
26
27 // SPI for sx127x
28 let spi = spi::Spi::new(
29 p.SPI1,
30 p.PB3,
31 p.PA7,
32 p.PA6,
33 p.DMA1_CH3,
34 p.DMA1_CH2,
35 khz(200),
36 spi::Config::default(),
37 );
38
39 let cs = Output::new(p.PA15, Level::High, Speed::Low);
40 let reset = Output::new(p.PC0, Level::High, Speed::Low);
41 let _ = Input::new(p.PB1, Pull::None);
42
43 let ready = Input::new(p.PB4, Pull::Up);
44 let ready_pin = ExtiInput::new(ready, p.EXTI4);
45
46 let radio = Sx127xRadio::new(spi, cs, reset, ready_pin, DummySwitch).await.unwrap();
47
48 let region = region::Configuration::new(region::Region::EU868);
49 let mut device: Device<_, Crypto, _, _> = Device::new(region, radio, LoraTimer::new(), Rng::new(p.RNG));
50
51 defmt::info!("Joining LoRaWAN network");
52
53 // TODO: Adjust the EUI and Keys according to your network credentials
54 device
55 .join(&JoinMode::OTAA {
56 deveui: [0, 0, 0, 0, 0, 0, 0, 0],
57 appeui: [0, 0, 0, 0, 0, 0, 0, 0],
58 appkey: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
59 })
60 .await
61 .ok()
62 .unwrap();
63 defmt::info!("LoRaWAN network joined");
64
65 defmt::info!("Sending 'PING'");
66 device.send(b"PING", 1, false).await.ok().unwrap();
67 defmt::info!("Message sent!");
68}
69
70pub struct DummySwitch;
71impl RadioSwitch for DummySwitch {
72 fn set_rx(&mut self) {}
73 fn set_tx(&mut self) {}
74}