#![no_main]
#![no_std]
use log::info;
use nb::block;
use cortex_m_rt::entry;
use stm32h7xx_hal::{adc, delay::Delay, pac, prelude::*, rcc::rec::AdcClkSel};
#[macro_use]
mod utilities;
#[entry]
fn main() -> ! {
utilities::logger::init();
let cp = cortex_m::Peripherals::take().unwrap();
let dp = pac::Peripherals::take().unwrap();
info!("Setup PWR...");
let pwr = dp.PWR.constrain();
let pwrcfg = example_power!(pwr).freeze();
info!("Setup RCC...");
let rcc = dp.RCC.constrain();
let mut ccdr = rcc.sys_ck(100.MHz()).freeze(pwrcfg, &dp.SYSCFG);
ccdr.peripheral.kernel_adc_clk_mux(AdcClkSel::Per);
info!("");
info!("stm32h7xx-hal example - ADC");
info!("");
let mut delay = Delay::new(cp.SYST, ccdr.clocks);
let (adc1, adc2) = adc::adc12(
dp.ADC1,
dp.ADC2,
4.MHz(),
&mut delay,
ccdr.peripheral.ADC12,
&ccdr.clocks,
);
let mut adc1 = adc1.enable();
adc1.set_resolution(adc::Resolution::SixteenBit);
adc1.set_sample_time(adc::AdcSampleTime::T_387);
let mut adc2 = adc2.enable();
adc2.set_resolution(adc::Resolution::SixteenBit);
adc2.set_sample_time(adc::AdcSampleTime::T_387);
let gpioa = dp.GPIOA.split(ccdr.peripheral.GPIOA);
let mut channel1 = gpioa.pa4.into_analog(); let mut channel2 = gpioa.pa5.into_analog();
loop {
adc1.start_conversion(&mut channel1);
adc2.start_conversion(&mut channel2);
let data1 = block!(adc1.read_sample()).unwrap();
let data2 = block!(adc2.read_sample()).unwrap();
info!(
"ADC1 reading: {}, voltage for Daisy pin X: {}",
data1,
data1 as f32 * (3.3 / adc1.slope() as f32)
);
info!(
"ADC2 reading: {}, voltage for Daisy pin X: {}",
data2,
data2 as f32 * (3.3 / adc2.slope() as f32)
);
}
}