kirdy/src/device/boot.rs

68 lines
1.7 KiB
Rust

use stm32f4xx_hal::{
watchdog::IndependentWatchdog,
rcc::RccExt,
pac::{CorePeripherals, Peripherals},
time::MegaHertz
};
use fugit::ExtU32;
use log::info;
use super::{log_setup, sys_timer, usb, gpio};
use crate::laser_diode::current_sources::*;
#[cfg(not(feature = "semihosting"))]
const WATCHDOG_PERIOD: u32 = 1000;
#[cfg(feature = "semihosting")]
const WATCHDOG_PERIOD: u32 = 30000;
pub fn bootup (mut core_perif : CorePeripherals, perif : Peripherals) -> IndependentWatchdog {
log_setup::init_log();
info!("Kirdy init");
core_perif.SCB.enable_icache();
core_perif.SCB.enable_dcache(&mut core_perif.CPUID);
let clocks = perif.RCC.constrain()
.cfgr
.use_hse(MegaHertz::from_raw(8).convert())
.sysclk(MegaHertz::from_raw(168).convert())
.hclk(MegaHertz::from_raw(168).convert())
.pclk1(MegaHertz::from_raw(32).convert())
.pclk2(MegaHertz::from_raw(64).convert())
.freeze();
sys_timer::setup(core_perif.SYST, clocks);
let (
eth_pins,
usb,
current_source_phy) = gpio::setup(
clocks, perif.TIM4,
perif.GPIOA, perif.GPIOB, perif.GPIOC, perif.GPIOD, perif.GPIOE, perif.GPIOF, perif.GPIOG,
perif.SPI1, perif.SPI2, perif.SPI3,
perif.ADC1,
perif.OTG_FS_GLOBAL, perif.OTG_FS_DEVICE, perif.OTG_FS_PWRCLK,
);
usb::State::setup(usb);
let mut laser = current_source {
phy: current_source_phy,
setting: current_source_settings_construct {
output_current : 0.0
}
};
laser.setup();
laser.set_current(0.1);
let mut wd = IndependentWatchdog::new(perif.IWDG);
wd.start(WATCHDOG_PERIOD.millis());
wd.feed();
info!("Kirdy setup complete");
wd
}