From e31dd036febea5e8b4d469003328799f7d83f7dd Mon Sep 17 00:00:00 2001 From: Adin Ackerman Date: Tue, 2 Jan 2024 20:03:14 -0800 Subject: [PATCH 1/2] add hf timer example for g0 --- examples/stm32g0/src/bin/hf_timer.rs | 69 ++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 examples/stm32g0/src/bin/hf_timer.rs diff --git a/examples/stm32g0/src/bin/hf_timer.rs b/examples/stm32g0/src/bin/hf_timer.rs new file mode 100644 index 000000000..475568a23 --- /dev/null +++ b/examples/stm32g0/src/bin/hf_timer.rs @@ -0,0 +1,69 @@ +#![no_std] +#![no_main] + +use defmt::info; +use {defmt_rtt as _, panic_probe as _}; + +use embassy_executor::Spawner; +use embassy_stm32::{ + gpio::OutputType, + pac, + pac::rcc::vals::Tim1sel, + rcc::{ClockSrc, Config as RccConfig, PllConfig, PllSource, Pllm, Plln, Pllq, Pllr}, + time::khz, + timer::{ + complementary_pwm::{ComplementaryPwm, ComplementaryPwmPin}, + simple_pwm::PwmPin, + Channel, + }, + Config as PeripheralConfig, +}; + +#[embassy_executor::main] +async fn main(_spawner: Spawner) { + let mut rcc_config = RccConfig::default(); + rcc_config.mux = ClockSrc::PLL(PllConfig { + source: PllSource::HSI, + m: Pllm::DIV1, + n: Plln::MUL16, + r: Pllr::DIV4, // CPU clock comes from PLLR (HSI (16MHz) / 1 * 16 / 4 = 64MHz) + q: Some(Pllq::DIV2), // TIM1 or TIM15 can be sourced from PLLQ (HSI (16MHz) / 1 * 16 / 2 = 128MHz) + p: None, + }); + + let mut peripheral_config = PeripheralConfig::default(); + peripheral_config.rcc = rcc_config; + + let p = embassy_stm32::init(peripheral_config); + + // configure TIM1 mux to select PLLQ as clock source + // https://www.st.com/resource/en/reference_manual/rm0444-stm32g0x1-advanced-armbased-32bit-mcus-stmicroelectronics.pdf + // RM0444 page 210 + // RCC - Peripherals Independent Clock Control Register - bit 22 -> 1 + pac::RCC.ccipr().modify(|w| w.set_tim1sel(Tim1sel::PLL1_Q)); + + let ch1 = PwmPin::new_ch1(p.PA8, OutputType::PushPull); + let ch1n = ComplementaryPwmPin::new_ch1(p.PA7, OutputType::PushPull); + + let mut pwm = ComplementaryPwm::new( + p.TIM1, + Some(ch1), + Some(ch1n), + None, + None, + None, + None, + None, + None, + khz(512), + Default::default(), + ); + + let max = pwm.get_max_duty(); + info!("Max duty: {}", max); + + pwm.set_duty(Channel::Ch1, max / 2); + pwm.enable(Channel::Ch1); + + loop {} +} From 9b47fbeb47d30dc10e75b3c754f7e3f03ca495f5 Mon Sep 17 00:00:00 2001 From: Adin Ackerman Date: Tue, 2 Jan 2024 20:12:58 -0800 Subject: [PATCH 2/2] weird format rule --- examples/stm32g0/src/bin/hf_timer.rs | 24 +++++++++--------------- 1 file changed, 9 insertions(+), 15 deletions(-) diff --git a/examples/stm32g0/src/bin/hf_timer.rs b/examples/stm32g0/src/bin/hf_timer.rs index 475568a23..78a779e29 100644 --- a/examples/stm32g0/src/bin/hf_timer.rs +++ b/examples/stm32g0/src/bin/hf_timer.rs @@ -2,22 +2,16 @@ #![no_main] use defmt::info; -use {defmt_rtt as _, panic_probe as _}; - use embassy_executor::Spawner; -use embassy_stm32::{ - gpio::OutputType, - pac, - pac::rcc::vals::Tim1sel, - rcc::{ClockSrc, Config as RccConfig, PllConfig, PllSource, Pllm, Plln, Pllq, Pllr}, - time::khz, - timer::{ - complementary_pwm::{ComplementaryPwm, ComplementaryPwmPin}, - simple_pwm::PwmPin, - Channel, - }, - Config as PeripheralConfig, -}; +use embassy_stm32::gpio::OutputType; +use embassy_stm32::pac::rcc::vals::Tim1sel; +use embassy_stm32::rcc::{ClockSrc, Config as RccConfig, PllConfig, PllSource, Pllm, Plln, Pllq, Pllr}; +use embassy_stm32::time::khz; +use embassy_stm32::timer::complementary_pwm::{ComplementaryPwm, ComplementaryPwmPin}; +use embassy_stm32::timer::simple_pwm::PwmPin; +use embassy_stm32::timer::Channel; +use embassy_stm32::{pac, Config as PeripheralConfig}; +use {defmt_rtt as _, panic_probe as _}; #[embassy_executor::main] async fn main(_spawner: Spawner) {