aboutsummaryrefslogtreecommitdiff
path: root/embassy-stm32/src/adc/ringbuffered.rs
diff options
context:
space:
mode:
Diffstat (limited to 'embassy-stm32/src/adc/ringbuffered.rs')
-rw-r--r--embassy-stm32/src/adc/ringbuffered.rs48
1 files changed, 24 insertions, 24 deletions
diff --git a/embassy-stm32/src/adc/ringbuffered.rs b/embassy-stm32/src/adc/ringbuffered.rs
index 5437866d3..242a1a89c 100644
--- a/embassy-stm32/src/adc/ringbuffered.rs
+++ b/embassy-stm32/src/adc/ringbuffered.rs
@@ -4,7 +4,7 @@ use core::sync::atomic::{Ordering, compiler_fence};
4#[allow(unused_imports)] 4#[allow(unused_imports)]
5use embassy_hal_internal::Peri; 5use embassy_hal_internal::Peri;
6 6
7use crate::adc::AnyInstance; 7use super::AdcRegs;
8#[allow(unused_imports)] 8#[allow(unused_imports)]
9use crate::adc::{Instance, RxDma}; 9use crate::adc::{Instance, RxDma};
10#[allow(unused_imports)] 10#[allow(unused_imports)]
@@ -19,7 +19,7 @@ pub struct RingBufferedAdc<'d, T: Instance> {
19 ring_buf: ReadableRingBuffer<'d, u16>, 19 ring_buf: ReadableRingBuffer<'d, u16>,
20} 20}
21 21
22impl<'d, T: Instance + AnyInstance> RingBufferedAdc<'d, T> { 22impl<'d, T: Instance> RingBufferedAdc<'d, T> {
23 pub(crate) fn new(dma: Peri<'d, impl RxDma<T>>, dma_buf: &'d mut [u16]) -> Self { 23 pub(crate) fn new(dma: Peri<'d, impl RxDma<T>>, dma_buf: &'d mut [u16]) -> Self {
24 //dma side setup 24 //dma side setup
25 let opts = TransferOptions { 25 let opts = TransferOptions {
@@ -31,8 +31,7 @@ impl<'d, T: Instance + AnyInstance> RingBufferedAdc<'d, T> {
31 // Safety: we forget the struct before this function returns. 31 // Safety: we forget the struct before this function returns.
32 let request = dma.request(); 32 let request = dma.request();
33 33
34 let ring_buf = 34 let ring_buf = unsafe { ReadableRingBuffer::new(dma, request, T::regs().data(), dma_buf, opts) };
35 unsafe { ReadableRingBuffer::new(dma, request, T::regs().dr().as_ptr() as *mut u16, dma_buf, opts) };
36 35
37 Self { 36 Self {
38 _phantom: PhantomData, 37 _phantom: PhantomData,
@@ -45,7 +44,7 @@ impl<'d, T: Instance + AnyInstance> RingBufferedAdc<'d, T> {
45 compiler_fence(Ordering::SeqCst); 44 compiler_fence(Ordering::SeqCst);
46 self.ring_buf.start(); 45 self.ring_buf.start();
47 46
48 T::start(); 47 T::regs().start();
49 } 48 }
50 49
51 pub fn stop(&mut self) { 50 pub fn stop(&mut self) {
@@ -117,15 +116,15 @@ impl<'d, T: Instance + AnyInstance> RingBufferedAdc<'d, T> {
117 self.start(); 116 self.start();
118 } 117 }
119 118
120 #[cfg(adc_v2)] 119 // #[cfg(adc_v2)]
121 { 120 // {
122 // Clear overrun flag if set. 121 // // Clear overrun flag if set.
123 if T::regs().sr().read().ovr() { 122 // if T::regs().sr().read().ovr() {
124 self.stop(); 123 // self.stop();
125 124 //
126 return Err(OverrunError); 125 // return Err(OverrunError);
127 } 126 // }
128 } 127 // }
129 128
130 self.ring_buf.read_exact(measurements).await.map_err(|_| OverrunError) 129 self.ring_buf.read_exact(measurements).await.map_err(|_| OverrunError)
131 } 130 }
@@ -143,15 +142,16 @@ impl<'d, T: Instance + AnyInstance> RingBufferedAdc<'d, T> {
143 self.start(); 142 self.start();
144 } 143 }
145 144
146 #[cfg(adc_v2)] 145 // #[cfg(adc_v2)]
147 { 146 // {
148 // Clear overrun flag if set. 147 // // Clear overrun flag if set.
149 if T::regs().sr().read().ovr() { 148 // if T::regs().sr().read().ovr() {
150 self.stop(); 149 // self.stop();
150 //
151 // return Err(OverrunError);
152 // }
153 // }
151 154
152 return Err(OverrunError);
153 }
154 }
155 loop { 155 loop {
156 match self.ring_buf.read(buf) { 156 match self.ring_buf.read(buf) {
157 Ok((0, _)) => {} 157 Ok((0, _)) => {}
@@ -168,9 +168,9 @@ impl<'d, T: Instance + AnyInstance> RingBufferedAdc<'d, T> {
168 } 168 }
169} 169}
170 170
171impl<T: Instance + AnyInstance> Drop for RingBufferedAdc<'_, T> { 171impl<T: Instance> Drop for RingBufferedAdc<'_, T> {
172 fn drop(&mut self) { 172 fn drop(&mut self) {
173 T::stop(); 173 T::regs().stop();
174 174
175 compiler_fence(Ordering::SeqCst); 175 compiler_fence(Ordering::SeqCst);
176 176