diff options
Diffstat (limited to 'examples')
| -rw-r--r-- | examples/stm32f334/src/bin/pwm.rs | 2 | ||||
| -rw-r--r-- | examples/stm32f7/Cargo.toml | 1 | ||||
| -rw-r--r-- | examples/stm32f7/src/bin/cryp.rs | 74 | ||||
| -rw-r--r-- | examples/stm32g0/src/bin/hf_timer.rs | 44 | ||||
| -rw-r--r-- | examples/stm32g0/src/bin/usb_serial.rs | 10 | ||||
| -rw-r--r-- | examples/stm32g4/src/bin/adc.rs | 29 | ||||
| -rw-r--r-- | examples/stm32g4/src/bin/can.rs | 27 | ||||
| -rw-r--r-- | examples/stm32g4/src/bin/pll.rs | 1 | ||||
| -rw-r--r-- | examples/stm32g4/src/bin/usb_serial.rs | 50 | ||||
| -rw-r--r-- | examples/stm32h5/src/bin/can.rs | 2 | ||||
| -rw-r--r-- | examples/stm32h5/src/bin/usb_serial.rs | 7 | ||||
| -rw-r--r-- | examples/stm32h7/src/bin/adc.rs | 2 | ||||
| -rw-r--r-- | examples/stm32h7/src/bin/can.rs | 2 | ||||
| -rw-r--r-- | examples/stm32h7/src/bin/dac.rs | 2 | ||||
| -rw-r--r-- | examples/stm32h7/src/bin/dac_dma.rs | 2 | ||||
| -rw-r--r-- | examples/stm32l4/src/bin/adc.rs | 14 |
16 files changed, 173 insertions, 96 deletions
diff --git a/examples/stm32f334/src/bin/pwm.rs b/examples/stm32f334/src/bin/pwm.rs index 7c6d6cd71..e6d1a6c02 100644 --- a/examples/stm32f334/src/bin/pwm.rs +++ b/examples/stm32f334/src/bin/pwm.rs | |||
| @@ -28,7 +28,7 @@ async fn main(_spawner: Spawner) { | |||
| 28 | config.rcc.apb1_pre = APBPrescaler::DIV2; | 28 | config.rcc.apb1_pre = APBPrescaler::DIV2; |
| 29 | config.rcc.apb2_pre = APBPrescaler::DIV1; | 29 | config.rcc.apb2_pre = APBPrescaler::DIV1; |
| 30 | 30 | ||
| 31 | config.rcc.mux.hrtim1sw = Some(embassy_stm32::rcc::mux::Timsw::PLL1_P); | 31 | config.rcc.mux.hrtim1sw = embassy_stm32::rcc::mux::Timsw::PLL1_P; |
| 32 | } | 32 | } |
| 33 | let p = embassy_stm32::init(config); | 33 | let p = embassy_stm32::init(config); |
| 34 | 34 | ||
diff --git a/examples/stm32f7/Cargo.toml b/examples/stm32f7/Cargo.toml index 736e81723..305816a2b 100644 --- a/examples/stm32f7/Cargo.toml +++ b/examples/stm32f7/Cargo.toml | |||
| @@ -30,6 +30,7 @@ embedded-storage = "0.3.1" | |||
| 30 | static_cell = "2" | 30 | static_cell = "2" |
| 31 | sha2 = { version = "0.10.8", default-features = false } | 31 | sha2 = { version = "0.10.8", default-features = false } |
| 32 | hmac = "0.12.1" | 32 | hmac = "0.12.1" |
| 33 | aes-gcm = {version = "0.10.3", default-features = false, features = ["aes", "heapless"] } | ||
| 33 | 34 | ||
| 34 | [profile.release] | 35 | [profile.release] |
| 35 | debug = 2 | 36 | debug = 2 |
diff --git a/examples/stm32f7/src/bin/cryp.rs b/examples/stm32f7/src/bin/cryp.rs new file mode 100644 index 000000000..04927841a --- /dev/null +++ b/examples/stm32f7/src/bin/cryp.rs | |||
| @@ -0,0 +1,74 @@ | |||
| 1 | #![no_std] | ||
| 2 | #![no_main] | ||
| 3 | |||
| 4 | use aes_gcm::aead::heapless::Vec; | ||
| 5 | use aes_gcm::aead::{AeadInPlace, KeyInit}; | ||
| 6 | use aes_gcm::Aes128Gcm; | ||
| 7 | use defmt::info; | ||
| 8 | use embassy_executor::Spawner; | ||
| 9 | use embassy_stm32::cryp::*; | ||
| 10 | use embassy_stm32::Config; | ||
| 11 | use embassy_time::Instant; | ||
| 12 | use {defmt_rtt as _, panic_probe as _}; | ||
| 13 | |||
| 14 | #[embassy_executor::main] | ||
| 15 | async fn main(_spawner: Spawner) -> ! { | ||
| 16 | let config = Config::default(); | ||
| 17 | let p = embassy_stm32::init(config); | ||
| 18 | |||
| 19 | let payload: &[u8] = b"hello world"; | ||
| 20 | let aad: &[u8] = b"additional data"; | ||
| 21 | |||
| 22 | let hw_cryp = Cryp::new(p.CRYP); | ||
| 23 | let key: [u8; 16] = [0; 16]; | ||
| 24 | let mut ciphertext: [u8; 11] = [0; 11]; | ||
| 25 | let mut plaintext: [u8; 11] = [0; 11]; | ||
| 26 | let iv: [u8; 12] = [0; 12]; | ||
| 27 | |||
| 28 | let hw_start_time = Instant::now(); | ||
| 29 | |||
| 30 | // Encrypt in hardware using AES-GCM 128-bit | ||
| 31 | let aes_gcm = AesGcm::new(&key, &iv); | ||
| 32 | let mut gcm_encrypt = hw_cryp.start(&aes_gcm, Direction::Encrypt); | ||
| 33 | hw_cryp.aad_blocking(&mut gcm_encrypt, aad, true); | ||
| 34 | hw_cryp.payload_blocking(&mut gcm_encrypt, payload, &mut ciphertext, true); | ||
| 35 | let encrypt_tag = hw_cryp.finish_blocking(gcm_encrypt); | ||
| 36 | |||
| 37 | // Decrypt in hardware using AES-GCM 128-bit | ||
| 38 | let mut gcm_decrypt = hw_cryp.start(&aes_gcm, Direction::Decrypt); | ||
| 39 | hw_cryp.aad_blocking(&mut gcm_decrypt, aad, true); | ||
| 40 | hw_cryp.payload_blocking(&mut gcm_decrypt, &ciphertext, &mut plaintext, true); | ||
| 41 | let decrypt_tag = hw_cryp.finish_blocking(gcm_decrypt); | ||
| 42 | |||
| 43 | let hw_end_time = Instant::now(); | ||
| 44 | let hw_execution_time = hw_end_time - hw_start_time; | ||
| 45 | |||
| 46 | info!("AES-GCM Ciphertext: {:?}", ciphertext); | ||
| 47 | info!("AES-GCM Plaintext: {:?}", plaintext); | ||
| 48 | assert_eq!(payload, plaintext); | ||
| 49 | assert_eq!(encrypt_tag, decrypt_tag); | ||
| 50 | |||
| 51 | let sw_start_time = Instant::now(); | ||
| 52 | |||
| 53 | // Encrypt in software using AES-GCM 128-bit | ||
| 54 | let mut payload_vec: Vec<u8, 32> = Vec::from_slice(&payload).unwrap(); | ||
| 55 | let cipher = Aes128Gcm::new(&key.into()); | ||
| 56 | let _ = cipher.encrypt_in_place(&iv.into(), aad.into(), &mut payload_vec); | ||
| 57 | |||
| 58 | assert_eq!(ciphertext, payload_vec[0..ciphertext.len()]); | ||
| 59 | assert_eq!( | ||
| 60 | encrypt_tag, | ||
| 61 | payload_vec[ciphertext.len()..ciphertext.len() + encrypt_tag.len()] | ||
| 62 | ); | ||
| 63 | |||
| 64 | // Decrypt in software using AES-GCM 128-bit | ||
| 65 | let _ = cipher.decrypt_in_place(&iv.into(), aad.into(), &mut payload_vec); | ||
| 66 | |||
| 67 | let sw_end_time = Instant::now(); | ||
| 68 | let sw_execution_time = sw_end_time - sw_start_time; | ||
| 69 | |||
| 70 | info!("Hardware Execution Time: {:?}", hw_execution_time); | ||
| 71 | info!("Software Execution Time: {:?}", sw_execution_time); | ||
| 72 | |||
| 73 | loop {} | ||
| 74 | } | ||
diff --git a/examples/stm32g0/src/bin/hf_timer.rs b/examples/stm32g0/src/bin/hf_timer.rs index 3f63d0dfd..647ff0419 100644 --- a/examples/stm32g0/src/bin/hf_timer.rs +++ b/examples/stm32g0/src/bin/hf_timer.rs | |||
| @@ -4,37 +4,35 @@ | |||
| 4 | use defmt::info; | 4 | use defmt::info; |
| 5 | use embassy_executor::Spawner; | 5 | use embassy_executor::Spawner; |
| 6 | use embassy_stm32::gpio::OutputType; | 6 | use embassy_stm32::gpio::OutputType; |
| 7 | use embassy_stm32::pac::rcc::vals::Tim1sel; | ||
| 8 | use embassy_stm32::rcc::{Config as RccConfig, PllConfig, PllSource, Pllm, Plln, Pllq, Pllr, Sysclk}; | ||
| 9 | use embassy_stm32::time::khz; | 7 | use embassy_stm32::time::khz; |
| 10 | use embassy_stm32::timer::complementary_pwm::{ComplementaryPwm, ComplementaryPwmPin}; | 8 | use embassy_stm32::timer::complementary_pwm::{ComplementaryPwm, ComplementaryPwmPin}; |
| 11 | use embassy_stm32::timer::simple_pwm::PwmPin; | 9 | use embassy_stm32::timer::simple_pwm::PwmPin; |
| 12 | use embassy_stm32::timer::Channel; | 10 | use embassy_stm32::timer::Channel; |
| 13 | use embassy_stm32::{pac, Config as PeripheralConfig}; | 11 | use embassy_stm32::Config as PeripheralConfig; |
| 14 | use {defmt_rtt as _, panic_probe as _}; | 12 | use {defmt_rtt as _, panic_probe as _}; |
| 15 | 13 | ||
| 16 | #[embassy_executor::main] | 14 | #[embassy_executor::main] |
| 17 | async fn main(_spawner: Spawner) { | 15 | async fn main(_spawner: Spawner) { |
| 18 | let mut rcc_config = RccConfig::default(); | 16 | let mut config = PeripheralConfig::default(); |
| 19 | rcc_config.sys = Sysclk::PLL(PllConfig { | 17 | { |
| 20 | source: PllSource::HSI, | 18 | use embassy_stm32::rcc::*; |
| 21 | m: Pllm::DIV1, | 19 | |
| 22 | n: Plln::MUL16, | 20 | config.rcc.sys = Sysclk::PLL(PllConfig { |
| 23 | r: Pllr::DIV4, // CPU clock comes from PLLR (HSI (16MHz) / 1 * 16 / 4 = 64MHz) | 21 | source: PllSource::HSI, |
| 24 | q: Some(Pllq::DIV2), // TIM1 or TIM15 can be sourced from PLLQ (HSI (16MHz) / 1 * 16 / 2 = 128MHz) | 22 | m: Pllm::DIV1, |
| 25 | p: None, | 23 | n: Plln::MUL16, |
| 26 | }); | 24 | r: Pllr::DIV4, // CPU clock comes from PLLR (HSI (16MHz) / 1 * 16 / 4 = 64MHz) |
| 27 | 25 | q: Some(Pllq::DIV2), // TIM1 or TIM15 can be sourced from PLLQ (HSI (16MHz) / 1 * 16 / 2 = 128MHz) | |
| 28 | let mut peripheral_config = PeripheralConfig::default(); | 26 | p: None, |
| 29 | peripheral_config.rcc = rcc_config; | 27 | }); |
| 30 | 28 | ||
| 31 | let p = embassy_stm32::init(peripheral_config); | 29 | // configure TIM1 mux to select PLLQ as clock source |
| 32 | 30 | // https://www.st.com/resource/en/reference_manual/rm0444-stm32g0x1-advanced-armbased-32bit-mcus-stmicroelectronics.pdf | |
| 33 | // configure TIM1 mux to select PLLQ as clock source | 31 | // RM0444 page 210 |
| 34 | // https://www.st.com/resource/en/reference_manual/rm0444-stm32g0x1-advanced-armbased-32bit-mcus-stmicroelectronics.pdf | 32 | // RCC - Peripherals Independent Clock Control Register - bit 22 -> 1 |
| 35 | // RM0444 page 210 | 33 | config.rcc.mux.tim1sel = embassy_stm32::rcc::mux::Tim1sel::PLL1_Q; |
| 36 | // RCC - Peripherals Independent Clock Control Register - bit 22 -> 1 | 34 | } |
| 37 | pac::RCC.ccipr().modify(|w| w.set_tim1sel(Tim1sel::PLL1_Q)); | 35 | let p = embassy_stm32::init(config); |
| 38 | 36 | ||
| 39 | let ch1 = PwmPin::new_ch1(p.PA8, OutputType::PushPull); | 37 | let ch1 = PwmPin::new_ch1(p.PA8, OutputType::PushPull); |
| 40 | let ch1n = ComplementaryPwmPin::new_ch1(p.PA7, OutputType::PushPull); | 38 | let ch1n = ComplementaryPwmPin::new_ch1(p.PA7, OutputType::PushPull); |
diff --git a/examples/stm32g0/src/bin/usb_serial.rs b/examples/stm32g0/src/bin/usb_serial.rs index f5aaa5624..8b9915626 100644 --- a/examples/stm32g0/src/bin/usb_serial.rs +++ b/examples/stm32g0/src/bin/usb_serial.rs | |||
| @@ -4,7 +4,6 @@ | |||
| 4 | use defmt::{panic, *}; | 4 | use defmt::{panic, *}; |
| 5 | use embassy_executor::Spawner; | 5 | use embassy_executor::Spawner; |
| 6 | use embassy_futures::join::join; | 6 | use embassy_futures::join::join; |
| 7 | use embassy_stm32::rcc::{Hsi48Config, UsbSrc}; | ||
| 8 | use embassy_stm32::usb::{Driver, Instance}; | 7 | use embassy_stm32::usb::{Driver, Instance}; |
| 9 | use embassy_stm32::{bind_interrupts, peripherals, usb, Config}; | 8 | use embassy_stm32::{bind_interrupts, peripherals, usb, Config}; |
| 10 | use embassy_usb::class::cdc_acm::{CdcAcmClass, State}; | 9 | use embassy_usb::class::cdc_acm::{CdcAcmClass, State}; |
| @@ -19,10 +18,11 @@ bind_interrupts!(struct Irqs { | |||
| 19 | #[embassy_executor::main] | 18 | #[embassy_executor::main] |
| 20 | async fn main(_spawner: Spawner) { | 19 | async fn main(_spawner: Spawner) { |
| 21 | let mut config = Config::default(); | 20 | let mut config = Config::default(); |
| 22 | config.rcc.usb_src = Some(UsbSrc::Hsi48(Hsi48Config { | 21 | { |
| 23 | sync_from_usb: true, | 22 | use embassy_stm32::rcc::*; |
| 24 | ..Default::default() | 23 | config.rcc.hsi48 = Some(Hsi48Config { sync_from_usb: true }); |
| 25 | })); | 24 | config.rcc.mux.usbsel = mux::Usbsel::HSI48; |
| 25 | } | ||
| 26 | let p = embassy_stm32::init(config); | 26 | let p = embassy_stm32::init(config); |
| 27 | 27 | ||
| 28 | info!("Hello World!"); | 28 | info!("Hello World!"); |
diff --git a/examples/stm32g4/src/bin/adc.rs b/examples/stm32g4/src/bin/adc.rs index 6c6de1ffe..f81335f93 100644 --- a/examples/stm32g4/src/bin/adc.rs +++ b/examples/stm32g4/src/bin/adc.rs | |||
| @@ -4,7 +4,6 @@ | |||
| 4 | use defmt::*; | 4 | use defmt::*; |
| 5 | use embassy_executor::Spawner; | 5 | use embassy_executor::Spawner; |
| 6 | use embassy_stm32::adc::{Adc, SampleTime}; | 6 | use embassy_stm32::adc::{Adc, SampleTime}; |
| 7 | use embassy_stm32::rcc::{AdcClockSource, Pll, PllMul, PllPreDiv, PllRDiv, Pllsrc, Sysclk}; | ||
| 8 | use embassy_stm32::Config; | 7 | use embassy_stm32::Config; |
| 9 | use embassy_time::{Delay, Timer}; | 8 | use embassy_time::{Delay, Timer}; |
| 10 | use {defmt_rtt as _, panic_probe as _}; | 9 | use {defmt_rtt as _, panic_probe as _}; |
| @@ -12,20 +11,20 @@ use {defmt_rtt as _, panic_probe as _}; | |||
| 12 | #[embassy_executor::main] | 11 | #[embassy_executor::main] |
| 13 | async fn main(_spawner: Spawner) { | 12 | async fn main(_spawner: Spawner) { |
| 14 | let mut config = Config::default(); | 13 | let mut config = Config::default(); |
| 15 | 14 | { | |
| 16 | config.rcc.pll = Some(Pll { | 15 | use embassy_stm32::rcc::*; |
| 17 | source: Pllsrc::HSI, | 16 | config.rcc.pll = Some(Pll { |
| 18 | prediv: PllPreDiv::DIV4, | 17 | source: Pllsrc::HSI, |
| 19 | mul: PllMul::MUL85, | 18 | prediv: PllPreDiv::DIV4, |
| 20 | divp: None, | 19 | mul: PllMul::MUL85, |
| 21 | divq: None, | 20 | divp: None, |
| 22 | // Main system clock at 170 MHz | 21 | divq: None, |
| 23 | divr: Some(PllRDiv::DIV2), | 22 | // Main system clock at 170 MHz |
| 24 | }); | 23 | divr: Some(PllRDiv::DIV2), |
| 25 | 24 | }); | |
| 26 | config.rcc.adc12_clock_source = AdcClockSource::SYS; | 25 | config.rcc.mux.adc12sel = mux::Adcsel::SYS; |
| 27 | config.rcc.sys = Sysclk::PLL1_R; | 26 | config.rcc.sys = Sysclk::PLL1_R; |
| 28 | 27 | } | |
| 29 | let mut p = embassy_stm32::init(config); | 28 | let mut p = embassy_stm32::init(config); |
| 30 | info!("Hello World!"); | 29 | info!("Hello World!"); |
| 31 | 30 | ||
diff --git a/examples/stm32g4/src/bin/can.rs b/examples/stm32g4/src/bin/can.rs index a41f765c1..93b206de8 100644 --- a/examples/stm32g4/src/bin/can.rs +++ b/examples/stm32g4/src/bin/can.rs | |||
| @@ -3,6 +3,7 @@ | |||
| 3 | use defmt::*; | 3 | use defmt::*; |
| 4 | use embassy_executor::Spawner; | 4 | use embassy_executor::Spawner; |
| 5 | use embassy_stm32::peripherals::*; | 5 | use embassy_stm32::peripherals::*; |
| 6 | use embassy_stm32::time::Hertz; | ||
| 6 | use embassy_stm32::{bind_interrupts, can, Config}; | 7 | use embassy_stm32::{bind_interrupts, can, Config}; |
| 7 | use embassy_time::Timer; | 8 | use embassy_time::Timer; |
| 8 | use static_cell::StaticCell; | 9 | use static_cell::StaticCell; |
| @@ -15,8 +16,24 @@ bind_interrupts!(struct Irqs { | |||
| 15 | 16 | ||
| 16 | #[embassy_executor::main] | 17 | #[embassy_executor::main] |
| 17 | async fn main(_spawner: Spawner) { | 18 | async fn main(_spawner: Spawner) { |
| 18 | let config = Config::default(); | 19 | let mut config = Config::default(); |
| 19 | 20 | { | |
| 21 | use embassy_stm32::rcc::*; | ||
| 22 | config.rcc.hse = Some(Hse { | ||
| 23 | freq: Hertz(24_000_000), | ||
| 24 | mode: HseMode::Oscillator, | ||
| 25 | }); | ||
| 26 | config.rcc.pll = Some(Pll { | ||
| 27 | source: Pllsrc::HSE, | ||
| 28 | prediv: PllPreDiv::DIV6, | ||
| 29 | mul: PllMul::MUL85, | ||
| 30 | divp: None, | ||
| 31 | divq: Some(PllQDiv::DIV8), // 42.5 Mhz for fdcan. | ||
| 32 | divr: Some(PllRDiv::DIV2), // Main system clock at 170 MHz | ||
| 33 | }); | ||
| 34 | config.rcc.mux.fdcansel = mux::Fdcansel::PLL1_Q; | ||
| 35 | config.rcc.sys = Sysclk::PLL1_R; | ||
| 36 | } | ||
| 20 | let peripherals = embassy_stm32::init(config); | 37 | let peripherals = embassy_stm32::init(config); |
| 21 | 38 | ||
| 22 | let mut can = can::FdcanConfigurator::new(peripherals.FDCAN1, peripherals.PA11, peripherals.PA12, Irqs); | 39 | let mut can = can::FdcanConfigurator::new(peripherals.FDCAN1, peripherals.PA11, peripherals.PA12, Irqs); |
| @@ -184,7 +201,11 @@ async fn main(_spawner: Spawner) { | |||
| 184 | let frame = can::frame::ClassicFrame::new_extended(0x123456F, &[i; 8]).unwrap(); | 201 | let frame = can::frame::ClassicFrame::new_extended(0x123456F, &[i; 8]).unwrap(); |
| 185 | info!("Writing frame"); | 202 | info!("Writing frame"); |
| 186 | 203 | ||
| 187 | _ = can.write(frame).await; | 204 | // You can use any of these approaches to send. The writer makes it |
| 205 | // easy to share sending from multiple tasks. | ||
| 206 | //_ = can.write(frame).await; | ||
| 207 | //can.writer().try_write(frame).unwrap(); | ||
| 208 | can.writer().write(frame).await; | ||
| 188 | 209 | ||
| 189 | match can.read().await { | 210 | match can.read().await { |
| 190 | Ok((rx_frame, ts)) => { | 211 | Ok((rx_frame, ts)) => { |
diff --git a/examples/stm32g4/src/bin/pll.rs b/examples/stm32g4/src/bin/pll.rs index 5274de79d..2609abfa2 100644 --- a/examples/stm32g4/src/bin/pll.rs +++ b/examples/stm32g4/src/bin/pll.rs | |||
| @@ -12,6 +12,7 @@ use {defmt_rtt as _, panic_probe as _}; | |||
| 12 | async fn main(_spawner: Spawner) { | 12 | async fn main(_spawner: Spawner) { |
| 13 | let mut config = Config::default(); | 13 | let mut config = Config::default(); |
| 14 | 14 | ||
| 15 | config.rcc.hsi = true; | ||
| 15 | config.rcc.pll = Some(Pll { | 16 | config.rcc.pll = Some(Pll { |
| 16 | source: Pllsrc::HSI, | 17 | source: Pllsrc::HSI, |
| 17 | prediv: PllPreDiv::DIV4, | 18 | prediv: PllPreDiv::DIV4, |
diff --git a/examples/stm32g4/src/bin/usb_serial.rs b/examples/stm32g4/src/bin/usb_serial.rs index 989fef5b0..90caaae14 100644 --- a/examples/stm32g4/src/bin/usb_serial.rs +++ b/examples/stm32g4/src/bin/usb_serial.rs | |||
| @@ -3,9 +3,6 @@ | |||
| 3 | 3 | ||
| 4 | use defmt::{panic, *}; | 4 | use defmt::{panic, *}; |
| 5 | use embassy_executor::Spawner; | 5 | use embassy_executor::Spawner; |
| 6 | use embassy_stm32::rcc::{ | ||
| 7 | Clk48Src, Hse, HseMode, Hsi48Config, Pll, PllMul, PllPreDiv, PllQDiv, PllRDiv, Pllsrc, Sysclk, | ||
| 8 | }; | ||
| 9 | use embassy_stm32::time::Hertz; | 6 | use embassy_stm32::time::Hertz; |
| 10 | use embassy_stm32::usb::{self, Driver, Instance}; | 7 | use embassy_stm32::usb::{self, Driver, Instance}; |
| 11 | use embassy_stm32::{bind_interrupts, peripherals, Config}; | 8 | use embassy_stm32::{bind_interrupts, peripherals, Config}; |
| @@ -22,38 +19,27 @@ bind_interrupts!(struct Irqs { | |||
| 22 | #[embassy_executor::main] | 19 | #[embassy_executor::main] |
| 23 | async fn main(_spawner: Spawner) { | 20 | async fn main(_spawner: Spawner) { |
| 24 | let mut config = Config::default(); | 21 | let mut config = Config::default(); |
| 25 | 22 | { | |
| 26 | // Change this to `false` to use the HSE clock source for the USB. This example assumes an 8MHz HSE. | 23 | use embassy_stm32::rcc::*; |
| 27 | const USE_HSI48: bool = true; | ||
| 28 | |||
| 29 | let plldivq = if USE_HSI48 { None } else { Some(PllQDiv::DIV6) }; | ||
| 30 | |||
| 31 | config.rcc.hse = Some(Hse { | ||
| 32 | freq: Hertz(8_000_000), | ||
| 33 | mode: HseMode::Oscillator, | ||
| 34 | }); | ||
| 35 | |||
| 36 | config.rcc.pll = Some(Pll { | ||
| 37 | source: Pllsrc::HSE, | ||
| 38 | prediv: PllPreDiv::DIV2, | ||
| 39 | mul: PllMul::MUL72, | ||
| 40 | divp: None, | ||
| 41 | divq: plldivq, | ||
| 42 | // Main system clock at 144 MHz | ||
| 43 | divr: Some(PllRDiv::DIV2), | ||
| 44 | }); | ||
| 45 | |||
| 46 | config.rcc.sys = Sysclk::PLL1_R; | ||
| 47 | config.rcc.boost = true; // BOOST! | ||
| 48 | |||
| 49 | if USE_HSI48 { | ||
| 50 | // Sets up the Clock Recovery System (CRS) to use the USB SOF to trim the HSI48 oscillator. | 24 | // Sets up the Clock Recovery System (CRS) to use the USB SOF to trim the HSI48 oscillator. |
| 51 | config.rcc.hsi48 = Some(Hsi48Config { sync_from_usb: true }); | 25 | config.rcc.hsi48 = Some(Hsi48Config { sync_from_usb: true }); |
| 52 | config.rcc.clk48_src = Clk48Src::HSI48; | 26 | config.rcc.hse = Some(Hse { |
| 53 | } else { | 27 | freq: Hertz(8_000_000), |
| 54 | config.rcc.clk48_src = Clk48Src::PLL1_Q; | 28 | mode: HseMode::Oscillator, |
| 29 | }); | ||
| 30 | config.rcc.pll = Some(Pll { | ||
| 31 | source: Pllsrc::HSE, | ||
| 32 | prediv: PllPreDiv::DIV2, | ||
| 33 | mul: PllMul::MUL72, | ||
| 34 | divp: None, | ||
| 35 | divq: Some(PllQDiv::DIV6), // 48mhz | ||
| 36 | divr: Some(PllRDiv::DIV2), // Main system clock at 144 MHz | ||
| 37 | }); | ||
| 38 | config.rcc.sys = Sysclk::PLL1_R; | ||
| 39 | config.rcc.boost = true; // BOOST! | ||
| 40 | config.rcc.mux.clk48sel = mux::Clk48sel::HSI48; | ||
| 41 | //config.rcc.mux.clk48sel = mux::Clk48sel::PLL1_Q; // uncomment to use PLL1_Q instead. | ||
| 55 | } | 42 | } |
| 56 | |||
| 57 | let p = embassy_stm32::init(config); | 43 | let p = embassy_stm32::init(config); |
| 58 | 44 | ||
| 59 | info!("Hello World!"); | 45 | info!("Hello World!"); |
diff --git a/examples/stm32h5/src/bin/can.rs b/examples/stm32h5/src/bin/can.rs index e5ccfe4f7..643df27f9 100644 --- a/examples/stm32h5/src/bin/can.rs +++ b/examples/stm32h5/src/bin/can.rs | |||
| @@ -20,7 +20,7 @@ async fn main(_spawner: Spawner) { | |||
| 20 | freq: embassy_stm32::time::Hertz(25_000_000), | 20 | freq: embassy_stm32::time::Hertz(25_000_000), |
| 21 | mode: rcc::HseMode::Oscillator, | 21 | mode: rcc::HseMode::Oscillator, |
| 22 | }); | 22 | }); |
| 23 | config.rcc.fdcan_clock_source = rcc::FdCanClockSource::HSE; | 23 | config.rcc.mux.fdcan12sel = rcc::mux::Fdcansel::HSE; |
| 24 | 24 | ||
| 25 | let peripherals = embassy_stm32::init(config); | 25 | let peripherals = embassy_stm32::init(config); |
| 26 | 26 | ||
diff --git a/examples/stm32h5/src/bin/usb_serial.rs b/examples/stm32h5/src/bin/usb_serial.rs index 208493d8c..83477c8fa 100644 --- a/examples/stm32h5/src/bin/usb_serial.rs +++ b/examples/stm32h5/src/bin/usb_serial.rs | |||
| @@ -5,7 +5,7 @@ use defmt::{panic, *}; | |||
| 5 | use embassy_executor::Spawner; | 5 | use embassy_executor::Spawner; |
| 6 | use embassy_stm32::time::Hertz; | 6 | use embassy_stm32::time::Hertz; |
| 7 | use embassy_stm32::usb::{Driver, Instance}; | 7 | use embassy_stm32::usb::{Driver, Instance}; |
| 8 | use embassy_stm32::{bind_interrupts, pac, peripherals, usb, Config}; | 8 | use embassy_stm32::{bind_interrupts, peripherals, usb, Config}; |
| 9 | use embassy_usb::class::cdc_acm::{CdcAcmClass, State}; | 9 | use embassy_usb::class::cdc_acm::{CdcAcmClass, State}; |
| 10 | use embassy_usb::driver::EndpointError; | 10 | use embassy_usb::driver::EndpointError; |
| 11 | use embassy_usb::Builder; | 11 | use embassy_usb::Builder; |
| @@ -41,15 +41,12 @@ async fn main(_spawner: Spawner) { | |||
| 41 | config.rcc.apb3_pre = APBPrescaler::DIV4; | 41 | config.rcc.apb3_pre = APBPrescaler::DIV4; |
| 42 | config.rcc.sys = Sysclk::PLL1_P; | 42 | config.rcc.sys = Sysclk::PLL1_P; |
| 43 | config.rcc.voltage_scale = VoltageScale::Scale0; | 43 | config.rcc.voltage_scale = VoltageScale::Scale0; |
| 44 | config.rcc.mux.usbsel = mux::Usbsel::HSI48; | ||
| 44 | } | 45 | } |
| 45 | let p = embassy_stm32::init(config); | 46 | let p = embassy_stm32::init(config); |
| 46 | 47 | ||
| 47 | info!("Hello World!"); | 48 | info!("Hello World!"); |
| 48 | 49 | ||
| 49 | pac::RCC.ccipr4().write(|w| { | ||
| 50 | w.set_usbsel(pac::rcc::vals::Usbsel::HSI48); | ||
| 51 | }); | ||
| 52 | |||
| 53 | // Create the driver, from the HAL. | 50 | // Create the driver, from the HAL. |
| 54 | let driver = Driver::new(p.USB, Irqs, p.PA12, p.PA11); | 51 | let driver = Driver::new(p.USB, Irqs, p.PA12, p.PA11); |
| 55 | 52 | ||
diff --git a/examples/stm32h7/src/bin/adc.rs b/examples/stm32h7/src/bin/adc.rs index f0278239f..a5594d10c 100644 --- a/examples/stm32h7/src/bin/adc.rs +++ b/examples/stm32h7/src/bin/adc.rs | |||
| @@ -38,7 +38,7 @@ async fn main(_spawner: Spawner) { | |||
| 38 | config.rcc.apb3_pre = APBPrescaler::DIV2; // 100 Mhz | 38 | config.rcc.apb3_pre = APBPrescaler::DIV2; // 100 Mhz |
| 39 | config.rcc.apb4_pre = APBPrescaler::DIV2; // 100 Mhz | 39 | config.rcc.apb4_pre = APBPrescaler::DIV2; // 100 Mhz |
| 40 | config.rcc.voltage_scale = VoltageScale::Scale1; | 40 | config.rcc.voltage_scale = VoltageScale::Scale1; |
| 41 | config.rcc.adc_clock_source = AdcClockSource::PLL2_P; | 41 | config.rcc.mux.adcsel = mux::Adcsel::PLL2_P; |
| 42 | } | 42 | } |
| 43 | let mut p = embassy_stm32::init(config); | 43 | let mut p = embassy_stm32::init(config); |
| 44 | 44 | ||
diff --git a/examples/stm32h7/src/bin/can.rs b/examples/stm32h7/src/bin/can.rs index e5ccfe4f7..13a6a5051 100644 --- a/examples/stm32h7/src/bin/can.rs +++ b/examples/stm32h7/src/bin/can.rs | |||
| @@ -20,7 +20,7 @@ async fn main(_spawner: Spawner) { | |||
| 20 | freq: embassy_stm32::time::Hertz(25_000_000), | 20 | freq: embassy_stm32::time::Hertz(25_000_000), |
| 21 | mode: rcc::HseMode::Oscillator, | 21 | mode: rcc::HseMode::Oscillator, |
| 22 | }); | 22 | }); |
| 23 | config.rcc.fdcan_clock_source = rcc::FdCanClockSource::HSE; | 23 | config.rcc.mux.fdcansel = rcc::mux::Fdcansel::HSE; |
| 24 | 24 | ||
| 25 | let peripherals = embassy_stm32::init(config); | 25 | let peripherals = embassy_stm32::init(config); |
| 26 | 26 | ||
diff --git a/examples/stm32h7/src/bin/dac.rs b/examples/stm32h7/src/bin/dac.rs index a9bf46de0..a6f969aba 100644 --- a/examples/stm32h7/src/bin/dac.rs +++ b/examples/stm32h7/src/bin/dac.rs | |||
| @@ -40,7 +40,7 @@ fn main() -> ! { | |||
| 40 | config.rcc.apb3_pre = APBPrescaler::DIV2; // 100 Mhz | 40 | config.rcc.apb3_pre = APBPrescaler::DIV2; // 100 Mhz |
| 41 | config.rcc.apb4_pre = APBPrescaler::DIV2; // 100 Mhz | 41 | config.rcc.apb4_pre = APBPrescaler::DIV2; // 100 Mhz |
| 42 | config.rcc.voltage_scale = VoltageScale::Scale1; | 42 | config.rcc.voltage_scale = VoltageScale::Scale1; |
| 43 | config.rcc.adc_clock_source = AdcClockSource::PLL2_P; | 43 | config.rcc.mux.adcsel = mux::Adcsel::PLL2_P; |
| 44 | } | 44 | } |
| 45 | let p = embassy_stm32::init(config); | 45 | let p = embassy_stm32::init(config); |
| 46 | 46 | ||
diff --git a/examples/stm32h7/src/bin/dac_dma.rs b/examples/stm32h7/src/bin/dac_dma.rs index d88bd838f..feec28993 100644 --- a/examples/stm32h7/src/bin/dac_dma.rs +++ b/examples/stm32h7/src/bin/dac_dma.rs | |||
| @@ -42,7 +42,7 @@ async fn main(spawner: Spawner) { | |||
| 42 | config.rcc.apb3_pre = APBPrescaler::DIV2; // 100 Mhz | 42 | config.rcc.apb3_pre = APBPrescaler::DIV2; // 100 Mhz |
| 43 | config.rcc.apb4_pre = APBPrescaler::DIV2; // 100 Mhz | 43 | config.rcc.apb4_pre = APBPrescaler::DIV2; // 100 Mhz |
| 44 | config.rcc.voltage_scale = VoltageScale::Scale1; | 44 | config.rcc.voltage_scale = VoltageScale::Scale1; |
| 45 | config.rcc.adc_clock_source = AdcClockSource::PLL2_P; | 45 | config.rcc.mux.adcsel = mux::Adcsel::PLL2_P; |
| 46 | } | 46 | } |
| 47 | 47 | ||
| 48 | // Initialize the board and obtain a Peripherals instance | 48 | // Initialize the board and obtain a Peripherals instance |
diff --git a/examples/stm32l4/src/bin/adc.rs b/examples/stm32l4/src/bin/adc.rs index 910944673..a9f4604aa 100644 --- a/examples/stm32l4/src/bin/adc.rs +++ b/examples/stm32l4/src/bin/adc.rs | |||
| @@ -3,7 +3,7 @@ | |||
| 3 | 3 | ||
| 4 | use defmt::*; | 4 | use defmt::*; |
| 5 | use embassy_stm32::adc::{Adc, Resolution}; | 5 | use embassy_stm32::adc::{Adc, Resolution}; |
| 6 | use embassy_stm32::pac; | 6 | use embassy_stm32::Config; |
| 7 | use embassy_time::Delay; | 7 | use embassy_time::Delay; |
| 8 | use {defmt_rtt as _, panic_probe as _}; | 8 | use {defmt_rtt as _, panic_probe as _}; |
| 9 | 9 | ||
| @@ -11,12 +11,12 @@ use {defmt_rtt as _, panic_probe as _}; | |||
| 11 | fn main() -> ! { | 11 | fn main() -> ! { |
| 12 | info!("Hello World!"); | 12 | info!("Hello World!"); |
| 13 | 13 | ||
| 14 | pac::RCC.ccipr().modify(|w| { | 14 | let mut config = Config::default(); |
| 15 | w.set_adcsel(pac::rcc::vals::Adcsel::SYS); | 15 | { |
| 16 | }); | 16 | use embassy_stm32::rcc::*; |
| 17 | pac::RCC.ahb2enr().modify(|w| w.set_adcen(true)); | 17 | config.rcc.mux.adcsel = mux::Adcsel::SYS; |
| 18 | 18 | } | |
| 19 | let p = embassy_stm32::init(Default::default()); | 19 | let p = embassy_stm32::init(config); |
| 20 | 20 | ||
| 21 | let mut adc = Adc::new(p.ADC1, &mut Delay); | 21 | let mut adc = Adc::new(p.ADC1, &mut Delay); |
| 22 | //adc.enable_vref(); | 22 | //adc.enable_vref(); |
