pwm_custom.rs 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  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::{
  8. pac,
  9. prelude::*,
  10. timer::Timer,
  11. };
  12. use cortex_m_rt::entry;
  13. #[entry]
  14. fn main() -> ! {
  15. let p = pac::Peripherals::take().unwrap();
  16. let mut flash = p.FLASH.constrain();
  17. let mut rcc = p.RCC.constrain();
  18. let clocks = rcc.cfgr.freeze(&mut flash.acr);
  19. let mut afio = p.AFIO.constrain(&mut rcc.apb2);
  20. let gpioa = p.GPIOA.split(&mut rcc.apb2);
  21. let mut gpiob = p.GPIOB.split(&mut rcc.apb2);
  22. let (_pa15, _pb3, pb4) = afio.mapr.disable_jtag(gpioa.pa15, gpiob.pb3, gpiob.pb4);
  23. // TIM3
  24. let p0 = pb4.into_alternate_push_pull(&mut gpiob.crl);
  25. let p1 = gpiob.pb5.into_alternate_push_pull(&mut gpiob.crl);
  26. let pwm = Timer::tim3(p.TIM3, &clocks, &mut rcc.apb1)
  27. .pwm((p0, p1), &mut afio.mapr, 1.khz());
  28. let max = pwm.get_max_duty();
  29. let mut pwm_channels = pwm.split();
  30. // Enable the individual channels
  31. pwm_channels.0.enable();
  32. pwm_channels.1.enable();
  33. // full
  34. pwm_channels.0.set_duty(max);
  35. pwm_channels.1.set_duty(max);
  36. asm::bkpt();
  37. // dim
  38. pwm_channels.1.set_duty(max / 4);
  39. asm::bkpt();
  40. // zero
  41. pwm_channels.0.set_duty(0);
  42. pwm_channels.1.set_duty(0);
  43. asm::bkpt();
  44. loop {}
  45. }