aboutsummaryrefslogtreecommitdiff
path: root/examples
diff options
context:
space:
mode:
authorDario Nieuwenhuis <[email protected]>2023-09-19 04:22:57 +0200
committerDario Nieuwenhuis <[email protected]>2023-09-21 23:47:56 +0200
commit83b4c0127337c55c6a445abee6ab5eac4c993f9c (patch)
treedaa4050b6dd0bf7ecfae113c51ad2b21fe74e914 /examples
parente313ca4ae8bb4b7ab5dc4c348a471ccc5745b599 (diff)
stm32/rcc: unify h5 and h7.
Diffstat (limited to 'examples')
-rw-r--r--examples/stm32f4/src/bin/eth.rs3
-rw-r--r--examples/stm32f7/src/bin/eth.rs3
-rw-r--r--examples/stm32h5/src/bin/eth.rs4
-rw-r--r--examples/stm32h5/src/bin/usb_serial.rs2
-rw-r--r--examples/stm32h7/src/bin/adc.rs34
-rw-r--r--examples/stm32h7/src/bin/camera.rs33
-rw-r--r--examples/stm32h7/src/bin/dac.rs32
-rw-r--r--examples/stm32h7/src/bin/dac_dma.rs33
-rw-r--r--examples/stm32h7/src/bin/eth.rs28
-rw-r--r--examples/stm32h7/src/bin/eth_client.rs27
-rw-r--r--examples/stm32h7/src/bin/fmc.rs24
-rw-r--r--examples/stm32h7/src/bin/low_level_timer_api.rs30
-rw-r--r--examples/stm32h7/src/bin/mco.rs4
-rw-r--r--examples/stm32h7/src/bin/pwm.rs29
-rw-r--r--examples/stm32h7/src/bin/rng.rs6
-rw-r--r--examples/stm32h7/src/bin/sdmmc.rs21
-rw-r--r--examples/stm32h7/src/bin/spi.rs23
-rw-r--r--examples/stm32h7/src/bin/spi_dma.rs23
-rw-r--r--examples/stm32h7/src/bin/usb_serial.rs25
19 files changed, 310 insertions, 74 deletions
diff --git a/examples/stm32f4/src/bin/eth.rs b/examples/stm32f4/src/bin/eth.rs
index 5f1e62d0a..16bf5d949 100644
--- a/examples/stm32f4/src/bin/eth.rs
+++ b/examples/stm32f4/src/bin/eth.rs
@@ -100,6 +100,7 @@ async fn main(spawner: Spawner) -> ! {
100 let r = socket.connect(remote_endpoint).await; 100 let r = socket.connect(remote_endpoint).await;
101 if let Err(e) = r { 101 if let Err(e) = r {
102 info!("connect error: {:?}", e); 102 info!("connect error: {:?}", e);
103 Timer::after(Duration::from_secs(1)).await;
103 continue; 104 continue;
104 } 105 }
105 info!("connected!"); 106 info!("connected!");
@@ -108,7 +109,7 @@ async fn main(spawner: Spawner) -> ! {
108 let r = socket.write_all(&buf).await; 109 let r = socket.write_all(&buf).await;
109 if let Err(e) = r { 110 if let Err(e) = r {
110 info!("write error: {:?}", e); 111 info!("write error: {:?}", e);
111 continue; 112 break;
112 } 113 }
113 Timer::after(Duration::from_secs(1)).await; 114 Timer::after(Duration::from_secs(1)).await;
114 } 115 }
diff --git a/examples/stm32f7/src/bin/eth.rs b/examples/stm32f7/src/bin/eth.rs
index 01c38106e..93c97c8ee 100644
--- a/examples/stm32f7/src/bin/eth.rs
+++ b/examples/stm32f7/src/bin/eth.rs
@@ -101,6 +101,7 @@ async fn main(spawner: Spawner) -> ! {
101 let r = socket.connect(remote_endpoint).await; 101 let r = socket.connect(remote_endpoint).await;
102 if let Err(e) = r { 102 if let Err(e) = r {
103 info!("connect error: {:?}", e); 103 info!("connect error: {:?}", e);
104 Timer::after(Duration::from_secs(1)).await;
104 continue; 105 continue;
105 } 106 }
106 info!("connected!"); 107 info!("connected!");
@@ -109,7 +110,7 @@ async fn main(spawner: Spawner) -> ! {
109 let r = socket.write_all(&buf).await; 110 let r = socket.write_all(&buf).await;
110 if let Err(e) = r { 111 if let Err(e) = r {
111 info!("write error: {:?}", e); 112 info!("write error: {:?}", e);
112 continue; 113 break;
113 } 114 }
114 Timer::after(Duration::from_secs(1)).await; 115 Timer::after(Duration::from_secs(1)).await;
115 } 116 }
diff --git a/examples/stm32h5/src/bin/eth.rs b/examples/stm32h5/src/bin/eth.rs
index 41ef2acaa..4e92d0647 100644
--- a/examples/stm32h5/src/bin/eth.rs
+++ b/examples/stm32h5/src/bin/eth.rs
@@ -53,7 +53,7 @@ async fn main(spawner: Spawner) -> ! {
53 config.rcc.apb2_pre = APBPrescaler::DIV1; 53 config.rcc.apb2_pre = APBPrescaler::DIV1;
54 config.rcc.apb3_pre = APBPrescaler::DIV1; 54 config.rcc.apb3_pre = APBPrescaler::DIV1;
55 config.rcc.sys = Sysclk::Pll1P; 55 config.rcc.sys = Sysclk::Pll1P;
56 config.rcc.voltage_scale = VoltageScale::SCALE0; 56 config.rcc.voltage_scale = VoltageScale::Scale0;
57 let p = embassy_stm32::init(config); 57 let p = embassy_stm32::init(config);
58 info!("Hello World!"); 58 info!("Hello World!");
59 59
@@ -128,7 +128,7 @@ async fn main(spawner: Spawner) -> ! {
128 let r = socket.write_all(b"Hello\n").await; 128 let r = socket.write_all(b"Hello\n").await;
129 if let Err(e) = r { 129 if let Err(e) = r {
130 info!("write error: {:?}", e); 130 info!("write error: {:?}", e);
131 continue; 131 break;
132 } 132 }
133 Timer::after(Duration::from_secs(1)).await; 133 Timer::after(Duration::from_secs(1)).await;
134 } 134 }
diff --git a/examples/stm32h5/src/bin/usb_serial.rs b/examples/stm32h5/src/bin/usb_serial.rs
index 63c694aff..cbe540a06 100644
--- a/examples/stm32h5/src/bin/usb_serial.rs
+++ b/examples/stm32h5/src/bin/usb_serial.rs
@@ -40,7 +40,7 @@ async fn main(_spawner: Spawner) {
40 config.rcc.apb2_pre = APBPrescaler::DIV2; 40 config.rcc.apb2_pre = APBPrescaler::DIV2;
41 config.rcc.apb3_pre = APBPrescaler::DIV4; 41 config.rcc.apb3_pre = APBPrescaler::DIV4;
42 config.rcc.sys = Sysclk::Pll1P; 42 config.rcc.sys = Sysclk::Pll1P;
43 config.rcc.voltage_scale = VoltageScale::SCALE0; 43 config.rcc.voltage_scale = VoltageScale::Scale0;
44 let p = embassy_stm32::init(config); 44 let p = embassy_stm32::init(config);
45 45
46 info!("Hello World!"); 46 info!("Hello World!");
diff --git a/examples/stm32h7/src/bin/adc.rs b/examples/stm32h7/src/bin/adc.rs
index 0e1e28c72..77922d4bc 100644
--- a/examples/stm32h7/src/bin/adc.rs
+++ b/examples/stm32h7/src/bin/adc.rs
@@ -5,8 +5,6 @@
5use defmt::*; 5use defmt::*;
6use embassy_executor::Spawner; 6use embassy_executor::Spawner;
7use embassy_stm32::adc::{Adc, SampleTime}; 7use embassy_stm32::adc::{Adc, SampleTime};
8use embassy_stm32::rcc::AdcClockSource;
9use embassy_stm32::time::mhz;
10use embassy_stm32::Config; 8use embassy_stm32::Config;
11use embassy_time::{Delay, Duration, Timer}; 9use embassy_time::{Delay, Duration, Timer};
12use {defmt_rtt as _, panic_probe as _}; 10use {defmt_rtt as _, panic_probe as _};
@@ -14,10 +12,34 @@ use {defmt_rtt as _, panic_probe as _};
14#[embassy_executor::main] 12#[embassy_executor::main]
15async fn main(_spawner: Spawner) { 13async fn main(_spawner: Spawner) {
16 let mut config = Config::default(); 14 let mut config = Config::default();
17 config.rcc.sys_ck = Some(mhz(400)); 15 {
18 config.rcc.hclk = Some(mhz(200)); 16 use embassy_stm32::rcc::*;
19 config.rcc.per_ck = Some(mhz(64)); 17 config.rcc.hsi = Some(Hsi::Mhz64);
20 config.rcc.adc_clock_source = AdcClockSource::PerCk; 18 config.rcc.csi = true;
19 config.rcc.pll_src = PllSource::Hsi;
20 config.rcc.pll1 = Some(Pll {
21 prediv: 4,
22 mul: 50,
23 divp: Some(2),
24 divq: Some(8), // SPI1 cksel defaults to pll1_q
25 divr: None,
26 });
27 config.rcc.pll2 = Some(Pll {
28 prediv: 4,
29 mul: 50,
30 divp: Some(8), // 100mhz
31 divq: None,
32 divr: None,
33 });
34 config.rcc.sys = Sysclk::Pll1P; // 400 Mhz
35 config.rcc.ahb_pre = AHBPrescaler::DIV2; // 200 Mhz
36 config.rcc.apb1_pre = APBPrescaler::DIV2; // 100 Mhz
37 config.rcc.apb2_pre = APBPrescaler::DIV2; // 100 Mhz
38 config.rcc.apb3_pre = APBPrescaler::DIV2; // 100 Mhz
39 config.rcc.apb4_pre = APBPrescaler::DIV2; // 100 Mhz
40 config.rcc.voltage_scale = VoltageScale::Scale1;
41 config.rcc.adc_clock_source = AdcClockSource::PLL2_P;
42 }
21 let mut p = embassy_stm32::init(config); 43 let mut p = embassy_stm32::init(config);
22 44
23 info!("Hello World!"); 45 info!("Hello World!");
diff --git a/examples/stm32h7/src/bin/camera.rs b/examples/stm32h7/src/bin/camera.rs
index 6f75a0630..de8ddc292 100644
--- a/examples/stm32h7/src/bin/camera.rs
+++ b/examples/stm32h7/src/bin/camera.rs
@@ -6,8 +6,8 @@ use embassy_executor::Spawner;
6use embassy_stm32::dcmi::{self, *}; 6use embassy_stm32::dcmi::{self, *};
7use embassy_stm32::gpio::{Level, Output, Speed}; 7use embassy_stm32::gpio::{Level, Output, Speed};
8use embassy_stm32::i2c::I2c; 8use embassy_stm32::i2c::I2c;
9use embassy_stm32::rcc::{Mco, Mco1Source, McoClock}; 9use embassy_stm32::rcc::{Mco, Mco1Source};
10use embassy_stm32::time::{khz, mhz}; 10use embassy_stm32::time::khz;
11use embassy_stm32::{bind_interrupts, i2c, peripherals, Config}; 11use embassy_stm32::{bind_interrupts, i2c, peripherals, Config};
12use embassy_time::{Duration, Timer}; 12use embassy_time::{Duration, Timer};
13use ov7725::*; 13use ov7725::*;
@@ -26,17 +26,30 @@ bind_interrupts!(struct Irqs {
26#[embassy_executor::main] 26#[embassy_executor::main]
27async fn main(_spawner: Spawner) { 27async fn main(_spawner: Spawner) {
28 let mut config = Config::default(); 28 let mut config = Config::default();
29 config.rcc.sys_ck = Some(mhz(400)); 29 {
30 config.rcc.hclk = Some(mhz(400)); 30 use embassy_stm32::rcc::*;
31 config.rcc.pll1.q_ck = Some(mhz(100)); 31 config.rcc.hsi = Some(Hsi::Mhz64);
32 config.rcc.pclk1 = Some(mhz(100)); 32 config.rcc.csi = true;
33 config.rcc.pclk2 = Some(mhz(100)); 33 config.rcc.pll_src = PllSource::Hsi;
34 config.rcc.pclk3 = Some(mhz(100)); 34 config.rcc.pll1 = Some(Pll {
35 config.rcc.pclk4 = Some(mhz(100)); 35 prediv: 4,
36 mul: 50,
37 divp: Some(2),
38 divq: Some(8), // 100mhz
39 divr: None,
40 });
41 config.rcc.sys = Sysclk::Pll1P; // 400 Mhz
42 config.rcc.ahb_pre = AHBPrescaler::DIV2; // 200 Mhz
43 config.rcc.apb1_pre = APBPrescaler::DIV2; // 100 Mhz
44 config.rcc.apb2_pre = APBPrescaler::DIV2; // 100 Mhz
45 config.rcc.apb3_pre = APBPrescaler::DIV2; // 100 Mhz
46 config.rcc.apb4_pre = APBPrescaler::DIV2; // 100 Mhz
47 config.rcc.voltage_scale = VoltageScale::Scale1;
48 }
36 let p = embassy_stm32::init(config); 49 let p = embassy_stm32::init(config);
37 50
38 defmt::info!("Hello World!"); 51 defmt::info!("Hello World!");
39 let mco = Mco::new(p.MCO1, p.PA8, Mco1Source::Hsi, McoClock::Divided(3)); 52 let mco = Mco::new(p.MCO1, p.PA8, Mco1Source::HSI, 3);
40 53
41 let mut led = Output::new(p.PE3, Level::High, Speed::Low); 54 let mut led = Output::new(p.PE3, Level::High, Speed::Low);
42 let cam_i2c = I2c::new( 55 let cam_i2c = I2c::new(
diff --git a/examples/stm32h7/src/bin/dac.rs b/examples/stm32h7/src/bin/dac.rs
index ee078286b..93df7a319 100644
--- a/examples/stm32h7/src/bin/dac.rs
+++ b/examples/stm32h7/src/bin/dac.rs
@@ -6,7 +6,6 @@ use cortex_m_rt::entry;
6use defmt::*; 6use defmt::*;
7use embassy_stm32::dac::{DacCh1, DacChannel, Value}; 7use embassy_stm32::dac::{DacCh1, DacChannel, Value};
8use embassy_stm32::dma::NoDma; 8use embassy_stm32::dma::NoDma;
9use embassy_stm32::time::mhz;
10use embassy_stm32::Config; 9use embassy_stm32::Config;
11use {defmt_rtt as _, panic_probe as _}; 10use {defmt_rtt as _, panic_probe as _};
12 11
@@ -15,9 +14,34 @@ fn main() -> ! {
15 info!("Hello World, dude!"); 14 info!("Hello World, dude!");
16 15
17 let mut config = Config::default(); 16 let mut config = Config::default();
18 config.rcc.sys_ck = Some(mhz(400)); 17 {
19 config.rcc.hclk = Some(mhz(200)); 18 use embassy_stm32::rcc::*;
20 config.rcc.pll1.q_ck = Some(mhz(100)); 19 config.rcc.hsi = Some(Hsi::Mhz64);
20 config.rcc.csi = true;
21 config.rcc.pll_src = PllSource::Hsi;
22 config.rcc.pll1 = Some(Pll {
23 prediv: 4,
24 mul: 50,
25 divp: Some(2),
26 divq: Some(8), // SPI1 cksel defaults to pll1_q
27 divr: None,
28 });
29 config.rcc.pll2 = Some(Pll {
30 prediv: 4,
31 mul: 50,
32 divp: Some(8), // 100mhz
33 divq: None,
34 divr: None,
35 });
36 config.rcc.sys = Sysclk::Pll1P; // 400 Mhz
37 config.rcc.ahb_pre = AHBPrescaler::DIV2; // 200 Mhz
38 config.rcc.apb1_pre = APBPrescaler::DIV2; // 100 Mhz
39 config.rcc.apb2_pre = APBPrescaler::DIV2; // 100 Mhz
40 config.rcc.apb3_pre = APBPrescaler::DIV2; // 100 Mhz
41 config.rcc.apb4_pre = APBPrescaler::DIV2; // 100 Mhz
42 config.rcc.voltage_scale = VoltageScale::Scale1;
43 config.rcc.adc_clock_source = AdcClockSource::PLL2_P;
44 }
21 let p = embassy_stm32::init(config); 45 let p = embassy_stm32::init(config);
22 46
23 let mut dac = DacCh1::new(p.DAC1, NoDma, p.PA4); 47 let mut dac = DacCh1::new(p.DAC1, NoDma, p.PA4);
diff --git a/examples/stm32h7/src/bin/dac_dma.rs b/examples/stm32h7/src/bin/dac_dma.rs
index a9cb5d1ed..8c921abca 100644
--- a/examples/stm32h7/src/bin/dac_dma.rs
+++ b/examples/stm32h7/src/bin/dac_dma.rs
@@ -8,7 +8,7 @@ use embassy_stm32::dac::{DacChannel, ValueArray};
8use embassy_stm32::pac::timer::vals::{Mms, Opm}; 8use embassy_stm32::pac::timer::vals::{Mms, Opm};
9use embassy_stm32::peripherals::{TIM6, TIM7}; 9use embassy_stm32::peripherals::{TIM6, TIM7};
10use embassy_stm32::rcc::low_level::RccPeripheral; 10use embassy_stm32::rcc::low_level::RccPeripheral;
11use embassy_stm32::time::{mhz, Hertz}; 11use embassy_stm32::time::Hertz;
12use embassy_stm32::timer::low_level::Basic16bitInstance; 12use embassy_stm32::timer::low_level::Basic16bitInstance;
13use micromath::F32Ext; 13use micromath::F32Ext;
14use {defmt_rtt as _, panic_probe as _}; 14use {defmt_rtt as _, panic_probe as _};
@@ -22,9 +22,34 @@ pub type Dac2Type =
22#[embassy_executor::main] 22#[embassy_executor::main]
23async fn main(spawner: Spawner) { 23async fn main(spawner: Spawner) {
24 let mut config = embassy_stm32::Config::default(); 24 let mut config = embassy_stm32::Config::default();
25 config.rcc.sys_ck = Some(mhz(400)); 25 {
26 config.rcc.hclk = Some(mhz(100)); 26 use embassy_stm32::rcc::*;
27 config.rcc.pll1.q_ck = Some(mhz(100)); 27 config.rcc.hsi = Some(Hsi::Mhz64);
28 config.rcc.csi = true;
29 config.rcc.pll_src = PllSource::Hsi;
30 config.rcc.pll1 = Some(Pll {
31 prediv: 4,
32 mul: 50,
33 divp: Some(2),
34 divq: Some(8), // SPI1 cksel defaults to pll1_q
35 divr: None,
36 });
37 config.rcc.pll2 = Some(Pll {
38 prediv: 4,
39 mul: 50,
40 divp: Some(8), // 100mhz
41 divq: None,
42 divr: None,
43 });
44 config.rcc.sys = Sysclk::Pll1P; // 400 Mhz
45 config.rcc.ahb_pre = AHBPrescaler::DIV2; // 200 Mhz
46 config.rcc.apb1_pre = APBPrescaler::DIV2; // 100 Mhz
47 config.rcc.apb2_pre = APBPrescaler::DIV2; // 100 Mhz
48 config.rcc.apb3_pre = APBPrescaler::DIV2; // 100 Mhz
49 config.rcc.apb4_pre = APBPrescaler::DIV2; // 100 Mhz
50 config.rcc.voltage_scale = VoltageScale::Scale1;
51 config.rcc.adc_clock_source = AdcClockSource::PLL2_P;
52 }
28 53
29 // Initialize the board and obtain a Peripherals instance 54 // Initialize the board and obtain a Peripherals instance
30 let p: embassy_stm32::Peripherals = embassy_stm32::init(config); 55 let p: embassy_stm32::Peripherals = embassy_stm32::init(config);
diff --git a/examples/stm32h7/src/bin/eth.rs b/examples/stm32h7/src/bin/eth.rs
index e691c6d06..1b5d71ed3 100644
--- a/examples/stm32h7/src/bin/eth.rs
+++ b/examples/stm32h7/src/bin/eth.rs
@@ -10,7 +10,6 @@ use embassy_stm32::eth::generic_smi::GenericSMI;
10use embassy_stm32::eth::{Ethernet, PacketQueue}; 10use embassy_stm32::eth::{Ethernet, PacketQueue};
11use embassy_stm32::peripherals::ETH; 11use embassy_stm32::peripherals::ETH;
12use embassy_stm32::rng::Rng; 12use embassy_stm32::rng::Rng;
13use embassy_stm32::time::mhz;
14use embassy_stm32::{bind_interrupts, eth, peripherals, rng, Config}; 13use embassy_stm32::{bind_interrupts, eth, peripherals, rng, Config};
15use embassy_time::{Duration, Timer}; 14use embassy_time::{Duration, Timer};
16use embedded_io_async::Write; 15use embedded_io_async::Write;
@@ -33,9 +32,27 @@ async fn net_task(stack: &'static Stack<Device>) -> ! {
33#[embassy_executor::main] 32#[embassy_executor::main]
34async fn main(spawner: Spawner) -> ! { 33async fn main(spawner: Spawner) -> ! {
35 let mut config = Config::default(); 34 let mut config = Config::default();
36 config.rcc.sys_ck = Some(mhz(400)); 35 {
37 config.rcc.hclk = Some(mhz(200)); 36 use embassy_stm32::rcc::*;
38 config.rcc.pll1.q_ck = Some(mhz(100)); 37 config.rcc.hsi = Some(Hsi::Mhz64);
38 config.rcc.csi = true;
39 config.rcc.hsi48 = true; // needed for RNG
40 config.rcc.pll_src = PllSource::Hsi;
41 config.rcc.pll1 = Some(Pll {
42 prediv: 4,
43 mul: 50,
44 divp: Some(2),
45 divq: None,
46 divr: None,
47 });
48 config.rcc.sys = Sysclk::Pll1P; // 400 Mhz
49 config.rcc.ahb_pre = AHBPrescaler::DIV2; // 200 Mhz
50 config.rcc.apb1_pre = APBPrescaler::DIV2; // 100 Mhz
51 config.rcc.apb2_pre = APBPrescaler::DIV2; // 100 Mhz
52 config.rcc.apb3_pre = APBPrescaler::DIV2; // 100 Mhz
53 config.rcc.apb4_pre = APBPrescaler::DIV2; // 100 Mhz
54 config.rcc.voltage_scale = VoltageScale::Scale1;
55 }
39 let p = embassy_stm32::init(config); 56 let p = embassy_stm32::init(config);
40 info!("Hello World!"); 57 info!("Hello World!");
41 58
@@ -102,6 +119,7 @@ async fn main(spawner: Spawner) -> ! {
102 let r = socket.connect(remote_endpoint).await; 119 let r = socket.connect(remote_endpoint).await;
103 if let Err(e) = r { 120 if let Err(e) = r {
104 info!("connect error: {:?}", e); 121 info!("connect error: {:?}", e);
122 Timer::after(Duration::from_secs(1)).await;
105 continue; 123 continue;
106 } 124 }
107 info!("connected!"); 125 info!("connected!");
@@ -109,7 +127,7 @@ async fn main(spawner: Spawner) -> ! {
109 let r = socket.write_all(b"Hello\n").await; 127 let r = socket.write_all(b"Hello\n").await;
110 if let Err(e) = r { 128 if let Err(e) = r {
111 info!("write error: {:?}", e); 129 info!("write error: {:?}", e);
112 continue; 130 break;
113 } 131 }
114 Timer::after(Duration::from_secs(1)).await; 132 Timer::after(Duration::from_secs(1)).await;
115 } 133 }
diff --git a/examples/stm32h7/src/bin/eth_client.rs b/examples/stm32h7/src/bin/eth_client.rs
index ebef54c3c..3abd31c73 100644
--- a/examples/stm32h7/src/bin/eth_client.rs
+++ b/examples/stm32h7/src/bin/eth_client.rs
@@ -10,7 +10,6 @@ use embassy_stm32::eth::generic_smi::GenericSMI;
10use embassy_stm32::eth::{Ethernet, PacketQueue}; 10use embassy_stm32::eth::{Ethernet, PacketQueue};
11use embassy_stm32::peripherals::ETH; 11use embassy_stm32::peripherals::ETH;
12use embassy_stm32::rng::Rng; 12use embassy_stm32::rng::Rng;
13use embassy_stm32::time::mhz;
14use embassy_stm32::{bind_interrupts, eth, peripherals, rng, Config}; 13use embassy_stm32::{bind_interrupts, eth, peripherals, rng, Config};
15use embassy_time::{Duration, Timer}; 14use embassy_time::{Duration, Timer};
16use embedded_io_async::Write; 15use embedded_io_async::Write;
@@ -34,9 +33,27 @@ async fn net_task(stack: &'static Stack<Device>) -> ! {
34#[embassy_executor::main] 33#[embassy_executor::main]
35async fn main(spawner: Spawner) -> ! { 34async fn main(spawner: Spawner) -> ! {
36 let mut config = Config::default(); 35 let mut config = Config::default();
37 config.rcc.sys_ck = Some(mhz(400)); 36 {
38 config.rcc.hclk = Some(mhz(200)); 37 use embassy_stm32::rcc::*;
39 config.rcc.pll1.q_ck = Some(mhz(100)); 38 config.rcc.hsi = Some(Hsi::Mhz64);
39 config.rcc.csi = true;
40 config.rcc.hsi48 = true; // needed for RNG
41 config.rcc.pll_src = PllSource::Hsi;
42 config.rcc.pll1 = Some(Pll {
43 prediv: 4,
44 mul: 50,
45 divp: Some(2),
46 divq: None,
47 divr: None,
48 });
49 config.rcc.sys = Sysclk::Pll1P; // 400 Mhz
50 config.rcc.ahb_pre = AHBPrescaler::DIV2; // 200 Mhz
51 config.rcc.apb1_pre = APBPrescaler::DIV2; // 100 Mhz
52 config.rcc.apb2_pre = APBPrescaler::DIV2; // 100 Mhz
53 config.rcc.apb3_pre = APBPrescaler::DIV2; // 100 Mhz
54 config.rcc.apb4_pre = APBPrescaler::DIV2; // 100 Mhz
55 config.rcc.voltage_scale = VoltageScale::Scale1;
56 }
40 let p = embassy_stm32::init(config); 57 let p = embassy_stm32::init(config);
41 info!("Hello World!"); 58 info!("Hello World!");
42 59
@@ -108,7 +125,7 @@ async fn main(spawner: Spawner) -> ! {
108 let r = connection.write_all(b"Hello\n").await; 125 let r = connection.write_all(b"Hello\n").await;
109 if let Err(e) = r { 126 if let Err(e) = r {
110 info!("write error: {:?}", e); 127 info!("write error: {:?}", e);
111 continue; 128 break;
112 } 129 }
113 Timer::after(Duration::from_secs(1)).await; 130 Timer::after(Duration::from_secs(1)).await;
114 } 131 }
diff --git a/examples/stm32h7/src/bin/fmc.rs b/examples/stm32h7/src/bin/fmc.rs
index 85c690fe6..de0b351df 100644
--- a/examples/stm32h7/src/bin/fmc.rs
+++ b/examples/stm32h7/src/bin/fmc.rs
@@ -5,7 +5,6 @@
5use defmt::*; 5use defmt::*;
6use embassy_executor::Spawner; 6use embassy_executor::Spawner;
7use embassy_stm32::fmc::Fmc; 7use embassy_stm32::fmc::Fmc;
8use embassy_stm32::time::mhz;
9use embassy_stm32::Config; 8use embassy_stm32::Config;
10use embassy_time::{Delay, Duration, Timer}; 9use embassy_time::{Delay, Duration, Timer};
11use {defmt_rtt as _, panic_probe as _}; 10use {defmt_rtt as _, panic_probe as _};
@@ -13,9 +12,26 @@ use {defmt_rtt as _, panic_probe as _};
13#[embassy_executor::main] 12#[embassy_executor::main]
14async fn main(_spawner: Spawner) { 13async fn main(_spawner: Spawner) {
15 let mut config = Config::default(); 14 let mut config = Config::default();
16 config.rcc.sys_ck = Some(mhz(400)); 15 {
17 config.rcc.hclk = Some(mhz(200)); 16 use embassy_stm32::rcc::*;
18 config.rcc.pll1.q_ck = Some(mhz(100)); 17 config.rcc.hsi = Some(Hsi::Mhz64);
18 config.rcc.csi = true;
19 config.rcc.pll_src = PllSource::Hsi;
20 config.rcc.pll1 = Some(Pll {
21 prediv: 4,
22 mul: 50,
23 divp: Some(2),
24 divq: Some(8), // 100mhz
25 divr: None,
26 });
27 config.rcc.sys = Sysclk::Pll1P; // 400 Mhz
28 config.rcc.ahb_pre = AHBPrescaler::DIV2; // 200 Mhz
29 config.rcc.apb1_pre = APBPrescaler::DIV2; // 100 Mhz
30 config.rcc.apb2_pre = APBPrescaler::DIV2; // 100 Mhz
31 config.rcc.apb3_pre = APBPrescaler::DIV2; // 100 Mhz
32 config.rcc.apb4_pre = APBPrescaler::DIV2; // 100 Mhz
33 config.rcc.voltage_scale = VoltageScale::Scale1;
34 }
19 let p = embassy_stm32::init(config); 35 let p = embassy_stm32::init(config);
20 36
21 info!("Hello World!"); 37 info!("Hello World!");
diff --git a/examples/stm32h7/src/bin/low_level_timer_api.rs b/examples/stm32h7/src/bin/low_level_timer_api.rs
index 45b0872b5..a1e955c39 100644
--- a/examples/stm32h7/src/bin/low_level_timer_api.rs
+++ b/examples/stm32h7/src/bin/low_level_timer_api.rs
@@ -6,7 +6,7 @@ use defmt::*;
6use embassy_executor::Spawner; 6use embassy_executor::Spawner;
7use embassy_stm32::gpio::low_level::AFType; 7use embassy_stm32::gpio::low_level::AFType;
8use embassy_stm32::gpio::Speed; 8use embassy_stm32::gpio::Speed;
9use embassy_stm32::time::{khz, mhz, Hertz}; 9use embassy_stm32::time::{khz, Hertz};
10use embassy_stm32::timer::*; 10use embassy_stm32::timer::*;
11use embassy_stm32::{into_ref, Config, Peripheral, PeripheralRef}; 11use embassy_stm32::{into_ref, Config, Peripheral, PeripheralRef};
12use embassy_time::{Duration, Timer}; 12use embassy_time::{Duration, Timer};
@@ -15,13 +15,27 @@ use {defmt_rtt as _, panic_probe as _};
15#[embassy_executor::main] 15#[embassy_executor::main]
16async fn main(_spawner: Spawner) { 16async fn main(_spawner: Spawner) {
17 let mut config = Config::default(); 17 let mut config = Config::default();
18 config.rcc.sys_ck = Some(mhz(400)); 18 {
19 config.rcc.hclk = Some(mhz(400)); 19 use embassy_stm32::rcc::*;
20 config.rcc.pll1.q_ck = Some(mhz(100)); 20 config.rcc.hsi = Some(Hsi::Mhz64);
21 config.rcc.pclk1 = Some(mhz(100)); 21 config.rcc.csi = true;
22 config.rcc.pclk2 = Some(mhz(100)); 22 config.rcc.hsi48 = true; // needed for RNG
23 config.rcc.pclk3 = Some(mhz(100)); 23 config.rcc.pll_src = PllSource::Hsi;
24 config.rcc.pclk4 = Some(mhz(100)); 24 config.rcc.pll1 = Some(Pll {
25 prediv: 4,
26 mul: 50,
27 divp: Some(2),
28 divq: Some(8), // 100 Mhz
29 divr: None,
30 });
31 config.rcc.sys = Sysclk::Pll1P; // 400 Mhz
32 config.rcc.ahb_pre = AHBPrescaler::DIV2; // 200 Mhz
33 config.rcc.apb1_pre = APBPrescaler::DIV2; // 100 Mhz
34 config.rcc.apb2_pre = APBPrescaler::DIV2; // 100 Mhz
35 config.rcc.apb3_pre = APBPrescaler::DIV2; // 100 Mhz
36 config.rcc.apb4_pre = APBPrescaler::DIV2; // 100 Mhz
37 config.rcc.voltage_scale = VoltageScale::Scale1;
38 }
25 let p = embassy_stm32::init(config); 39 let p = embassy_stm32::init(config);
26 40
27 info!("Hello World!"); 41 info!("Hello World!");
diff --git a/examples/stm32h7/src/bin/mco.rs b/examples/stm32h7/src/bin/mco.rs
index 036455d5e..9d6d805ae 100644
--- a/examples/stm32h7/src/bin/mco.rs
+++ b/examples/stm32h7/src/bin/mco.rs
@@ -5,7 +5,7 @@
5use defmt::*; 5use defmt::*;
6use embassy_executor::Spawner; 6use embassy_executor::Spawner;
7use embassy_stm32::gpio::{Level, Output, Speed}; 7use embassy_stm32::gpio::{Level, Output, Speed};
8use embassy_stm32::rcc::{Mco, Mco1Source, McoClock}; 8use embassy_stm32::rcc::{Mco, Mco1Source};
9use embassy_time::{Duration, Timer}; 9use embassy_time::{Duration, Timer};
10use {defmt_rtt as _, panic_probe as _}; 10use {defmt_rtt as _, panic_probe as _};
11 11
@@ -16,7 +16,7 @@ async fn main(_spawner: Spawner) {
16 16
17 let mut led = Output::new(p.PB14, Level::High, Speed::Low); 17 let mut led = Output::new(p.PB14, Level::High, Speed::Low);
18 18
19 let _mco = Mco::new(p.MCO1, p.PA8, Mco1Source::Hsi, McoClock::Divided(8)); 19 let _mco = Mco::new(p.MCO1, p.PA8, Mco1Source::HSI, 8);
20 20
21 loop { 21 loop {
22 info!("high"); 22 info!("high");
diff --git a/examples/stm32h7/src/bin/pwm.rs b/examples/stm32h7/src/bin/pwm.rs
index aa5ec1bcf..5c8e57aa2 100644
--- a/examples/stm32h7/src/bin/pwm.rs
+++ b/examples/stm32h7/src/bin/pwm.rs
@@ -5,7 +5,7 @@
5use defmt::*; 5use defmt::*;
6use embassy_executor::Spawner; 6use embassy_executor::Spawner;
7use embassy_stm32::gpio::OutputType; 7use embassy_stm32::gpio::OutputType;
8use embassy_stm32::time::{khz, mhz}; 8use embassy_stm32::time::khz;
9use embassy_stm32::timer::simple_pwm::{PwmPin, SimplePwm}; 9use embassy_stm32::timer::simple_pwm::{PwmPin, SimplePwm};
10use embassy_stm32::timer::Channel; 10use embassy_stm32::timer::Channel;
11use embassy_stm32::Config; 11use embassy_stm32::Config;
@@ -15,13 +15,26 @@ use {defmt_rtt as _, panic_probe as _};
15#[embassy_executor::main] 15#[embassy_executor::main]
16async fn main(_spawner: Spawner) { 16async fn main(_spawner: Spawner) {
17 let mut config = Config::default(); 17 let mut config = Config::default();
18 config.rcc.sys_ck = Some(mhz(400)); 18 {
19 config.rcc.hclk = Some(mhz(400)); 19 use embassy_stm32::rcc::*;
20 config.rcc.pll1.q_ck = Some(mhz(100)); 20 config.rcc.hsi = Some(Hsi::Mhz64);
21 config.rcc.pclk1 = Some(mhz(100)); 21 config.rcc.csi = true;
22 config.rcc.pclk2 = Some(mhz(100)); 22 config.rcc.pll_src = PllSource::Hsi;
23 config.rcc.pclk3 = Some(mhz(100)); 23 config.rcc.pll1 = Some(Pll {
24 config.rcc.pclk4 = Some(mhz(100)); 24 prediv: 4,
25 mul: 50,
26 divp: Some(2),
27 divq: None,
28 divr: None,
29 });
30 config.rcc.sys = Sysclk::Pll1P; // 400 Mhz
31 config.rcc.ahb_pre = AHBPrescaler::DIV2; // 200 Mhz
32 config.rcc.apb1_pre = APBPrescaler::DIV2; // 100 Mhz
33 config.rcc.apb2_pre = APBPrescaler::DIV2; // 100 Mhz
34 config.rcc.apb3_pre = APBPrescaler::DIV2; // 100 Mhz
35 config.rcc.apb4_pre = APBPrescaler::DIV2; // 100 Mhz
36 config.rcc.voltage_scale = VoltageScale::Scale1;
37 }
25 let p = embassy_stm32::init(config); 38 let p = embassy_stm32::init(config);
26 info!("Hello World!"); 39 info!("Hello World!");
27 40
diff --git a/examples/stm32h7/src/bin/rng.rs b/examples/stm32h7/src/bin/rng.rs
index 7c8c50eca..af1d6ebb8 100644
--- a/examples/stm32h7/src/bin/rng.rs
+++ b/examples/stm32h7/src/bin/rng.rs
@@ -5,7 +5,7 @@
5use defmt::*; 5use defmt::*;
6use embassy_executor::Spawner; 6use embassy_executor::Spawner;
7use embassy_stm32::rng::Rng; 7use embassy_stm32::rng::Rng;
8use embassy_stm32::{bind_interrupts, peripherals, rng}; 8use embassy_stm32::{bind_interrupts, peripherals, rng, Config};
9use {defmt_rtt as _, panic_probe as _}; 9use {defmt_rtt as _, panic_probe as _};
10 10
11bind_interrupts!(struct Irqs { 11bind_interrupts!(struct Irqs {
@@ -14,7 +14,9 @@ bind_interrupts!(struct Irqs {
14 14
15#[embassy_executor::main] 15#[embassy_executor::main]
16async fn main(_spawner: Spawner) { 16async fn main(_spawner: Spawner) {
17 let p = embassy_stm32::init(Default::default()); 17 let mut config = Config::default();
18 config.rcc.hsi48 = true; // needed for RNG.
19 let p = embassy_stm32::init(config);
18 info!("Hello World!"); 20 info!("Hello World!");
19 21
20 let mut rng = Rng::new(p.RNG, Irqs); 22 let mut rng = Rng::new(p.RNG, Irqs);
diff --git a/examples/stm32h7/src/bin/sdmmc.rs b/examples/stm32h7/src/bin/sdmmc.rs
index ce91b6b1c..752aefdf7 100644
--- a/examples/stm32h7/src/bin/sdmmc.rs
+++ b/examples/stm32h7/src/bin/sdmmc.rs
@@ -16,7 +16,26 @@ bind_interrupts!(struct Irqs {
16#[embassy_executor::main] 16#[embassy_executor::main]
17async fn main(_spawner: Spawner) -> ! { 17async fn main(_spawner: Spawner) -> ! {
18 let mut config = Config::default(); 18 let mut config = Config::default();
19 config.rcc.sys_ck = Some(mhz(200)); 19 {
20 use embassy_stm32::rcc::*;
21 config.rcc.hsi = Some(Hsi::Mhz64);
22 config.rcc.csi = true;
23 config.rcc.pll_src = PllSource::Hsi;
24 config.rcc.pll1 = Some(Pll {
25 prediv: 4,
26 mul: 50,
27 divp: Some(2),
28 divq: Some(4), // default clock chosen by SDMMCSEL. 200 Mhz
29 divr: None,
30 });
31 config.rcc.sys = Sysclk::Pll1P; // 400 Mhz
32 config.rcc.ahb_pre = AHBPrescaler::DIV2; // 200 Mhz
33 config.rcc.apb1_pre = APBPrescaler::DIV2; // 100 Mhz
34 config.rcc.apb2_pre = APBPrescaler::DIV2; // 100 Mhz
35 config.rcc.apb3_pre = APBPrescaler::DIV2; // 100 Mhz
36 config.rcc.apb4_pre = APBPrescaler::DIV2; // 100 Mhz
37 config.rcc.voltage_scale = VoltageScale::Scale1;
38 }
20 let p = embassy_stm32::init(config); 39 let p = embassy_stm32::init(config);
21 info!("Hello World!"); 40 info!("Hello World!");
22 41
diff --git a/examples/stm32h7/src/bin/spi.rs b/examples/stm32h7/src/bin/spi.rs
index 28bba2b8d..9fe46f031 100644
--- a/examples/stm32h7/src/bin/spi.rs
+++ b/examples/stm32h7/src/bin/spi.rs
@@ -38,9 +38,26 @@ fn main() -> ! {
38 info!("Hello World!"); 38 info!("Hello World!");
39 39
40 let mut config = Config::default(); 40 let mut config = Config::default();
41 config.rcc.sys_ck = Some(mhz(400)); 41 {
42 config.rcc.hclk = Some(mhz(200)); 42 use embassy_stm32::rcc::*;
43 config.rcc.pll1.q_ck = Some(mhz(100)); 43 config.rcc.hsi = Some(Hsi::Mhz64);
44 config.rcc.csi = true;
45 config.rcc.pll_src = PllSource::Hsi;
46 config.rcc.pll1 = Some(Pll {
47 prediv: 4,
48 mul: 50,
49 divp: Some(2),
50 divq: Some(4), // used by SPI3. 100Mhz.
51 divr: None,
52 });
53 config.rcc.sys = Sysclk::Pll1P; // 400 Mhz
54 config.rcc.ahb_pre = AHBPrescaler::DIV2; // 200 Mhz
55 config.rcc.apb1_pre = APBPrescaler::DIV2; // 100 Mhz
56 config.rcc.apb2_pre = APBPrescaler::DIV2; // 100 Mhz
57 config.rcc.apb3_pre = APBPrescaler::DIV2; // 100 Mhz
58 config.rcc.apb4_pre = APBPrescaler::DIV2; // 100 Mhz
59 config.rcc.voltage_scale = VoltageScale::Scale1;
60 }
44 let p = embassy_stm32::init(config); 61 let p = embassy_stm32::init(config);
45 62
46 let mut spi_config = spi::Config::default(); 63 let mut spi_config = spi::Config::default();
diff --git a/examples/stm32h7/src/bin/spi_dma.rs b/examples/stm32h7/src/bin/spi_dma.rs
index f6e30cfa5..88d65d5be 100644
--- a/examples/stm32h7/src/bin/spi_dma.rs
+++ b/examples/stm32h7/src/bin/spi_dma.rs
@@ -34,9 +34,26 @@ fn main() -> ! {
34 info!("Hello World!"); 34 info!("Hello World!");
35 35
36 let mut config = Config::default(); 36 let mut config = Config::default();
37 config.rcc.sys_ck = Some(mhz(400)); 37 {
38 config.rcc.hclk = Some(mhz(200)); 38 use embassy_stm32::rcc::*;
39 config.rcc.pll1.q_ck = Some(mhz(100)); 39 config.rcc.hsi = Some(Hsi::Mhz64);
40 config.rcc.csi = true;
41 config.rcc.pll_src = PllSource::Hsi;
42 config.rcc.pll1 = Some(Pll {
43 prediv: 4,
44 mul: 50,
45 divp: Some(2),
46 divq: Some(4), // used by SPI3. 100Mhz.
47 divr: None,
48 });
49 config.rcc.sys = Sysclk::Pll1P; // 400 Mhz
50 config.rcc.ahb_pre = AHBPrescaler::DIV2; // 200 Mhz
51 config.rcc.apb1_pre = APBPrescaler::DIV2; // 100 Mhz
52 config.rcc.apb2_pre = APBPrescaler::DIV2; // 100 Mhz
53 config.rcc.apb3_pre = APBPrescaler::DIV2; // 100 Mhz
54 config.rcc.apb4_pre = APBPrescaler::DIV2; // 100 Mhz
55 config.rcc.voltage_scale = VoltageScale::Scale1;
56 }
40 let p = embassy_stm32::init(config); 57 let p = embassy_stm32::init(config);
41 58
42 let mut spi_config = spi::Config::default(); 59 let mut spi_config = spi::Config::default();
diff --git a/examples/stm32h7/src/bin/usb_serial.rs b/examples/stm32h7/src/bin/usb_serial.rs
index 97291f60c..14de43568 100644
--- a/examples/stm32h7/src/bin/usb_serial.rs
+++ b/examples/stm32h7/src/bin/usb_serial.rs
@@ -4,7 +4,6 @@
4 4
5use defmt::{panic, *}; 5use defmt::{panic, *};
6use embassy_executor::Spawner; 6use embassy_executor::Spawner;
7use embassy_stm32::time::mhz;
8use embassy_stm32::usb_otg::{Driver, Instance}; 7use embassy_stm32::usb_otg::{Driver, Instance};
9use embassy_stm32::{bind_interrupts, peripherals, usb_otg, Config}; 8use embassy_stm32::{bind_interrupts, peripherals, usb_otg, Config};
10use embassy_usb::class::cdc_acm::{CdcAcmClass, State}; 9use embassy_usb::class::cdc_acm::{CdcAcmClass, State};
@@ -22,9 +21,27 @@ async fn main(_spawner: Spawner) {
22 info!("Hello World!"); 21 info!("Hello World!");
23 22
24 let mut config = Config::default(); 23 let mut config = Config::default();
25 config.rcc.sys_ck = Some(mhz(400)); 24 {
26 config.rcc.hclk = Some(mhz(200)); 25 use embassy_stm32::rcc::*;
27 config.rcc.pll1.q_ck = Some(mhz(100)); 26 config.rcc.hsi = Some(Hsi::Mhz64);
27 config.rcc.csi = true;
28 config.rcc.hsi48 = true; // needed for USB
29 config.rcc.pll_src = PllSource::Hsi;
30 config.rcc.pll1 = Some(Pll {
31 prediv: 4,
32 mul: 50,
33 divp: Some(2),
34 divq: None,
35 divr: None,
36 });
37 config.rcc.sys = Sysclk::Pll1P; // 400 Mhz
38 config.rcc.ahb_pre = AHBPrescaler::DIV2; // 200 Mhz
39 config.rcc.apb1_pre = APBPrescaler::DIV2; // 100 Mhz
40 config.rcc.apb2_pre = APBPrescaler::DIV2; // 100 Mhz
41 config.rcc.apb3_pre = APBPrescaler::DIV2; // 100 Mhz
42 config.rcc.apb4_pre = APBPrescaler::DIV2; // 100 Mhz
43 config.rcc.voltage_scale = VoltageScale::Scale1;
44 }
28 let p = embassy_stm32::init(config); 45 let p = embassy_stm32::init(config);
29 46
30 // Create the driver, from the HAL. 47 // Create the driver, from the HAL.