aboutsummaryrefslogtreecommitdiff
path: root/embassy-stm32/src/timer/qei.rs
diff options
context:
space:
mode:
Diffstat (limited to 'embassy-stm32/src/timer/qei.rs')
-rw-r--r--embassy-stm32/src/timer/qei.rs25
1 files changed, 18 insertions, 7 deletions
diff --git a/embassy-stm32/src/timer/qei.rs b/embassy-stm32/src/timer/qei.rs
index 82b5968b0..d63a2b45d 100644
--- a/embassy-stm32/src/timer/qei.rs
+++ b/embassy-stm32/src/timer/qei.rs
@@ -55,20 +55,27 @@ impl SealedQeiChannel for Ch2 {}
55/// Quadrature decoder driver. 55/// Quadrature decoder driver.
56pub struct Qei<'d, T: GeneralInstance4Channel> { 56pub struct Qei<'d, T: GeneralInstance4Channel> {
57 inner: Timer<'d, T>, 57 inner: Timer<'d, T>,
58 _ch1: Peri<'d, AnyPin>,
59 _ch2: Peri<'d, AnyPin>,
58} 60}
59 61
60impl<'d, T: GeneralInstance4Channel> Qei<'d, T> { 62impl<'d, T: GeneralInstance4Channel> Qei<'d, T> {
61 /// Create a new quadrature decoder driver. 63 /// Create a new quadrature decoder driver.
62 #[allow(unused)] 64 #[allow(unused)]
63 pub fn new<#[cfg(afio)] A>( 65 pub fn new<CH1: QeiChannel, CH2: QeiChannel, #[cfg(afio)] A>(
64 tim: Peri<'d, T>, 66 tim: Peri<'d, T>,
65 ch1: if_afio!(QeiPin<'d, T, Ch1, A>), 67 ch1: Peri<'d, if_afio!(impl TimerPin<T, CH1, A>)>,
66 ch2: if_afio!(QeiPin<'d, T, Ch2, A>), 68 ch2: Peri<'d, if_afio!(impl TimerPin<T, CH2, A>)>,
67 ) -> Self { 69 ) -> Self {
68 Self::new_inner(tim) 70 // Configure the pins to be used for the QEI peripheral.
69 } 71 critical_section::with(|_| {
72 ch1.set_low();
73 set_as_af!(ch1, AfType::input(Pull::None));
74
75 ch2.set_low();
76 set_as_af!(ch2, AfType::input(Pull::None));
77 });
70 78
71 fn new_inner(tim: Peri<'d, T>) -> Self {
72 let inner = Timer::new(tim); 79 let inner = Timer::new(tim);
73 let r = inner.regs_gp16(); 80 let r = inner.regs_gp16();
74 81
@@ -94,7 +101,11 @@ impl<'d, T: GeneralInstance4Channel> Qei<'d, T> {
94 r.arr().modify(|w| w.set_arr(u16::MAX)); 101 r.arr().modify(|w| w.set_arr(u16::MAX));
95 r.cr1().modify(|w| w.set_cen(true)); 102 r.cr1().modify(|w| w.set_cen(true));
96 103
97 Self { inner } 104 Self {
105 inner,
106 _ch1: ch1.into(),
107 _ch2: ch2.into(),
108 }
98 } 109 }
99 110
100 /// Get direction. 111 /// Get direction.