From 902379cb606e7c22bc7ed6344fb47d7da6b98c3f Mon Sep 17 00:00:00 2001 From: benstrb Date: Tue, 14 Apr 2026 21:16:28 +0200 Subject: [PATCH] I hoped this would work --- Cargo.lock | 1 + Cargo.toml | 1 + src/main.rs | 145 ++++++++++++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 143 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 13251c5..a4cb8a9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -404,6 +404,7 @@ dependencies = [ "otm8009a", "panic-halt", "panic-probe", + "stm32f4", "stm32f4xx-hal", ] diff --git a/Cargo.toml b/Cargo.toml index cd87a92..90a1b4c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,6 +12,7 @@ defmt = "1.0.1" panic-probe = {version = "1.0.0", features = ["print-defmt"]} panic-halt = "1.0.0" otm8009a = "0.1.0" +stm32f4 = "0.16.0" [dependencies.stm32f4xx-hal] version = "0.23.0" diff --git a/src/main.rs b/src/main.rs index 34fe61b..5d605a0 100644 --- a/src/main.rs +++ b/src/main.rs @@ -42,12 +42,140 @@ fn main() -> ! { let core_peripherals = CorePeripherals::take().unwrap(); let hse_freq = 8.MHz(); - let mut rcc = peripherals - .RCC - .freeze(Config::hse(hse_freq).pclk2(32.MHz()).sysclk(180.MHz())); + let mut rcc = peripherals.RCC.freeze( + Config::hse(hse_freq) + .hclk(180.MHz()) + .pclk1(45.MHz()) + .pclk2(32.MHz()) + .sysclk(180.MHz()), + ); let mut delay = core_peripherals.SYST.delay(&rcc.clocks); + let fmc = peripherals.FMC; + + let gpioc = peripherals.GPIOC.split(&mut rcc); + let gpiod = peripherals.GPIOD.split(&mut rcc); + let gpioe = peripherals.GPIOE.split(&mut rcc); + let gpiof = peripherals.GPIOF.split(&mut rcc); + let gpiog = peripherals.GPIOG.split(&mut rcc); let gpioh = peripherals.GPIOH.split(&mut rcc); + let gpioi = peripherals.GPIOI.split(&mut rcc); + + let _pc0 = gpioc.pc0.into_alternate::<12>(); + + let _pd0 = gpiod.pd0.into_alternate::<12>(); + let _pd1 = gpiod.pd1.into_alternate::<12>(); + let _pd8 = gpiod.pd8.into_alternate::<12>(); + let _pd9 = gpiod.pd9.into_alternate::<12>(); + let _pd10 = gpiod.pd10.into_alternate::<12>(); + let _pd14 = gpiod.pd14.into_alternate::<12>(); + let _pd15 = gpiod.pd15.into_alternate::<12>(); + + let _pe0 = gpioe.pe0.into_alternate::<12>(); + let _pe1 = gpioe.pe1.into_alternate::<12>(); + let _pe7 = gpioe.pe7.into_alternate::<12>(); + let _pe8 = gpioe.pe8.into_alternate::<12>(); + let _pe9 = gpioe.pe9.into_alternate::<12>(); + let _pe10 = gpioe.pe10.into_alternate::<12>(); + let _pe11 = gpioe.pe11.into_alternate::<12>(); + let _pe12 = gpioe.pe12.into_alternate::<12>(); + let _pe13 = gpioe.pe13.into_alternate::<12>(); + let _pe14 = gpioe.pe14.into_alternate::<12>(); + let _pe15 = gpioe.pe15.into_alternate::<12>(); + + let _pf0 = gpiof.pf0.into_alternate::<12>(); + let _pf1 = gpiof.pf1.into_alternate::<12>(); + let _pf2 = gpiof.pf2.into_alternate::<12>(); + let _pf3 = gpiof.pf3.into_alternate::<12>(); + let _pf4 = gpiof.pf4.into_alternate::<12>(); + let _pf5 = gpiof.pf5.into_alternate::<12>(); + let _pf11 = gpiof.pf11.into_alternate::<12>(); + let _pf12 = gpiof.pf12.into_alternate::<12>(); + let _pf13 = gpiof.pf13.into_alternate::<12>(); + let _pf14 = gpiof.pf14.into_alternate::<12>(); + let _pf15 = gpiof.pf15.into_alternate::<12>(); + + let _pg0 = gpiog.pg0.into_alternate::<12>(); + let _pg1 = gpiog.pg1.into_alternate::<12>(); + let _pg4 = gpiog.pg4.into_alternate::<12>(); + let _pg5 = gpiog.pg5.into_alternate::<12>(); + let _pg8 = gpiog.pg8.into_alternate::<12>(); + let _pg15 = gpiog.pg15.into_alternate::<12>(); + + let _ph2 = gpioh.ph2.into_alternate::<12>(); + let _ph3 = gpioh.ph3.into_alternate::<12>(); + let _ph8 = gpioh.ph8.into_alternate::<12>(); + let _ph9 = gpioh.ph9.into_alternate::<12>(); + let _ph10 = gpioh.ph10.into_alternate::<12>(); + let _ph11 = gpioh.ph11.into_alternate::<12>(); + let _ph12 = gpioh.ph12.into_alternate::<12>(); + let _ph13 = gpioh.ph13.into_alternate::<12>(); + let _ph14 = gpioh.ph14.into_alternate::<12>(); + let _ph15 = gpioh.ph15.into_alternate::<12>(); + + let _pi0 = gpioi.pi0.into_alternate::<12>(); + let _pi1 = gpioi.pi1.into_alternate::<12>(); + let _pi2 = gpioi.pi2.into_alternate::<12>(); + let _pi3 = gpioi.pi3.into_alternate::<12>(); + let _pi4 = gpioi.pi4.into_alternate::<12>(); + let _pi5 = gpioi.pi5.into_alternate::<12>(); + let _pi6 = gpioi.pi6.into_alternate::<12>(); + let _pi7 = gpioi.pi7.into_alternate::<12>(); + let _pi9 = gpioi.pi9.into_alternate::<12>(); + let _pi10 = gpioi.pi10.into_alternate::<12>(); + + rcc.ahb3enr().modify(|_, w| w.fmcen().set_bit()); + fmc.sdcr1().write(|w| { + w.wp().disabled(); + w.nc().bits8(); + w.nb().nb4(); + w.nr().bits12(); + w.cas().clocks3(); + w.mwid().bits32(); + w.rpipe().no_delay(); + w.sdclk().div2(); + w.rburst().enabled() + }); + fmc.sdtr1().write(|w| { + w.twr().set(2); + w.trc().set(7); + w.trp().set(2); + w.tras().set(4); + w.txsr().set(7); + w.trcd().set(2); + w.tmrd().set(2) + }); + fmc.sdcmr().write(|w| { + w.mode().clock_configuration_enable(); + w.ctb1().issued(); + w.nrfs().set(1); + w.mrd().set(0) + }); + while fmc.sdsr().read().busy().bit_is_set() {} + delay.delay_us(200u32); + fmc.sdcmr().write(|w| { + w.mode().pall(); + w.ctb1().issued(); + w.nrfs().set(1); + w.mrd().set(0) + }); + while fmc.sdsr().read().busy().bit_is_set() {} + fmc.sdcmr().write(|w| { + w.mode().auto_refresh_command(); + w.ctb1().issued(); + w.nrfs().set(8); + w.mrd().set(0) + }); + while fmc.sdsr().read().busy().bit_is_set() {} + fmc.sdcmr().write(|w| { + w.mode().load_mode_register(); + w.ctb1().issued(); + w.nrfs().set(1); + w.mrd().set(0b1000110001) + }); + while fmc.sdsr().read().busy().bit_is_set() {} + fmc.sdrtr().write(|w| w.count().set(1385)); + let mut lcd_reset = gpioh.ph7.into_push_pull_output(); lcd_reset.set_low(); delay.delay_ms(20u32); @@ -65,7 +193,6 @@ fn main() -> ! { DISPLAY_CONFIGURATION, Some(hse_freq), ); - display.enable_layer(ltdc::Layer::L1); display.config_layer( ltdc::Layer::L1, @@ -128,5 +255,15 @@ fn main() -> ! { ) .unwrap(); + gpiog.pg6.into_push_pull_output().set_low(); + gpiod.pd4.into_push_pull_output().set_low(); + gpiod.pd5.into_push_pull_output().set_low(); + peripherals + .GPIOK + .split(&mut rcc) + .pk3 + .into_push_pull_output() + .set_low(); + loop {} }