From bbe8d3d38a03c66b9c8e2bb70ae067f8ad674059 Mon Sep 17 00:00:00 2001
From: Chen Yuheng <1016867898@qq.com>
Date: Tue, 18 Jun 2024 17:01:37 +0800
Subject: [PATCH] Add stm32g0 examples

---
 examples/stm32g0/Cargo.toml                |  2 ++
 examples/stm32g0/src/bin/adc.rs            | 34 ++++++++++++++++++++++
 examples/stm32g0/src/bin/rtc.rs            | 31 ++++++++++++++++++++
 examples/stm32g0/src/bin/usart.rs          | 25 ++++++++++++++++
 examples/stm32g0/src/bin/usart_buffered.rs | 34 ++++++++++++++++++++++
 examples/stm32g0/src/bin/usart_dma.rs      | 27 +++++++++++++++++
 6 files changed, 153 insertions(+)
 create mode 100644 examples/stm32g0/src/bin/adc.rs
 create mode 100644 examples/stm32g0/src/bin/rtc.rs
 create mode 100644 examples/stm32g0/src/bin/usart.rs
 create mode 100644 examples/stm32g0/src/bin/usart_buffered.rs
 create mode 100644 examples/stm32g0/src/bin/usart_dma.rs

diff --git a/examples/stm32g0/Cargo.toml b/examples/stm32g0/Cargo.toml
index 15e58d5d1..b9d710ca7 100644
--- a/examples/stm32g0/Cargo.toml
+++ b/examples/stm32g0/Cargo.toml
@@ -23,5 +23,7 @@ panic-probe = { version = "0.3", features = ["print-defmt"] }
 heapless = { version = "0.8", default-features = false }
 portable-atomic = { version = "1.5", features = ["unsafe-assume-single-core"] }
 
+embedded-io-async = { version = "0.6.1" }
+
 [profile.release]
 debug = 2
