#![no_std]
#![no_main]
use cortex_m_rt::entry;
use defmt_rtt as _;
use panic_halt as _;
use gd32e2_hal::adc::SampTime;
use gd32e2_hal::cmp::{
Cmp, CmpConfig, InvertingInput, Polarity, Speed, Vrefint, VrefintHalf, VrefintQuarter,
VrefintThreeQuarters,
};
use gd32e2_hal::gpio::{Analog, Pin};
use gd32e2_hal::pac;
use gd32e2_hal::prelude::*;
use gd32e2_hal::rcu::{AdcPsc, AdcSel, ClockConfig, PllFreq, Rcu, SysClk};
type Pos = (Pin<'A', 1, Analog>, Pin<'A', 4, Analog>);
fn probe<INV: InvertingInput>(
rcu: &mut Rcu,
cmp: pac::Cmp,
pos: Pos,
inv: INV,
polarity: Polarity,
label: &str,
) -> (pac::Cmp, Pos) {
let config = CmpConfig::new(Speed::High).polarity(polarity);
let cmp = Cmp::new(rcu, cmp, pos, inv, config).enable();
cortex_m::asm::delay(4_800);
defmt::info!("{}: output = {}", label, cmp.output());
let (cmp, pos, _inv) = cmp.disable().release();
(cmp, pos)
}
#[entry]
fn main() -> ! {
let dp = pac::Peripherals::take().unwrap();
let mut fmc = dp.fmc.constrain();
let config = ClockConfig::default()
.sysclk(SysClk::Pll(PllFreq::Mhz48))
.adc_sel(AdcSel::Prescaled(AdcPsc::Apb2Div8));
let mut rcu = dp.rcu.constrain().freeze(&mut fmc, config);
let gpioa = dp.gpioa.split(&mut rcu);
let pa1 = gpioa.pa1.into_analog();
let pa4 = gpioa.pa4.into_analog();
let mut adc = dp.adc.constrain(&mut rcu);
let vdda = adc.read_vref();
let raw = adc.read(&pa4, SampTime::Cycles239_5);
let pa4_mv = (raw as u32 * vdda as u32) / 4095;
defmt::info!("PA4 = {} mV (VDDA = {} mV)", pa4_mv, vdda);
let cmp = dp.cmp;
let pos = (pa1, pa4);
let (cmp, pos) = probe(
&mut rcu,
cmp,
pos,
VrefintQuarter,
Polarity::NotInverted,
"300 mV",
);
let (cmp, pos) = probe(
&mut rcu,
cmp,
pos,
VrefintHalf,
Polarity::NotInverted,
"600 mV",
);
let (cmp, pos) = probe(
&mut rcu,
cmp,
pos,
VrefintThreeQuarters,
Polarity::NotInverted,
"900 mV",
);
let (cmp, pos) = probe(
&mut rcu,
cmp,
pos,
Vrefint,
Polarity::NotInverted,
"1200 mV",
);
let (cmp, pos) = probe(
&mut rcu,
cmp,
pos,
VrefintQuarter,
Polarity::Inverted,
"300 mV inverted",
);
let (cmp, pos) = probe(
&mut rcu,
cmp,
pos,
VrefintHalf,
Polarity::Inverted,
"600 mV inverted",
);
let (cmp, pos) = probe(
&mut rcu,
cmp,
pos,
VrefintThreeQuarters,
Polarity::Inverted,
"900 mV inverted",
);
let config = CmpConfig::new(Speed::High).polarity(Polarity::Inverted);
let cmp = Cmp::new(&mut rcu, cmp, pos, Vrefint, config).enable();
cortex_m::asm::delay(4_800);
defmt::info!("1200 mV inverted, left on: output = {}", cmp.output());
defmt::info!("done");
loop {
cortex_m::asm::nop();
}
}