50 lines
1.6 KiB
Rust
50 lines
1.6 KiB
Rust
|
#![no_std]
|
||
|
#![no_main]
|
||
|
#![feature(type_alias_impl_trait)]
|
||
|
|
||
|
#[path = "../example_common.rs"]
|
||
|
mod example_common;
|
||
|
use defmt::panic;
|
||
|
use embassy::executor::Spawner;
|
||
|
use embassy_nrf::ppi::Ppi;
|
||
|
use embassy_nrf::saadc::{ChannelConfig, Config, Mode, Saadc, SamplerState};
|
||
|
use embassy_nrf::timer::{Frequency, Timer};
|
||
|
use embassy_nrf::{interrupt, Peripherals};
|
||
|
use example_common::*;
|
||
|
|
||
|
// Demonstrates both continuous sampling and scanning multiple channels driven by a PPI linked timer
|
||
|
|
||
|
#[embassy::main]
|
||
|
async fn main(_spawner: Spawner, mut p: Peripherals) {
|
||
|
let config = Config::default();
|
||
|
let channel_1_config = ChannelConfig::single_ended(&mut p.P0_02);
|
||
|
let channel_2_config = ChannelConfig::single_ended(&mut p.P0_03);
|
||
|
let channel_3_config = ChannelConfig::single_ended(&mut p.P0_04);
|
||
|
let mut saadc = Saadc::new(
|
||
|
p.SAADC,
|
||
|
interrupt::take!(SAADC),
|
||
|
config,
|
||
|
[channel_1_config, channel_2_config, channel_3_config],
|
||
|
);
|
||
|
|
||
|
let mut timer = Timer::new(p.TIMER0);
|
||
|
timer.set_frequency(Frequency::F1MHz);
|
||
|
timer.cc(0).write(100); // We want to sample at 10KHz
|
||
|
timer.cc(0).short_compare_clear();
|
||
|
|
||
|
let mut ppi = Ppi::new(p.PPI_CH0);
|
||
|
ppi.set_event(timer.cc(0).event_compare());
|
||
|
ppi.set_task(saadc.task_sample());
|
||
|
ppi.enable();
|
||
|
|
||
|
timer.start();
|
||
|
|
||
|
let mut bufs = [[0; 3 * 500]; 2]; // Each buffer of the double buffer has to be large enough for all channels.
|
||
|
saadc
|
||
|
.run_sampler(&mut bufs, Mode::Task, |buf| {
|
||
|
info!("sample len={}", buf.len());
|
||
|
SamplerState::Sampled
|
||
|
})
|
||
|
.await;
|
||
|
}
|