diff --git a/examples/stm32g0/src/bin/adc.rs b/examples/stm32g0/src/bin/adc.rs
new file mode 100644
index 000000000..a35119e3d
--- /dev/null
+++ b/examples/stm32g0/src/bin/adc.rs
@@ -0,0 +1,34 @@
+#![no_std]
+#![no_main]
+
+use defmt::*;
+use embassy_executor::Spawner;
+use embassy_stm32::adc::{Adc, SampleTime};
+use embassy_time::Timer;
+use {defmt_rtt as _, panic_probe as _};
+
+#[embassy_executor::main]
+async fn main(_spawner: Spawner) {
+    let p = embassy_stm32::init(Default::default());
+    info!("Hello World!");
+
+    let mut adc = Adc::new(p.ADC1);
+    adc.set_sample_time(SampleTime::CYCLES79_5);
+    let mut pin = p.PA1;
+
+    let mut vrefint = adc.enable_vrefint();
+    let vrefint_sample = adc.read(&mut vrefint);
+    let convert_to_millivolts = |sample| {
+        // From https://www.st.com/resource/en/datasheet/stm32g031g8.pdf
+        // 6.3.3 Embedded internal reference voltage
+        const VREFINT_MV: u32 = 1212; // mV
+
+        (u32::from(sample) * VREFINT_MV / u32::from(vrefint_sample)) as u16
+    };
+
+    loop {
+        let v = adc.read(&mut pin);
+        info!("--> {} - {} mV", v, convert_to_millivolts(v));
+        Timer::after_millis(100).await;
+    }
+}
diff --git a/examples/stm32g0/src/bin/rtc.rs b/examples/stm32g0/src/bin/rtc.rs
new file mode 100644
index 000000000..c02c1ecd7
--- /dev/null
+++ b/examples/stm32g0/src/bin/rtc.rs
@@ -0,0 +1,31 @@
+#![no_std]
+#![no_main]
+
+use defmt::*;
+use embassy_executor::Spawner;
+use embassy_stm32::rtc::{DateTime, DayOfWeek, Rtc, RtcConfig};
+use embassy_stm32::Config;
+use embassy_time::Timer;
+use {defmt_rtt as _, panic_probe as _};
+
+#[embassy_executor::main]
+async fn main(_spawner: Spawner) {
+    let config = Config::default();
+    let p = embassy_stm32::init(config);
+
+    info!("Hello World!");
+
+    let now = DateTime::from(2023, 6, 14, DayOfWeek::Friday, 15, 59, 10);
+
+    let mut rtc = Rtc::new(p.RTC, RtcConfig::default());
+
+    rtc.set_datetime(now.unwrap()).expect("datetime not set");
+
+    loop {
+        let now: DateTime = rtc.now().unwrap().into();
+
+        info!("{}:{}:{}", now.hour(), now.minute(), now.second());
+
+        Timer::after_millis(1000).await;
+    }
+}
diff --git a/examples/stm32g0/src/bin/usart.rs b/examples/stm32g0/src/bin/usart.rs
new file mode 100644
index 000000000..037a5c833
--- /dev/null
+++ b/examples/stm32g0/src/bin/usart.rs
@@ -0,0 +1,25 @@
+#![no_std]
+#![no_main]
+
+use defmt::*;
+use embassy_stm32::usart::{Config, Uart};
+use {defmt_rtt as _, panic_probe as _};
+
+#[cortex_m_rt::entry]
+fn main() -> ! {
+    info!("Hello World!");
+
+    let p = embassy_stm32::init(Default::default());
+
+    let config = Config::default();
+    let mut usart = Uart::new_blocking(p.USART2, p.PA3, p.PA2, config).unwrap();
+
+    unwrap!(usart.blocking_write(b"Hello Embassy World!\r\n"));
+    info!("wrote Hello, starting echo");
+
+    let mut buf = [0u8; 1];
+    loop {
+        unwrap!(usart.blocking_read(&mut buf));
+        unwrap!(usart.blocking_write(&buf));
+    }
+}
diff --git a/examples/stm32g0/src/bin/usart_buffered.rs b/examples/stm32g0/src/bin/usart_buffered.rs
new file mode 100644
index 000000000..c097a0c5a
--- /dev/null
+++ b/examples/stm32g0/src/bin/usart_buffered.rs
@@ -0,0 +1,34 @@
+#![no_std]
+#![no_main]
+
+use defmt::*;
+use embassy_executor::Spawner;
+use embassy_stm32::usart::{BufferedUart, Config};
+use embassy_stm32::{bind_interrupts, peripherals, usart};
+use embedded_io_async::{Read, Write};
+use {defmt_rtt as _, panic_probe as _};
+
+bind_interrupts!(struct Irqs {
+    USART1 => usart::BufferedInterruptHandler<peripherals::USART1>;
+});
+
+#[embassy_executor::main]
+async fn main(_spawner: Spawner) {
+    let p = embassy_stm32::init(Default::default());
+    info!("Hi!");
+
+    let mut config = Config::default();
+    config.baudrate = 115200;
+    let mut tx_buf = [0u8; 256];
+    let mut rx_buf = [0u8; 256];
+    let mut usart = BufferedUart::new(p.USART1, Irqs, p.PB7, p.PB6, &mut tx_buf, &mut rx_buf, config).unwrap();
+
+    usart.write_all(b"Hello Embassy World!\r\n").await.unwrap();
+    info!("wrote Hello, starting echo");
+
+    let mut buf = [0; 4];
+    loop {
+        usart.read_exact(&mut buf[..]).await.unwrap();
+        usart.write_all(&buf[..]).await.unwrap();
+    }
+}
diff --git a/examples/stm32g0/src/bin/usart_dma.rs b/examples/stm32g0/src/bin/usart_dma.rs
new file mode 100644
index 000000000..8212153ab
--- /dev/null
+++ b/examples/stm32g0/src/bin/usart_dma.rs
@@ -0,0 +1,27 @@
+#![no_std]
+#![no_main]
+
+use defmt::*;
+use embassy_executor::Spawner;
+use embassy_stm32::usart::{Config, Uart};
+use embassy_stm32::{bind_interrupts, peripherals, usart};
+use {defmt_rtt as _, panic_probe as _};
+
+bind_interrupts!(struct Irqs {
+    USART1 => usart::InterruptHandler<peripherals::USART1>;
+});
+
+#[embassy_executor::main]
+async fn main(_spawner: Spawner) {
+    let p = embassy_stm32::init(Default::default());
+    let mut usart = Uart::new(p.USART1, p.PB7, p.PB6, Irqs, p.DMA1_CH2, p.DMA1_CH3, Config::default()).unwrap();
+
+    usart.write(b"Hello Embassy World!\r\n").await.unwrap();
+    info!("wrote Hello, starting echo");
+
+    let mut buf = [0; 5];
+    loop {
+        usart.read(&mut buf[..]).await.unwrap();
+        usart.write(&buf[..]).await.unwrap();
+    }
+}