2025-06-29 20:39:35 +02:00

81 lines
3.3 KiB
Rust
Executable File

use hal::prelude::*;
use panic_halt as _;
use stm32f0xx_hal as hal;
pub struct Bus {
latch_en: hal::gpio::gpioa::PA0<hal::gpio::Output<hal::gpio::PushPull>>,
select_en: hal::gpio::gpiob::PB8<hal::gpio::Output<hal::gpio::OpenDrain>>,
pb0: hal::gpio::gpiob::PB0<hal::gpio::Output<hal::gpio::PushPull>>,
pb1: hal::gpio::gpiob::PB1<hal::gpio::Output<hal::gpio::PushPull>>,
pb2: hal::gpio::gpiob::PB2<hal::gpio::Output<hal::gpio::PushPull>>,
pb3: hal::gpio::gpiob::PB3<hal::gpio::Output<hal::gpio::PushPull>>,
pb4: hal::gpio::gpiob::PB4<hal::gpio::Output<hal::gpio::PushPull>>,
pb5: hal::gpio::gpiob::PB5<hal::gpio::Output<hal::gpio::PushPull>>,
pb6: hal::gpio::gpiob::PB6<hal::gpio::Output<hal::gpio::PushPull>>,
pb7: hal::gpio::gpiob::PB7<hal::gpio::Output<hal::gpio::PushPull>>,
}
impl Bus {
pub fn new(
latch_en: hal::gpio::gpioa::PA0<hal::gpio::Input<hal::gpio::Floating>>,
select_en: hal::gpio::gpiob::PB8<hal::gpio::Input<hal::gpio::Floating>>,
pb0: hal::gpio::gpiob::PB0<hal::gpio::Input<hal::gpio::Floating>>,
pb1: hal::gpio::gpiob::PB1<hal::gpio::Input<hal::gpio::Floating>>,
pb2: hal::gpio::gpiob::PB2<hal::gpio::Input<hal::gpio::Floating>>,
pb3: hal::gpio::gpiob::PB3<hal::gpio::Input<hal::gpio::Floating>>,
pb4: hal::gpio::gpiob::PB4<hal::gpio::Input<hal::gpio::Floating>>,
pb5: hal::gpio::gpiob::PB5<hal::gpio::Input<hal::gpio::Floating>>,
pb6: hal::gpio::gpiob::PB6<hal::gpio::Input<hal::gpio::Floating>>,
pb7: hal::gpio::gpiob::PB7<hal::gpio::Input<hal::gpio::Floating>>,
) -> Self {
cortex_m::interrupt::free(|cs| {
Self {
latch_en: latch_en.into_push_pull_output(cs),
select_en: select_en.into_open_drain_output(cs),
pb0: pb0.into_push_pull_output(cs),
pb1: pb1.into_push_pull_output(cs),
pb2: pb2.into_push_pull_output(cs),
pb3: pb3.into_push_pull_output(cs),
pb4: pb4.into_push_pull_output(cs),
pb5: pb5.into_push_pull_output(cs),
pb6: pb6.into_push_pull_output(cs),
pb7: pb7.into_push_pull_output(cs),
}
})
}
pub fn output(&mut self, ic: u8, data: u8) {
match ic {
0 | 3 => self.select(1),
1 | 10 => self.select(0),
2 | 11 => self.select(5),
_ => self.select(2),
}
self.select_en(true);
self.write(data);
self.select_en(false);
}
fn write(&mut self, data: u8) {
self.pb0.set_state((data & 0b_0000_0001 != 0).into()).ok();
self.pb1.set_state((data & 0b_0000_0010 != 0).into()).ok();
self.pb2.set_state((data & 0b_0000_0100 != 0).into()).ok();
self.pb3.set_state((data & 0b_0000_1000 != 0).into()).ok();
self.pb4.set_state((data & 0b_0001_0000 != 0).into()).ok();
self.pb5.set_state((data & 0b_0010_0000 != 0).into()).ok();
self.pb6.set_state((data & 0b_0100_0000 != 0).into()).ok();
self.pb7.set_state((data & 0b_1000_0000 != 0).into()).ok();
}
fn select_en(&mut self, enable: bool) {
self.select_en.set_state(enable.into()).ok();
}
fn select(&mut self, line: u8) {
self.write(line);
self.latch_en.set_high().ok();
self.latch_en.set_low().ok();
}
}