hal-mik32 0.2.1

Rust hardware abstraction layer for MIK32 microcontrollers.
Documentation
#![no_std]
#![no_main]

use core::panic::PanicInfo;

use hal_mik32::rcc::RCC;
use hal_mik32::tsens::{ClockSource, Config, TSENS};
use mik32_pac::Peripherals;

const SENSOR_CLOCK_HZ: u32 = 40_000;
const STARTUP_TIMEOUT: u32 = 100_000;
const SAMPLE_DELAY_SPINS: u32 = 25_000;

#[unsafe(no_mangle)]
pub extern "C" fn main() -> ! {
    let peripherals = Peripherals::take().unwrap();

    let rcc_config = RCC::default();
    RCC::init(&rcc_config);

    let sensor_config = Config::default()
        .clock_from_source(ClockSource::HSI32M)
        .with_frequency(SENSOR_CLOCK_HZ);

    let mut sensor = TSENS::new(peripherals.tsens, &rcc_config.clocks, sensor_config).unwrap();

    let mut current_temperature_c = sensor.single_measurement(Some(STARTUP_TIMEOUT)).unwrap();
    let mut min_temperature_c = current_temperature_c;
    let mut max_temperature_c = current_temperature_c;

    sensor.start_continuous();

    loop {
        current_temperature_c = sensor.get_temperature();

        if current_temperature_c < min_temperature_c {
            min_temperature_c = current_temperature_c;
        }

        if current_temperature_c > max_temperature_c {
            max_temperature_c = current_temperature_c;
        }

        let _temperature_snapshot = (current_temperature_c, min_temperature_c, max_temperature_c);

        delay(SAMPLE_DELAY_SPINS);
    }
}

#[inline(always)]
fn delay(spins: u32) {
    for _ in 0..spins {
        core::hint::spin_loop();
    }
}

#[panic_handler]
fn panic(_info: &PanicInfo) -> ! {
    loop {
        core::hint::spin_loop();
    }
}

#[unsafe(no_mangle)]
#[inline(never)]
pub extern "C" fn trap_handler() {
    loop {
        core::hint::spin_loop();
    }
}