pwm.rs 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. //! Testing PWM output for pre-defined pin combination: all pins for default mapping
  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. prelude::*,
  9. pac,
  10. timer::{Tim2NoRemap, 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 mut gpioa = p.GPIOA.split(&mut rcc.apb2);
  21. // let mut gpiob = p.GPIOB.split(&mut rcc.apb2);
  22. // TIM2
  23. let c1 = gpioa.pa0.into_alternate_push_pull(&mut gpioa.crl);
  24. let c2 = gpioa.pa1.into_alternate_push_pull(&mut gpioa.crl);
  25. let c3 = gpioa.pa2.into_alternate_push_pull(&mut gpioa.crl);
  26. // If you don't want to use all channels, just leave some out
  27. // let c4 = gpioa.pa3.into_alternate_push_pull(&mut gpioa.crl);
  28. let pins = (c1, c2, c3);
  29. // TIM3
  30. // let c1 = gpioa.pa6.into_alternate_push_pull(&mut gpioa.crl);
  31. // let c2 = gpioa.pa7.into_alternate_push_pull(&mut gpioa.crl);
  32. // let c3 = gpiob.pb0.into_alternate_push_pull(&mut gpiob.crl);
  33. // let c4 = gpiob.pb1.into_alternate_push_pull(&mut gpiob.crl);
  34. // TIM4 (Only available with the "medium" density feature)
  35. // let c1 = gpiob.pb6.into_alternate_push_pull(&mut gpiob.crl);
  36. // let c2 = gpiob.pb7.into_alternate_push_pull(&mut gpiob.crl);
  37. // let c3 = gpiob.pb8.into_alternate_push_pull(&mut gpiob.crh);
  38. // let c4 = gpiob.pb9.into_alternate_push_pull(&mut gpiob.crh);
  39. let mut pwm = Timer::tim2(p.TIM2, &clocks, &mut rcc.apb1)
  40. .pwm::<Tim2NoRemap, _, _, _>(pins, &mut afio.mapr, 1.khz())
  41. .2;
  42. let max = pwm.get_max_duty();
  43. pwm.enable();
  44. // full
  45. pwm.set_duty(max);
  46. asm::bkpt();
  47. // dim
  48. pwm.set_duty(max / 4);
  49. asm::bkpt();
  50. // zero
  51. pwm.set_duty(0);
  52. asm::bkpt();
  53. loop {}
  54. }