#![no_main]
#![no_std]
use cortex_m_rt::entry;
#[macro_use]
mod utilities;
use stm32h7xx_hal::{
adc,
delay::Delay,
pac,
prelude::*,
signature::{TS_CAL_110, TS_CAL_30},
};
use log::info;
#[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 ccdr = rcc
.sys_ck(100.MHz())
.pll2_p_ck(4.MHz()) .freeze(pwrcfg, &dp.SYSCFG);
info!("");
info!("stm32h7xx-hal example - Temperature");
info!("");
let mut delay = Delay::new(cp.SYST, ccdr.clocks);
#[cfg(not(feature = "rm0455"))]
let mut adc = adc::Adc::adc3(
dp.ADC3,
4.MHz(),
&mut delay,
ccdr.peripheral.ADC3,
&ccdr.clocks,
);
#[cfg(feature = "rm0455")]
let mut adc = adc::Adc::adc2(
dp.ADC2,
4.MHz(),
&mut delay,
ccdr.peripheral.ADC12,
&ccdr.clocks,
);
adc.set_resolution(adc::Resolution::SixteenBit);
let mut channel = adc::Temperature::new();
channel.enable(&adc);
delay.delay_us(25_u16);
let mut adc = adc.enable();
let vdda = 2.500;
loop {
let word: u32 =
adc.read(&mut channel).expect("Temperature read failed.");
let cal =
(110.0 - 30.0) / (TS_CAL_110::read() - TS_CAL_30::read()) as f32;
let word_3v3 = word as f32 * vdda / 3.3;
let temperature = cal * (word_3v3 - TS_CAL_30::read() as f32) + 30.0;
info!("ADC reading: {}, Temperature: {:.1} °C", word, temperature);
}
}