aboutsummaryrefslogtreecommitdiff
path: root/examples/stm32l0/src
diff options
context:
space:
mode:
Diffstat (limited to 'examples/stm32l0/src')
-rw-r--r--examples/stm32l0/src/bin/dds.rs4
-rw-r--r--examples/stm32l0/src/bin/eeprom.rs32
-rw-r--r--examples/stm32l0/src/bin/raw_spawn.rs4
-rw-r--r--examples/stm32l0/src/bin/usb_serial.rs95
4 files changed, 131 insertions, 4 deletions
diff --git a/examples/stm32l0/src/bin/dds.rs b/examples/stm32l0/src/bin/dds.rs
index a54b28a93..eaa7a61a8 100644
--- a/examples/stm32l0/src/bin/dds.rs
+++ b/examples/stm32l0/src/bin/dds.rs
@@ -11,7 +11,7 @@ use embassy_stm32::rcc::*;
11use embassy_stm32::time::hz; 11use embassy_stm32::time::hz;
12use embassy_stm32::timer::low_level::{Timer as LLTimer, *}; 12use embassy_stm32::timer::low_level::{Timer as LLTimer, *};
13use embassy_stm32::timer::simple_pwm::PwmPin; 13use embassy_stm32::timer::simple_pwm::PwmPin;
14use embassy_stm32::timer::Channel; 14use embassy_stm32::timer::{Ch3, Channel};
15use embassy_stm32::{interrupt, pac, Config}; 15use embassy_stm32::{interrupt, pac, Config};
16use panic_probe as _; 16use panic_probe as _;
17 17
@@ -70,7 +70,7 @@ async fn main(_spawner: Spawner) {
70 let p = embassy_stm32::init(config); 70 let p = embassy_stm32::init(config);
71 71
72 // setup PWM pin in AF mode 72 // setup PWM pin in AF mode
73 let _ch3 = PwmPin::new_ch3(p.PA2, OutputType::PushPull); 73 let _ch3 = PwmPin::<_, Ch3>::new(p.PA2, OutputType::PushPull);
74 74
75 // initialize timer 75 // initialize timer
76 // we cannot use SimplePWM here because the Time is privately encapsulated 76 // we cannot use SimplePWM here because the Time is privately encapsulated
diff --git a/examples/stm32l0/src/bin/eeprom.rs b/examples/stm32l0/src/bin/eeprom.rs
new file mode 100644
index 000000000..370246644
--- /dev/null
+++ b/examples/stm32l0/src/bin/eeprom.rs
@@ -0,0 +1,32 @@
1#![no_std]
2#![no_main]
3
4use defmt::{info, unwrap};
5use embassy_executor::Spawner;
6use embassy_stm32::flash::{Flash, EEPROM_BASE, EEPROM_SIZE};
7use {defmt_rtt as _, panic_probe as _};
8
9#[embassy_executor::main]
10async fn main(_spawner: Spawner) {
11 let p = embassy_stm32::init(Default::default());
12
13 info!("Hello Eeprom! Start: {}, Size: {}", EEPROM_BASE, EEPROM_SIZE);
14
15 const ADDR: u32 = 0x0;
16
17 let mut f = Flash::new_blocking(p.FLASH);
18
19 info!("Reading...");
20 let mut buf = [0u8; 8];
21 unwrap!(f.eeprom_read_slice(ADDR, &mut buf));
22 info!("Read: {=[u8]:x}", buf);
23
24 info!("Writing...");
25 unwrap!(f.eeprom_write_slice(ADDR, &[1, 2, 3, 4, 5, 6, 7, 8]));
26
27 info!("Reading...");
28 let mut buf = [0u8; 8];
29 unwrap!(f.eeprom_read_slice(ADDR, &mut buf));
30 info!("Read: {=[u8]:x}", buf);
31 assert_eq!(&buf[..], &[1, 2, 3, 4, 5, 6, 7, 8]);
32}
diff --git a/examples/stm32l0/src/bin/raw_spawn.rs b/examples/stm32l0/src/bin/raw_spawn.rs
index 29c7e0dc7..6385e3c8f 100644
--- a/examples/stm32l0/src/bin/raw_spawn.rs
+++ b/examples/stm32l0/src/bin/raw_spawn.rs
@@ -42,8 +42,8 @@ fn main() -> ! {
42 let run2_task = unsafe { make_static(&run2_task) }; 42 let run2_task = unsafe { make_static(&run2_task) };
43 43
44 executor.run(|spawner| { 44 executor.run(|spawner| {
45 unwrap!(spawner.spawn(run1_task.spawn(|| run1()))); 45 spawner.spawn(unwrap!(run1_task.spawn(|| run1())));
46 unwrap!(spawner.spawn(run2_task.spawn(|| run2()))); 46 spawner.spawn(unwrap!(run2_task.spawn(|| run2())));
47 }); 47 });
48} 48}
49 49
diff --git a/examples/stm32l0/src/bin/usb_serial.rs b/examples/stm32l0/src/bin/usb_serial.rs
new file mode 100644
index 000000000..fdb1aeb59
--- /dev/null
+++ b/examples/stm32l0/src/bin/usb_serial.rs
@@ -0,0 +1,95 @@
1#![no_std]
2#![no_main]
3
4use defmt::{panic, *};
5use embassy_executor::Spawner;
6use embassy_futures::join::join;
7use embassy_stm32::usb::{self, Driver, Instance};
8use embassy_stm32::{bind_interrupts, peripherals};
9use embassy_usb::class::cdc_acm::{CdcAcmClass, State};
10use embassy_usb::driver::EndpointError;
11use embassy_usb::Builder;
12use {defmt_rtt as _, panic_probe as _};
13
14bind_interrupts!(struct Irqs {
15 USB => usb::InterruptHandler<peripherals::USB>;
16});
17
18#[embassy_executor::main]
19async fn main(_spawner: Spawner) {
20 let mut config = embassy_stm32::Config::default();
21 {
22 use embassy_stm32::rcc::*;
23 config.rcc.hsi = true;
24 config.rcc.pll = Some(Pll {
25 source: PllSource::HSI,
26 mul: PllMul::MUL6, // PLLVCO = 16*6 = 96Mhz
27 div: PllDiv::DIV3, // 32Mhz clock (16 * 6 / 3)
28 });
29 config.rcc.sys = Sysclk::PLL1_R;
30 }
31
32 let p = embassy_stm32::init(config);
33
34 info!("Hello World!");
35
36 let driver = Driver::new(p.USB, Irqs, p.PA12, p.PA11);
37
38 let mut config = embassy_usb::Config::new(0xc0de, 0xcafe);
39 config.manufacturer = Some("Embassy");
40 config.product = Some("USB-Serial Example");
41 config.serial_number = Some("123456");
42
43 let mut config_descriptor = [0; 256];
44 let mut bos_descriptor = [0; 256];
45 let mut control_buf = [0; 64];
46
47 let mut state = State::new();
48
49 let mut builder = Builder::new(
50 driver,
51 config,
52 &mut config_descriptor,
53 &mut bos_descriptor,
54 &mut [], // no msos descriptors
55 &mut control_buf,
56 );
57
58 let mut class = CdcAcmClass::new(&mut builder, &mut state, 64);
59
60 let mut usb = builder.build();
61
62 let usb_fut = usb.run();
63
64 let echo_fut = async {
65 loop {
66 class.wait_connection().await;
67 info!("Connected");
68 let _ = echo(&mut class).await;
69 info!("Disconnected");
70 }
71 };
72
73 join(usb_fut, echo_fut).await;
74}
75
76struct Disconnected {}
77
78impl From<EndpointError> for Disconnected {
79 fn from(val: EndpointError) -> Self {
80 match val {
81 EndpointError::BufferOverflow => panic!("Buffer overflow"),
82 EndpointError::Disabled => Disconnected {},
83 }
84 }
85}
86
87async fn echo<'d, T: Instance + 'd>(class: &mut CdcAcmClass<'d, Driver<'d, T>>) -> Result<(), Disconnected> {
88 let mut buf = [0; 64];
89 loop {
90 let n = class.read_packet(&mut buf).await?;
91 let data = &buf[..n];
92 info!("data: {:x}", data);
93 class.write_packet(data).await?;
94 }
95}