#![no_std]
#![no_main]
extern crate alloc;
use defmt::Debug2Format;
use hal::adc::{AdcChannel, AnyAdc, ChannelConfig, Config, Event, SampleCycles, TrigleSignal};
use py32f030_hal::adc::ConversionMode;
use py32f030_hal::clock::peripheral::PeripheralInterrupt;
use py32f030_hal::clock::sys_core_clock;
use py32f030_hal::{self as hal, mode::Blocking};
use {defmt_rtt as _, panic_probe as _};
#[cortex_m_rt::entry]
fn main() -> ! {
const HEAP_SIZE: usize = 128;
static mut HEAP: [u8; HEAP_SIZE] = [0; HEAP_SIZE];
#[global_allocator]
static ALLOCATOR: alloc_cortex_m::CortexMHeap = alloc_cortex_m::CortexMHeap::empty();
unsafe {
ALLOCATOR.init(
&mut HEAP as *const u8 as usize,
core::mem::size_of_val(&HEAP),
)
}
let p = hal::init(Default::default());
defmt::info!("{}", sys_core_clock());
let mut adc: AnyAdc<_, Blocking> = AnyAdc::new(
p.ADC,
Config::default().sample(SampleCycles::Cycle_239_5),
ChannelConfig::default()
.over_write(false)
.wait(true) .singal(TrigleSignal::Soft)
.mode(ConversionMode::Continuous),
&[AdcChannel::Channel11, AdcChannel::Channel12],
)
.unwrap();
static mut QUEUE: [u16; 16] = [0; 16];
adc.on_interrupt(
Event::EOC.into(),
alloc::boxed::Box::new(move |adc| {
static mut CNT: usize = 0;
unsafe {
QUEUE[CNT] = adc;
CNT += 1;
if QUEUE.len() == CNT {
CNT = 0;
}
}
}),
);
adc.event_config(Event::EOC, true);
adc.id().enable_interrupt();
adc.start();
loop {
cortex_m::asm::wfi();
defmt::info!(
"adc {:?} sum: {} avrage: {}",
Debug2Format(unsafe { &QUEUE }),
unsafe { QUEUE.iter().sum::<u16>() },
unsafe { QUEUE.iter().sum::<u16>() / QUEUE.len() as u16 }
);
}
}