diff options
| author | Dario Nieuwenhuis <[email protected]> | 2025-07-27 21:39:11 +0000 |
|---|---|---|
| committer | GitHub <[email protected]> | 2025-07-27 21:39:11 +0000 |
| commit | 4e4a1c0054fe1245426798166b3bf51e8a0300d3 (patch) | |
| tree | 17bcbbc7a33e7f65a81b062609b353d9974567ef /examples | |
| parent | c708cefe03363135c466a3c0e8543a95973bce7a (diff) | |
| parent | 05f1c75f8b01e36e641dca35b6d6f763b6babde5 (diff) | |
Merge pull request #4463 from leftger/feat/stm32wba-rcc-pll-support
Added support for PLL as a clock source on STM32WBA
Diffstat (limited to 'examples')
| -rw-r--r-- | examples/stm32wba/src/bin/pwm.rs | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/examples/stm32wba/src/bin/pwm.rs b/examples/stm32wba/src/bin/pwm.rs new file mode 100644 index 000000000..de690fda0 --- /dev/null +++ b/examples/stm32wba/src/bin/pwm.rs | |||
| @@ -0,0 +1,65 @@ | |||
| 1 | #![no_std] | ||
| 2 | #![no_main] | ||
| 3 | |||
| 4 | use defmt::*; | ||
| 5 | use defmt_rtt as _; // global logger | ||
| 6 | use embassy_executor::Spawner; | ||
| 7 | use embassy_stm32::gpio::OutputType; | ||
| 8 | use embassy_stm32::rcc::{ | ||
| 9 | AHB5Prescaler, AHBPrescaler, APBPrescaler, PllDiv, PllMul, PllPreDiv, PllSource, Sysclk, VoltageScale, | ||
| 10 | }; | ||
| 11 | use embassy_stm32::time::khz; | ||
| 12 | use embassy_stm32::timer::simple_pwm::{PwmPin, SimplePwm}; | ||
| 13 | use embassy_stm32::Config; | ||
| 14 | use embassy_time::Timer; | ||
| 15 | use panic_probe as _; | ||
| 16 | |||
| 17 | #[embassy_executor::main] | ||
| 18 | async fn main(_spawner: Spawner) { | ||
| 19 | info!("Hello World!"); | ||
| 20 | |||
| 21 | let mut config = Config::default(); | ||
| 22 | // Fine-tune PLL1 dividers/multipliers | ||
| 23 | config.rcc.pll1 = Some(embassy_stm32::rcc::Pll { | ||
| 24 | source: PllSource::HSI, | ||
| 25 | prediv: PllPreDiv::DIV1, // PLLM = 1 → HSI / 1 = 16 MHz | ||
| 26 | mul: PllMul::MUL30, // PLLN = 30 → 16 MHz * 30 = 480 MHz VCO | ||
| 27 | divr: Some(PllDiv::DIV5), // PLLR = 5 → 96 MHz (Sysclk) | ||
| 28 | // divq: Some(PllDiv::DIV10), // PLLQ = 10 → 48 MHz (NOT USED) | ||
| 29 | divq: None, | ||
| 30 | divp: Some(PllDiv::DIV30), // PLLP = 30 → 16 MHz (USBOTG) | ||
| 31 | frac: Some(0), // Fractional part (enabled) | ||
| 32 | }); | ||
| 33 | |||
| 34 | config.rcc.ahb_pre = AHBPrescaler::DIV1; | ||
| 35 | config.rcc.apb1_pre = APBPrescaler::DIV1; | ||
| 36 | config.rcc.apb2_pre = APBPrescaler::DIV1; | ||
| 37 | config.rcc.apb7_pre = APBPrescaler::DIV1; | ||
| 38 | config.rcc.ahb5_pre = AHB5Prescaler::DIV4; | ||
| 39 | |||
| 40 | // voltage scale for max performance | ||
| 41 | config.rcc.voltage_scale = VoltageScale::RANGE1; | ||
| 42 | // route PLL1_P into the USB‐OTG‐HS block | ||
| 43 | config.rcc.sys = Sysclk::PLL1_R; | ||
| 44 | |||
| 45 | let p = embassy_stm32::init(config); | ||
| 46 | |||
| 47 | let ch1_pin = PwmPin::new(p.PB8, OutputType::PushPull); | ||
| 48 | let mut pwm = SimplePwm::new(p.TIM1, Some(ch1_pin), None, None, None, khz(10), Default::default()); | ||
| 49 | let mut ch1 = pwm.ch1(); | ||
| 50 | ch1.enable(); | ||
| 51 | |||
| 52 | info!("PWM initialized"); | ||
| 53 | info!("PWM max duty {}", ch1.max_duty_cycle()); | ||
| 54 | |||
| 55 | loop { | ||
| 56 | ch1.set_duty_cycle_fully_off(); | ||
| 57 | Timer::after_millis(300).await; | ||
| 58 | ch1.set_duty_cycle_fraction(1, 4); | ||
| 59 | Timer::after_millis(300).await; | ||
| 60 | ch1.set_duty_cycle_fraction(1, 2); | ||
| 61 | Timer::after_millis(300).await; | ||
| 62 | ch1.set_duty_cycle(ch1.max_duty_cycle() - 1); | ||
| 63 | Timer::after_millis(300).await; | ||
| 64 | } | ||
| 65 | } | ||
