diff --git a/src/device/boot.rs b/src/device/boot.rs index 0a1c26f..92e1635 100644 --- a/src/device/boot.rs +++ b/src/device/boot.rs @@ -1,29 +1,29 @@ -use stm32f4xx_hal::{ - watchdog::IndependentWatchdog, - rcc::RccExt, - pac::{CorePeripherals, Peripherals}, - time::MegaHertz -}; +use super::{gpio, log_setup, sys_timer, usb}; +use crate::laser_diode::current_sources::*; use fugit::ExtU32; use log::info; -use super::{log_setup, sys_timer, usb, gpio}; -use crate::laser_diode::current_sources::*; +use stm32f4xx_hal::{ + pac::{CorePeripherals, Peripherals}, + rcc::RccExt, + time::MegaHertz, + watchdog::IndependentWatchdog, +}; #[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 { - +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() + let clocks = perif + .RCC + .constrain() .cfgr .use_hse(MegaHertz::from_raw(8).convert()) .sysclk(MegaHertz::from_raw(168).convert()) @@ -34,29 +34,31 @@ pub fn bootup (mut core_perif : CorePeripherals, perif : Peripherals) -> Indepen 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, + let (eth_pins, usb, current_source_phy) = gpio::setup( + clocks, + perif.GPIOA, + perif.GPIOB, + perif.GPIOC, + perif.GPIOD, + perif.GPIOG, + perif.SPI2, + perif.OTG_FS_GLOBAL, + perif.OTG_FS_DEVICE, + perif.OTG_FS_PWRCLK, ); usb::State::setup(usb); - let mut laser = current_source { + let mut laser = CurrentSource { phy: current_source_phy, - setting: current_source_settings_construct { - output_current : 0.0 - } + setting: CurrentSourceSettingsConstruct { + 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(); @@ -64,5 +66,4 @@ pub fn bootup (mut core_perif : CorePeripherals, perif : Peripherals) -> Indepen info!("Kirdy setup complete"); wd - -} \ No newline at end of file +} diff --git a/src/device/gpio.rs b/src/device/gpio.rs index d08f1c2..4fb560f 100644 --- a/src/device/gpio.rs +++ b/src/device/gpio.rs @@ -1,70 +1,42 @@ -use stm32f4xx_hal::{ - adc::Adc, - gpio::{ - AF5, Alternate, Analog, Input, - gpioa::*, - gpiob::*, - gpioc::*, - gpiod::*, - gpioe::*, - gpiof::*, - gpiog::*, - GpioExt, - Output, PushPull, - }, - hal::{self, blocking::spi::Transfer, digital::v2::OutputPin}, - otg_fs::USB, - rcc::Clocks, - spi, - spi::{Spi, NoMiso, TransferModeNormal}, - pac::{ - ADC1, - GPIOA, GPIOB, GPIOC, GPIOD, GPIOE, GPIOF, GPIOG, - OTG_FS_GLOBAL, OTG_FS_DEVICE, OTG_FS_PWRCLK, - SPI1, SPI2, SPI3, - TIM4 - }, - timer::Timer, - time::U32Ext, - time::MegaHertz -}; +use crate::laser_diode::current_sources::*; use fugit::RateExtU32; use stm32_eth::EthPins; -use crate::laser_diode::current_sources::*; +use stm32f4xx_hal::{ + gpio::{gpioa::*, gpiob::*, gpioc::*, gpiog::*, GpioExt, Input}, + otg_fs::USB, + pac::{GPIOA, GPIOB, GPIOC, GPIOD, GPIOG, OTG_FS_DEVICE, OTG_FS_GLOBAL, OTG_FS_PWRCLK, SPI2}, + rcc::Clocks, + spi, + spi::{NoMiso, Spi}, +}; -pub type EthernetPins = EthPins< - PA1, - PA7, - PB11, - PG13, - PB13, - PC4, - PC5, ->; +pub type EthernetPins = + EthPins, PA7, PB11, PG13, PB13, PC4, PC5>; pub fn setup( clocks: Clocks, - tim4: TIM4, - gpioa: GPIOA, gpiob: GPIOB, gpioc: GPIOC, gpiod: GPIOD, gpioe: GPIOE, gpiof: GPIOF, gpiog: GPIOG, - spi1: SPI1, spi2: SPI2, spi3: SPI3, - adc1: ADC1, - otg_fs_global: OTG_FS_GLOBAL, otg_fs_device: OTG_FS_DEVICE, otg_fs_pwrclk: OTG_FS_PWRCLK, -) -> ( - EthernetPins, - USB, - current_source_phy_construct, - // photo_diode_phy, - // thermostat_phy + gpioa: GPIOA, + gpiob: GPIOB, + gpioc: GPIOC, + gpiod: GPIOD, + gpiog: GPIOG, + spi2: SPI2, + otg_fs_global: OTG_FS_GLOBAL, + otg_fs_device: OTG_FS_DEVICE, + otg_fs_pwrclk: OTG_FS_PWRCLK, +) -> ( + EthernetPins, + USB, + CurrentSourcePhyConstruct, + // photo_diode_phy, + // thermostat_phy ) { - let gpioa = gpioa.split(); let gpiob = gpiob.split(); let gpioc = gpioc.split(); let gpiod = gpiod.split(); - let gpioe = gpioe.split(); - let gpiof = gpiof.split(); - let gpiog = gpiog.split(); - + let gpiog = gpiog.split(); + let usb = USB { usb_global: otg_fs_global, usb_device: otg_fs_device, @@ -75,32 +47,35 @@ pub fn setup( }; let eth_pins = EthPins { - ref_clk: gpioa.pa1, - crs: gpioa.pa7, + ref_clk: gpioa.pa1, + crs: gpioa.pa7, tx_en: gpiob.pb11, - tx_d0: gpiog.pg13, + tx_d0: gpiog.pg13, tx_d1: gpiob.pb13, - rx_d0: gpioc.pc4, + rx_d0: gpioc.pc4, rx_d1: gpioc.pc5, }; - - let current_source_phy = current_source_phy_construct { + + let current_source_phy = CurrentSourcePhyConstruct { max5719_spi: Spi::new( - spi2, - (gpiob.pb10.into_alternate(), NoMiso {}, gpiob.pb15.into_alternate()), + spi2, + ( + gpiob.pb10.into_alternate(), + NoMiso {}, + gpiob.pb15.into_alternate(), + ), spi::Mode { polarity: spi::Polarity::IdleLow, phase: spi::Phase::CaptureOnFirstTransition, - }, - 10_u32.MHz(), - &clocks), - max5719_load: gpiob.pb14.into_push_pull_output(), - max5719_cs: gpiod.pd8.into_push_pull_output(), + }, + 10_u32.MHz(), + &clocks, + ), + max5719_load: gpiob.pb14.into_push_pull_output(), + max5719_cs: gpiod.pd8.into_push_pull_output(), current_source_ldo_en: gpiod.pd9.into_push_pull_output(), - current_source_short: gpioa.pa4.into_push_pull_output() + current_source_short: gpioa.pa4.into_push_pull_output(), }; - + (eth_pins, usb, current_source_phy) - } - diff --git a/src/device/log_setup.rs b/src/device/log_setup.rs index f4c2d92..3190506 100644 --- a/src/device/log_setup.rs +++ b/src/device/log_setup.rs @@ -10,17 +10,15 @@ pub fn init_log() { #[cfg(feature = "semihosting")] pub fn init_log() { + use cortex_m_log::log::{init, Logger}; + use cortex_m_log::printer::semihosting::{hio::HStdout, InterruptOk}; use log::LevelFilter; - use cortex_m_log::log::{Logger, init}; - use cortex_m_log::printer::semihosting::{InterruptOk, hio::HStdout}; static mut LOGGER: Option>> = None; let logger = Logger { inner: InterruptOk::<_>::stdout().expect("semihosting stdout"), level: LevelFilter::Info, }; - let logger = unsafe { - LOGGER.get_or_insert(logger) - }; + let logger = unsafe { LOGGER.get_or_insert(logger) }; init(logger).expect("set logger"); } diff --git a/src/device/mod.rs b/src/device/mod.rs index c912372..1274e24 100644 --- a/src/device/mod.rs +++ b/src/device/mod.rs @@ -1,5 +1,5 @@ -pub mod log_setup; -pub mod usb; -pub mod sys_timer; pub mod boot; -pub mod gpio; \ No newline at end of file +pub mod gpio; +pub mod log_setup; +pub mod sys_timer; +pub mod usb; diff --git a/src/device/sys_timer.rs b/src/device/sys_timer.rs index 4bd607f..04abbf3 100644 --- a/src/device/sys_timer.rs +++ b/src/device/sys_timer.rs @@ -3,10 +3,7 @@ use core::ops::Deref; use cortex_m::interrupt::Mutex; use cortex_m::peripheral::syst::SystClkSource; use cortex_m_rt::exception; -use stm32f4xx_hal::{ - rcc::Clocks, - pac::SYST, -}; +use stm32f4xx_hal::{pac::SYST, rcc::Clocks}; /// Rate in Hz const TIMER_RATE: u32 = 1000; @@ -16,7 +13,7 @@ const TIMER_DELTA: u32 = 1000 / TIMER_RATE; static TIMER_MS: Mutex> = Mutex::new(RefCell::new(0)); /// Setup SysTick exception -pub fn setup(mut syst: SYST, clocks: Clocks) { +pub fn setup(mut syst: SYST, clocks: Clocks) { syst.set_clock_source(SystClkSource::Core); syst.set_reload(clocks.hclk().to_Hz() / TIMER_RATE - 1); syst.enable_counter(); @@ -27,18 +24,13 @@ pub fn setup(mut syst: SYST, clocks: Clocks) { #[exception] fn SysTick() { cortex_m::interrupt::free(|cs| { - *TIMER_MS.borrow(cs) - .borrow_mut() += TIMER_DELTA; + *TIMER_MS.borrow(cs).borrow_mut() += TIMER_DELTA; }); } /// Obtain current time in milliseconds pub fn now() -> u32 { - cortex_m::interrupt::free(|cs| { - *TIMER_MS.borrow(cs) - .borrow() - .deref() - }) + cortex_m::interrupt::free(|cs| *TIMER_MS.borrow(cs).borrow().deref()) } /// block for `amount` milliseconds diff --git a/src/device/usb.rs b/src/device/usb.rs index 11f18f8..2d27f02 100644 --- a/src/device/usb.rs +++ b/src/device/usb.rs @@ -1,15 +1,18 @@ -use core::{fmt::{self, Write}, mem::MaybeUninit}; +use core::{ + fmt::{self, Write}, + mem::MaybeUninit, +}; use cortex_m::interrupt::free; +use log::{Log, Metadata, Record}; use stm32f4xx_hal::{ - otg_fs::{USB, UsbBus as Bus}, + otg_fs::{UsbBus as Bus, USB}, pac::{interrupt, Interrupt, NVIC}, }; use usb_device::{ - class_prelude::{UsbBusAllocator}, + class_prelude::UsbBusAllocator, prelude::{UsbDevice, UsbDeviceBuilder, UsbVidPid}, }; use usbd_serial::SerialPort; -use log::{Record, Log, Metadata}; static mut EP_MEMORY: [u32; 1024] = [0; 1024]; @@ -36,8 +39,8 @@ impl State { .device_class(usbd_serial::USB_CLASS_CDC) .build(); - free(|_| { - unsafe { STATE = Some(State { serial, dev }); } + free(|_| unsafe { + STATE = Some(State { serial, dev }); }); unsafe { @@ -94,8 +97,7 @@ impl Write for SerialOutput { fn write_str(&mut self, s: &str) -> core::result::Result<(), core::fmt::Error> { if let Some(ref mut state) = State::get() { for chunk in s.as_bytes().chunks(16) { - free(|_| state.serial.write(chunk)) - .map_err(|_| fmt::Error)?; + free(|_| state.serial.write(chunk)).map_err(|_| fmt::Error)?; } } Ok(()) diff --git a/src/laser_diode/current_sources.rs b/src/laser_diode/current_sources.rs index 12a2117..5db5fc4 100644 --- a/src/laser_diode/current_sources.rs +++ b/src/laser_diode/current_sources.rs @@ -1,77 +1,71 @@ use stm32f4xx_hal::{ - adc::Adc, - gpio::{ - AF5, Alternate, - gpioa::*, - gpiob::*, - gpioe::*, - gpiod::*, - Output, - PushPull, PD9, - }, - hal::{self, blocking::spi::Write, digital::v2::OutputPin}, - spi::{Spi, NoMiso, TransferModeNormal}, + gpio::{gpioa::*, gpiob::*, gpiod::*, Alternate, Output, PushPull, PD9}, + hal::{blocking::spi::Write, digital::v2::OutputPin}, pac::SPI2, + spi::{NoMiso, Spi, TransferModeNormal}, }; use crate::device::sys_timer::sleep; -pub trait current_source_phy { - type current_source_ldo_en: OutputPin; - type current_source_short: OutputPin; - type max5719_load: OutputPin; - type max5719_cs: OutputPin; - type max5719_spi: Write; +pub trait CurrentSourcePhy { + type CurrentSourceLdoEn: OutputPin; + type CurrentSourceShort: OutputPin; + type Max5719Load: OutputPin; + type Max5719Cs: OutputPin; + type Max5719Spi: Write; } -pub struct current_source_phy_construct { - pub max5719_spi: C::max5719_spi, - pub max5719_load: C::max5719_load, - pub max5719_cs: C::max5719_cs, - pub current_source_ldo_en: C::current_source_ldo_en, - pub current_source_short: C::current_source_short, +pub struct CurrentSourcePhyConstruct { + pub max5719_spi: C::Max5719Spi, + pub max5719_load: C::Max5719Load, + pub max5719_cs: C::Max5719Cs, + pub current_source_ldo_en: C::CurrentSourceLdoEn, + pub current_source_short: C::CurrentSourceShort, } -pub struct current_source_settings_construct { - pub output_current: f32 +pub struct CurrentSourceSettingsConstruct { + pub output_current: f32, } -pub struct current_source { - pub phy : current_source_phy_construct, - pub setting: current_source_settings_construct +pub struct CurrentSource { + pub phy: CurrentSourcePhyConstruct, + pub setting: CurrentSourceSettingsConstruct, } -pub struct current_source_phy_ch0; +pub struct CurrentSourcePhyCh0; -impl current_source_phy for current_source_phy_ch0 { - type current_source_ldo_en = PD9>; - type current_source_short = PA4>; - type max5719_load = PB14>; - type max5719_cs = PD8>; - type max5719_spi = Spi>, NoMiso, PB15>), TransferModeNormal>; +impl CurrentSourcePhy for CurrentSourcePhyCh0 { + type CurrentSourceLdoEn = PD9>; + type CurrentSourceShort = PA4>; + type Max5719Load = PB14>; + type Max5719Cs = PD8>; + type Max5719Spi = + Spi>, NoMiso, PB15>), TransferModeNormal>; } -impl current_source { - +impl CurrentSource { pub fn setup(&mut self) { - self.phy.max5719_load.set_high(); - self.phy.max5719_cs.set_high(); - self.phy.current_source_ldo_en.set_high(); - sleep(50_u32); - self.phy.current_source_short.set_high(); - sleep(50_u32); + let _ = self.phy.max5719_load.set_high(); + let _ = self.phy.max5719_cs.set_high(); + let _ = self.phy.current_source_ldo_en.set_high(); + sleep(10_u32); + let _ = self.phy.current_source_short.set_high(); + sleep(10_u32); } - pub fn set_current(&mut self, current: f32) { - self.phy.max5719_load.set_high(); - self.phy.max5719_cs.set_low(); - let v_dac = current * 10.0 / 0.75; - let word = (((v_dac / 4.096) * 1048576.0) as u32) << 4; + pub fn set_current( + &mut self, + current: f32, + ) -> Result<(), <::Max5719Spi as Write>::Error> { + let _ = self.phy.max5719_load.set_high(); + let _ = self.phy.max5719_cs.set_low(); + self.setting.output_current = current * 10.0 / 0.75; + let word = (((self.setting.output_current / 4.096) * 1048576.0) as u32) << 4; let mut buf = [ ((word >> 16) & 0xFF) as u8, ((word >> 8) & 0xFF) as u8, ((word >> 0) & 0xFF) as u8, ]; - self.phy.max5719_spi.write(&mut buf); - self.phy.max5719_cs.set_high(); - self.phy.max5719_load.set_low(); + self.phy.max5719_spi.write(&mut buf)?; + let _ = self.phy.max5719_cs.set_high(); + let _ = self.phy.max5719_load.set_low(); + Ok(()) } - } diff --git a/src/main.rs b/src/main.rs index 0114cc2..f81ea30 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,32 +1,25 @@ #![no_main] #![no_std] -use panic_halt as _; use cortex_m_rt::entry; -use stm32f4xx_hal::{ - pac::{CorePeripherals, Peripherals} -}; use log::info; +use panic_halt as _; +use stm32f4xx_hal::pac::{CorePeripherals, Peripherals}; mod device; mod laser_diode; -use device::{ - boot::bootup, - sys_timer -}; +use device::{boot::bootup, sys_timer}; #[entry] fn main() -> ! { - - let mut core_perif = CorePeripherals::take().unwrap(); + let core_perif = CorePeripherals::take().unwrap(); let perif = Peripherals::take().unwrap(); - let (mut wd) = bootup(core_perif, perif); + let mut wd = bootup(core_perif, perif); loop { wd.feed(); info!("looping"); sys_timer::sleep(10); } - -} \ No newline at end of file +}