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