#![no_main]
#![no_std]
use cortex_m::{
interrupt::{free, Mutex},
peripheral::NVIC,
};
use cortex_m_rt::entry;
use stm32_hal2::{
clocks::Clocks,
gpio::{Edge, Pin, PinMode, Port},
low_power, pac,
timer::{CountDir, OutputCompare, TimChannel, Timer, TimerInterrupt},
};
#[entry]
fn main() -> ! {
let mut cp = cortex_m::Peripherals::take().unwrap();
let mut dp = pac::Peripherals::take().unwrap();
let clock_cfg = Clocks::default();
clock_cfg.setup(&mut dp.RCC, &mut dp.FLASH).unwrap();
let _pwm_pin = Pin::new(Port::A, 0, PinMode::Alt(1));
let mut pwm_timer = Timer::new_tim2(dp.TIM2, 2_400., &clock_cfg);
pwm_timer.enable_pwm_output(TimChannel::C1, OutputCompare::Pwm1, CountDir::Up, 0.5);
pwm_timer.set_auto_reload_preload(true);
pwm_timer.enable();
pwm_timer.set_duty(TimChannel::C1, 100);
let mut countdown_timer = Timer::new_tim3(dp.TIM3, 0.5, &clock_cfg);
countdown_timer.enable_interrupt(TimerInterrupt::Update); countdown_timer.enable();
pwm_timer.set_freq(1_000.);
pwm_timer.set_auto_reload(100);
pwm_timer.set_prescaler(100);
unsafe {
NVIC::unmask(pac::Interrupt::TIM3);
}
loop {
low_power::sleep_now(&mut SCB);
}
}
#[interrupt]
fn TIM3() {
free(|cs| {
unsafe { (*pac::TIM3::ptr()).sr.modify(|_, w| w.uif().set_bit()) }
defmt::info!("Countdown expired");
});
}