pub struct Adc<'d, T: AnyInstance> { /* private fields */ }Expand description
Analog to Digital driver.
Implementations§
Source§impl<'d, T: Instance> Adc<'d, T>
impl<'d, T: Instance> Adc<'d, T>
Sourcepub fn new(adc: Peri<'d, T>) -> Self
pub fn new(adc: Peri<'d, T>) -> Self
Initialize the ADC leaving any analog clock at reset value. For G0 and WL, this is the async clock without prescaler.
pub fn new_with_config(adc: Peri<'d, T>, config: AdcConfig) -> Self
pub fn enable_vrefint(&self) -> VrefInt
pub fn enable_temperature(&self) -> Temperature
pub fn enable_vbat(&self) -> Vbat
Source§impl<'d, T: AnyInstance> Adc<'d, T>
impl<'d, T: AnyInstance> Adc<'d, T>
Sourcepub fn blocking_read(
&mut self,
channel: &mut impl AdcChannel<T>,
sample_time: T::SampleTime,
) -> u16
pub fn blocking_read( &mut self, channel: &mut impl AdcChannel<T>, sample_time: T::SampleTime, ) -> u16
Read an ADC pin.
Sourcepub async fn read(
&mut self,
rx_dma: Peri<'_, impl RxDma<T>>,
sequence: impl ExactSizeIterator<Item = (&mut AnyAdcChannel<T>, T::SampleTime)>,
readings: &mut [u16],
)
pub async fn read( &mut self, rx_dma: Peri<'_, impl RxDma<T>>, sequence: impl ExactSizeIterator<Item = (&mut AnyAdcChannel<T>, T::SampleTime)>, readings: &mut [u16], )
Read one or multiple ADC regular channels using DMA.
sequence iterator and readings must have the same length.
Example
use embassy_stm32::adc::{Adc, AdcChannel}
let mut adc = Adc::new(p.ADC1);
let mut adc_pin0 = p.PA0.into();
let mut adc_pin1 = p.PA1.into();
let mut measurements = [0u16; 2];
adc.read(
p.DMA1_CH2.reborrow(),
[
(&mut *adc_pin0, SampleTime::CYCLES160_5),
(&mut *adc_pin1, SampleTime::CYCLES160_5),
]
.into_iter(),
&mut measurements,
)
.await;
defmt::info!("measurements: {}", measurements);Note: This is not very efficient as the ADC needs to be reconfigured for each read. Use
into_ring_buffered, into_ring_buffered_and_injected
Sourcepub fn into_ring_buffered<'a>(
self,
dma: Peri<'a, impl RxDma<T>>,
dma_buf: &'a mut [u16],
sequence: impl ExactSizeIterator<Item = (AnyAdcChannel<T>, T::SampleTime)>,
mode: RegularConversionMode,
) -> RingBufferedAdc<'a, T>
pub fn into_ring_buffered<'a>( self, dma: Peri<'a, impl RxDma<T>>, dma_buf: &'a mut [u16], sequence: impl ExactSizeIterator<Item = (AnyAdcChannel<T>, T::SampleTime)>, mode: RegularConversionMode, ) -> RingBufferedAdc<'a, T>
Configures the ADC to use a DMA ring buffer for continuous data acquisition.
Use the [read] method to retrieve measurements from the DMA ring buffer. The read buffer
should be exactly half the size of dma_buf. When using triggered mode, it is recommended
to configure dma_buf as a double buffer so that one half can be read while the other half
is being filled by the DMA, preventing data loss. The trigger period of the ADC effectively
defines the period at which the buffer should be read.
If continous conversion mode is selected, the provided dma_buf must be large enough to prevent
DMA buffer overruns. Its length should be a multiple of the number of ADC channels being measured.
For example, if 3 channels are measured and you want to store 40 samples per channel,
the buffer length should be 3 * 40 = 120.
§Parameters
dma: The DMA peripheral used to transfer ADC data into the buffer.dma_buf: The buffer where DMA stores ADC samples.regular_sequence: Sequence of channels and sample times for regular ADC conversions.regular_conversion_mode: Mode for regular conversions (continuous or triggered).
§Returns
A RingBufferedAdc<'a, T> instance configured for continuous DMA-based sampling.