Test io bus
This commit is contained in:
@@ -22,3 +22,11 @@ lto = true # Link-time optimization
|
||||
codegen-units = 1 # Better optimization
|
||||
panic = 'abort' # Reduce binary size
|
||||
strip = false # Keep symbols for debugging
|
||||
|
||||
[profile.dev]
|
||||
debug = true # Keep debug info for better debugging
|
||||
opt-level = "s" # Optimize for size
|
||||
lto = true # Link-time optimization
|
||||
codegen-units = 1 # Better optimization
|
||||
panic = 'abort' # Reduce binary size
|
||||
strip = false # Keep symbols for debugging
|
||||
@@ -4,11 +4,22 @@
|
||||
use panic_halt as _;
|
||||
use cortex_m_rt::entry;
|
||||
use stm32f0xx_hal::{
|
||||
prelude::*,
|
||||
stm32,
|
||||
delay::Delay,
|
||||
delay::Delay, prelude::*, stm32
|
||||
};
|
||||
|
||||
struct Bus {
|
||||
latch_en: stm32f0xx_hal::gpio::gpioa::PA0<stm32f0xx_hal::gpio::Output<stm32f0xx_hal::gpio::PushPull>>,
|
||||
select_en: stm32f0xx_hal::gpio::gpiob::PB8<stm32f0xx_hal::gpio::Output<stm32f0xx_hal::gpio::OpenDrain>>,
|
||||
pb0: stm32f0xx_hal::gpio::gpiob::PB0<stm32f0xx_hal::gpio::Output<stm32f0xx_hal::gpio::PushPull>>,
|
||||
pb1: stm32f0xx_hal::gpio::gpiob::PB1<stm32f0xx_hal::gpio::Output<stm32f0xx_hal::gpio::PushPull>>,
|
||||
pb2: stm32f0xx_hal::gpio::gpiob::PB2<stm32f0xx_hal::gpio::Output<stm32f0xx_hal::gpio::PushPull>>,
|
||||
pb3: stm32f0xx_hal::gpio::gpiob::PB3<stm32f0xx_hal::gpio::Output<stm32f0xx_hal::gpio::PushPull>>,
|
||||
pb4: stm32f0xx_hal::gpio::gpiob::PB4<stm32f0xx_hal::gpio::Output<stm32f0xx_hal::gpio::PushPull>>,
|
||||
pb5: stm32f0xx_hal::gpio::gpiob::PB5<stm32f0xx_hal::gpio::Output<stm32f0xx_hal::gpio::PushPull>>,
|
||||
pb6: stm32f0xx_hal::gpio::gpiob::PB6<stm32f0xx_hal::gpio::Output<stm32f0xx_hal::gpio::PushPull>>,
|
||||
pb7: stm32f0xx_hal::gpio::gpiob::PB7<stm32f0xx_hal::gpio::Output<stm32f0xx_hal::gpio::PushPull>>,
|
||||
}
|
||||
|
||||
#[entry]
|
||||
fn main() -> ! {
|
||||
// Get device peripherals
|
||||
@@ -28,18 +39,161 @@ fn main() -> ! {
|
||||
|
||||
// Configure GPIO
|
||||
let gpioa = dp.GPIOA.split(&mut rcc);
|
||||
let gpiob = dp.GPIOB.split(&mut rcc);
|
||||
|
||||
// Configure PA5 as push-pull output (common LED pin)
|
||||
let mut led = cortex_m::interrupt::free(|cs| {
|
||||
gpioa.pa9.into_push_pull_output(cs)
|
||||
let mut bus = cortex_m::interrupt::free(|cs| {
|
||||
Bus {
|
||||
latch_en: gpioa.pa0.into_push_pull_output(cs),
|
||||
select_en: gpiob.pb8.into_open_drain_output(cs),
|
||||
pb0: gpiob.pb0.into_push_pull_output(cs),
|
||||
pb1: gpiob.pb1.into_push_pull_output(cs),
|
||||
pb2: gpiob.pb2.into_push_pull_output(cs),
|
||||
pb3: gpiob.pb3.into_push_pull_output(cs),
|
||||
pb4: gpiob.pb4.into_push_pull_output(cs),
|
||||
pb5: gpiob.pb5.into_push_pull_output(cs),
|
||||
pb6: gpiob.pb6.into_push_pull_output(cs),
|
||||
pb7: gpiob.pb7.into_push_pull_output(cs),
|
||||
}
|
||||
});
|
||||
|
||||
// Blink loop
|
||||
// Loop
|
||||
loop {
|
||||
led.set_high().ok();
|
||||
delay.delay_ms(2000u16);
|
||||
|
||||
led.set_low().ok();
|
||||
delay.delay_ms(2000u16);
|
||||
for ic in 0..=2 {
|
||||
for i in 0..256 {
|
||||
bus.output(ic, 1 << i, &mut delay);
|
||||
delay.delay_ms(100u16);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl Bus {
|
||||
fn output(&mut self, ic: u8, data: u8, delay: &mut Delay) {
|
||||
match ic {
|
||||
0 => self.select(1, delay),
|
||||
1 => self.select(0, delay),
|
||||
2 => self.select(5, delay),
|
||||
|
||||
3 => self.select(1, delay),
|
||||
10 => self.select(0, delay),
|
||||
11 => self.select(5, delay),
|
||||
|
||||
_ => self.select(2, delay),
|
||||
}
|
||||
delay.delay_ms(10u16);
|
||||
self.select_en(true);
|
||||
delay.delay_ms(10u16);
|
||||
self.write(data);
|
||||
delay.delay_ms(10u16);
|
||||
self.select_en(false);
|
||||
}
|
||||
|
||||
fn write(&mut self, data: u8) {
|
||||
self.pb0.set_state((data & 0b00000001 != 0).into()).ok();
|
||||
self.pb1.set_state((data & 0b00000010 != 0).into()).ok();
|
||||
self.pb2.set_state((data & 0b00000100 != 0).into()).ok();
|
||||
self.pb3.set_state((data & 0b00001000 != 0).into()).ok();
|
||||
self.pb4.set_state((data & 0b00010000 != 0).into()).ok();
|
||||
self.pb5.set_state((data & 0b00100000 != 0).into()).ok();
|
||||
self.pb6.set_state((data & 0b01000000 != 0).into()).ok();
|
||||
self.pb7.set_state((data & 0b10000000 != 0).into()).ok();
|
||||
}
|
||||
|
||||
fn select_en(&mut self, enable: bool) {
|
||||
self.select_en.set_state(enable.into()).ok();
|
||||
}
|
||||
|
||||
fn select(&mut self, line: u8, delay: &mut Delay) {
|
||||
self.select_en.set_low().ok();
|
||||
delay.delay_ms(10u16);
|
||||
match line {
|
||||
0 => {
|
||||
self.pb0.set_low().ok();
|
||||
self.pb1.set_low().ok();
|
||||
self.pb2.set_low().ok();
|
||||
self.pb3.set_low().ok();
|
||||
self.pb4.set_low().ok();
|
||||
self.pb5.set_low().ok();
|
||||
self.pb6.set_low().ok();
|
||||
self.pb7.set_low().ok();
|
||||
}
|
||||
1 => {
|
||||
self.pb0.set_high().ok();
|
||||
self.pb1.set_low().ok();
|
||||
self.pb2.set_low().ok();
|
||||
self.pb3.set_low().ok();
|
||||
self.pb4.set_low().ok();
|
||||
self.pb5.set_low().ok();
|
||||
self.pb6.set_low().ok();
|
||||
self.pb7.set_low().ok();
|
||||
}
|
||||
2 => {
|
||||
self.pb0.set_low().ok();
|
||||
self.pb1.set_high().ok();
|
||||
self.pb2.set_low().ok();
|
||||
self.pb3.set_low().ok();
|
||||
self.pb4.set_low().ok();
|
||||
self.pb5.set_low().ok();
|
||||
self.pb6.set_low().ok();
|
||||
self.pb7.set_low().ok();
|
||||
}
|
||||
3 => {
|
||||
self.pb0.set_high().ok();
|
||||
self.pb1.set_high().ok();
|
||||
self.pb2.set_low().ok();
|
||||
self.pb3.set_low().ok();
|
||||
self.pb4.set_low().ok();
|
||||
self.pb5.set_low().ok();
|
||||
self.pb6.set_low().ok();
|
||||
self.pb7.set_low().ok();
|
||||
}
|
||||
4 => {
|
||||
self.pb0.set_low().ok();
|
||||
self.pb1.set_low().ok();
|
||||
self.pb2.set_high().ok();
|
||||
self.pb3.set_low().ok();
|
||||
self.pb4.set_low().ok();
|
||||
self.pb5.set_low().ok();
|
||||
self.pb6.set_low().ok();
|
||||
self.pb7.set_low().ok();
|
||||
}
|
||||
5 => {
|
||||
self.pb0.set_high().ok();
|
||||
self.pb1.set_low().ok();
|
||||
self.pb2.set_high().ok();
|
||||
self.pb3.set_low().ok();
|
||||
self.pb4.set_low().ok();
|
||||
self.pb5.set_low().ok();
|
||||
self.pb6.set_low().ok();
|
||||
self.pb7.set_low().ok();
|
||||
}
|
||||
6 => {
|
||||
self.pb0.set_low().ok();
|
||||
self.pb1.set_high().ok();
|
||||
self.pb2.set_high().ok();
|
||||
self.pb3.set_low().ok();
|
||||
self.pb4.set_low().ok();
|
||||
self.pb5.set_low().ok();
|
||||
self.pb6.set_low().ok();
|
||||
self.pb7.set_low().ok();
|
||||
}
|
||||
7 => {
|
||||
self.pb0.set_high().ok();
|
||||
self.pb1.set_high().ok();
|
||||
self.pb2.set_high().ok();
|
||||
self.pb3.set_low().ok();
|
||||
self.pb4.set_low().ok();
|
||||
self.pb5.set_low().ok();
|
||||
self.pb6.set_low().ok();
|
||||
self.pb7.set_low().ok();
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
delay.delay_ms(10u16);
|
||||
self.latch_en.set_high().ok();
|
||||
delay.delay_ms(10u16);
|
||||
self.latch_en.set_low().ok();
|
||||
delay.delay_ms(10u16);
|
||||
self.select_en.set_high().ok();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user