pwm_custom.rs 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. //! Testing PWM output for custom pin combinations
  2. #![deny(unsafe_code)]
  3. #![no_main]
  4. #![no_std]
  5. use panic_halt as _;
  6. use cortex_m::asm;
  7. use stm32f1xx_hal::{pac, prelude::*, timer::Timer};
  8. use cortex_m_rt::entry;
  9. #[entry]
  10. fn main() -> ! {
  11. let p = pac::Peripherals::take().unwrap();
  12. let mut flash = p.FLASH.constrain();
  13. let mut rcc = p.RCC.constrain();
  14. let clocks = rcc.cfgr.freeze(&mut flash.acr);
  15. let mut afio = p.AFIO.constrain(&mut rcc.apb2);
  16. let gpioa = p.GPIOA.split(&mut rcc.apb2);
  17. let mut gpiob = p.GPIOB.split(&mut rcc.apb2);
  18. let (_pa15, _pb3, pb4) = afio.mapr.disable_jtag(gpioa.pa15, gpiob.pb3, gpiob.pb4);
  19. // TIM3
  20. let p0 = pb4.into_alternate_push_pull(&mut gpiob.crl);
  21. let p1 = gpiob.pb5.into_alternate_push_pull(&mut gpiob.crl);
  22. let pwm = Timer::tim3(p.TIM3, &clocks, &mut rcc.apb1).pwm((p0, p1), &mut afio.mapr, 1.khz());
  23. let max = pwm.get_max_duty();
  24. let mut pwm_channels = pwm.split();
  25. // Enable the individual channels
  26. pwm_channels.0.enable();
  27. pwm_channels.1.enable();
  28. // full
  29. pwm_channels.0.set_duty(max);
  30. pwm_channels.1.set_duty(max);
  31. asm::bkpt();
  32. // dim
  33. pwm_channels.1.set_duty(max / 4);
  34. asm::bkpt();
  35. // zero
  36. pwm_channels.0.set_duty(0);
  37. pwm_channels.1.set_duty(0);
  38. asm::bkpt();
  39. loop {}
  40. }