diff --git a/src/main.rs b/src/main.rs index fac913f..07986f4 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,5 +1,6 @@ #![no_main] #![no_std] + use crate::hal::{ dsi::{ ColorCoding, DsiChannel, DsiCmdModeTransmissionKind, DsiConfig, DsiHost, DsiInterrupts, @@ -12,7 +13,7 @@ use crate::hal::{ use cortex_m_rt::entry; use otm8009a::{Otm8009A, Otm8009AConfig}; use panic_halt as _; -use stm32f4xx_hal::{self as hal, ltdc, rcc::Config}; +use stm32f4xx_hal::{self as hal, gpio::Speed, ltdc, rcc::Config}; const WIDTH: usize = 480; const HEIGHT: usize = 800; @@ -58,70 +59,50 @@ fn main() -> ! { let gpioh = peripherals.GPIOH.split(&mut rcc); let gpioi = peripherals.GPIOI.split(&mut rcc); - let _pc0 = gpioc.pc0.into_alternate::<12>(); + macro_rules! set_pins { + ( $( $x:expr ),* ) => { + { + $( + $x.into_alternate::<12>().speed(Speed::VeryHigh); + )* + } + }; + } - 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>(); + // Port C + set_pins![gpioc.pc0]; + // Port D + set_pins![ + gpiod.pd0, gpiod.pd1, gpiod.pd8, gpiod.pd9, gpiod.pd10, gpiod.pd14, gpiod.pd15 + ]; + // Port E + set_pins![ + gpioe.pe0, gpioe.pe1, gpioe.pe7, gpioe.pe8, gpioe.pe9, gpioe.pe10, gpioe.pe11, gpioe.pe12, + gpioe.pe13, gpioe.pe14, gpioe.pe15 + ]; + // Port F + set_pins![ + gpiof.pf0, gpiof.pf1, gpiof.pf2, gpiof.pf3, gpiof.pf4, gpiof.pf5, gpiof.pf11, gpiof.pf12, + gpiof.pf13, gpiof.pf14, gpiof.pf15 + ]; + // Port G + set_pins![ + gpiog.pg0, gpiog.pg1, gpiog.pg4, gpiog.pg5, gpiog.pg8, gpiog.pg15 + ]; + // Port H + set_pins![ + gpioh.ph2, gpioh.ph3, gpioh.ph8, gpioh.ph9, gpioh.ph10, gpioh.ph11, gpioh.ph13, gpioh.ph14, + gpioh.ph15 + ]; + // Port I + set_pins![ + gpioi.pi0, gpioi.pi1, gpioi.pi2, gpioi.pi3, gpioi.pi4, gpioi.pi5, gpioi.pi6, gpioi.pi7, + gpioi.pi9, gpioi.pi10 + ]; + // Enable FMC clock rcc.ahb3enr().modify(|_, w| w.fmcen().set_bit()); + fmc.sdcr1().write(|w| { w.wp().disabled(); w.nc().bits8(); @@ -133,6 +114,7 @@ fn main() -> ! { w.sdclk().div2(); w.rburst().enabled() }); + fmc.sdtr1().write(|w| { w.twr().set(2); w.trc().set(7); @@ -142,43 +124,52 @@ fn main() -> ! { 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) }); + + delay.delay_us(200_u32); 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) + w.mrd().set(0b1000110000) }); + while fmc.sdsr().read().busy().bit_is_set() {} + fmc.sdrtr().write(|w| w.count().set(1385)); + while fmc.sdsr().read().busy().bit_is_set() {} let mut lcd_reset = gpioh.ph7.into_push_pull_output(); lcd_reset.set_low(); - delay.delay_ms(20u32); + delay.delay_ms(20_u32); lcd_reset.set_high(); - delay.delay_ms(10u32); + delay.delay_ms(10_u32); #[unsafe(link_section = ".sdram")] static mut BUFF: [u32; 480 * 800] = [0; 480 * 800]; @@ -253,8 +244,9 @@ fn main() -> ! { .unwrap(); unsafe { - (0..480 * 800).for_each(|i| BUFF[i] = 0xFF0000FF); + (0..480 * 800).for_each(|i| BUFF[i] = 0xFF00FFFF); } + display.reload(); gpiog.pg6.into_push_pull_output().set_low();