Merge #603
603: Add support for FMC r=Dirbaio a=matoushybl Co-authored-by: Matous Hybl <hyblmatous@gmail.com>
This commit is contained in:
		
						commit
						2cf79f6569
					
				@ -30,6 +30,7 @@ stm32-metapac = { version = "0.1.0", path = "../stm32-metapac", features = ["rt"
 | 
				
			|||||||
vcell = { version = "0.1.3", optional = true }
 | 
					vcell = { version = "0.1.3", optional = true }
 | 
				
			||||||
bxcan = "0.6.2"
 | 
					bxcan = "0.6.2"
 | 
				
			||||||
nb = "1.0.0"
 | 
					nb = "1.0.0"
 | 
				
			||||||
 | 
					stm32-fmc = "0.2.4"
 | 
				
			||||||
seq-macro = "0.2.2"
 | 
					seq-macro = "0.2.2"
 | 
				
			||||||
cfg-if = "1.0.0"
 | 
					cfg-if = "1.0.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										145
									
								
								embassy-stm32/src/fmc/mod.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										145
									
								
								embassy-stm32/src/fmc/mod.rs
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,145 @@
 | 
				
			|||||||
 | 
					mod pins;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use core::marker::PhantomData;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use embassy::util::Unborrow;
 | 
				
			||||||
 | 
					use embassy_hal_common::unborrow;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use pins::*;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					pub struct Fmc<'d, T: Instance> {
 | 
				
			||||||
 | 
					    peri: PhantomData<&'d mut T>,
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					unsafe impl<'d, T> Send for Fmc<'d, T> where T: Instance {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					unsafe impl<'d, T> stm32_fmc::FmcPeripheral for Fmc<'d, T>
 | 
				
			||||||
 | 
					where
 | 
				
			||||||
 | 
					    T: Instance,
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    const REGISTERS: *const () = crate::pac::FMC.0 as *const _;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    fn enable(&mut self) {
 | 
				
			||||||
 | 
					        <T as crate::rcc::sealed::RccPeripheral>::enable();
 | 
				
			||||||
 | 
					        <T as crate::rcc::sealed::RccPeripheral>::reset();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    fn memory_controller_enable(&mut self) {
 | 
				
			||||||
 | 
					        // The FMCEN bit of the FMC_BCR2..4 registers is don’t
 | 
				
			||||||
 | 
					        // care. It is only enabled through the FMC_BCR1 register.
 | 
				
			||||||
 | 
					        unsafe { T::regs().bcr1().modify(|r| r.set_fmcen(true)) };
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    fn source_clock_hz(&self) -> u32 {
 | 
				
			||||||
 | 
					        <T as crate::rcc::sealed::RccPeripheral>::frequency().0
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					macro_rules! config_pins {
 | 
				
			||||||
 | 
					    ($($pin:ident),*) => {
 | 
				
			||||||
 | 
					        $(
 | 
				
			||||||
 | 
					            $pin.configure();
 | 
				
			||||||
 | 
					        )*
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					macro_rules! fmc_sdram_constructor {
 | 
				
			||||||
 | 
					    ($name:ident: (
 | 
				
			||||||
 | 
					        addr: [$(($addr_pin_name:ident: $addr_signal:ident)),*],
 | 
				
			||||||
 | 
					        ba: [$(($ba_pin_name:ident: $ba_signal:ident)),*],
 | 
				
			||||||
 | 
					        d: [$(($d_pin_name:ident: $d_signal:ident)),*],
 | 
				
			||||||
 | 
					        nbl: [$(($nbl_pin_name:ident: $nbl_signal:ident)),*],
 | 
				
			||||||
 | 
					        ctrl: [$(($ctrl_pin_name:ident: $ctrl_signal:ident)),*]
 | 
				
			||||||
 | 
					    )) => {
 | 
				
			||||||
 | 
					        pub fn $name<CHIP: stm32_fmc::SdramChip>(
 | 
				
			||||||
 | 
					            _instance: impl Unborrow<Target = T> + 'd,
 | 
				
			||||||
 | 
					            $($addr_pin_name: impl Unborrow<Target = impl $addr_signal> + 'd),*,
 | 
				
			||||||
 | 
					            $($ba_pin_name: impl Unborrow<Target = impl $ba_signal> + 'd),*,
 | 
				
			||||||
 | 
					            $($d_pin_name: impl Unborrow<Target = impl $d_signal> + 'd),*,
 | 
				
			||||||
 | 
					            $($nbl_pin_name: impl Unborrow<Target = impl $nbl_signal> + 'd),*,
 | 
				
			||||||
 | 
					            $($ctrl_pin_name: impl Unborrow<Target = impl $ctrl_signal> + 'd),*,
 | 
				
			||||||
 | 
					            chip: CHIP
 | 
				
			||||||
 | 
					        ) -> stm32_fmc::Sdram<Fmc<'d, T>, CHIP> {
 | 
				
			||||||
 | 
					            unborrow!(
 | 
				
			||||||
 | 
					                $($addr_pin_name),*,
 | 
				
			||||||
 | 
					                $($ba_pin_name),*,
 | 
				
			||||||
 | 
					                $($d_pin_name),*,
 | 
				
			||||||
 | 
					                $($nbl_pin_name),*,
 | 
				
			||||||
 | 
					                $($ctrl_pin_name),*
 | 
				
			||||||
 | 
					            );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            config_pins!(
 | 
				
			||||||
 | 
					                $($addr_pin_name),*,
 | 
				
			||||||
 | 
					                $($ba_pin_name),*,
 | 
				
			||||||
 | 
					                $($d_pin_name),*,
 | 
				
			||||||
 | 
					                $($nbl_pin_name),*,
 | 
				
			||||||
 | 
					                $($ctrl_pin_name),*
 | 
				
			||||||
 | 
					            );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            let fmc = Self { peri: PhantomData };
 | 
				
			||||||
 | 
					            stm32_fmc::Sdram::new(
 | 
				
			||||||
 | 
					                fmc,
 | 
				
			||||||
 | 
					                (
 | 
				
			||||||
 | 
					                    $($addr_pin_name),*,
 | 
				
			||||||
 | 
					                    $($ba_pin_name),*,
 | 
				
			||||||
 | 
					                    $($d_pin_name),*,
 | 
				
			||||||
 | 
					                    $($nbl_pin_name),*,
 | 
				
			||||||
 | 
					                    $($ctrl_pin_name),*,
 | 
				
			||||||
 | 
					                ),
 | 
				
			||||||
 | 
					                chip,
 | 
				
			||||||
 | 
					            )
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					impl<'d, T: Instance> Fmc<'d, T> {
 | 
				
			||||||
 | 
					    fmc_sdram_constructor!(sdram_a12bits_d32bits_4banks_bank1: (
 | 
				
			||||||
 | 
					        addr: [
 | 
				
			||||||
 | 
					            (a0: A0Pin), (a1: A1Pin), (a2: A2Pin), (a3: A3Pin), (a4: A4Pin), (a5: A5Pin), (a6: A6Pin), (a7: A7Pin), (a8: A8Pin), (a9: A9Pin), (a10: A10Pin), (a11: A11Pin)
 | 
				
			||||||
 | 
					        ],
 | 
				
			||||||
 | 
					        ba: [(ba0: BA0Pin), (ba1: BA1Pin)],
 | 
				
			||||||
 | 
					        d: [
 | 
				
			||||||
 | 
					            (d0: D0Pin), (d1: D1Pin), (d2: D2Pin), (d3: D3Pin), (d4: D4Pin), (d5: D5Pin), (d6: D6Pin), (d7: D7Pin),
 | 
				
			||||||
 | 
					            (d8: D8Pin), (d9: D9Pin), (d10: D10Pin), (d11: D11Pin), (d12: D12Pin), (d13: D13Pin), (d14: D14Pin), (d15: D15Pin),
 | 
				
			||||||
 | 
					            (d16: D16Pin), (d17: D17Pin), (d18: D18Pin), (d19: D19Pin), (d20: D20Pin), (d21: D21Pin), (d22: D22Pin), (d23: D23Pin),
 | 
				
			||||||
 | 
					            (d24: D24Pin), (d25: D25Pin), (d26: D26Pin), (d27: D27Pin), (d28: D28Pin), (d29: D29Pin), (d30: D30Pin), (d31: D31Pin)
 | 
				
			||||||
 | 
					        ],
 | 
				
			||||||
 | 
					        nbl: [
 | 
				
			||||||
 | 
					            (nbl0: NBL0Pin), (nbl1: NBL1Pin), (nbl2: NBL2Pin), (nbl3: NBL3Pin)
 | 
				
			||||||
 | 
					        ],
 | 
				
			||||||
 | 
					        ctrl: [
 | 
				
			||||||
 | 
					            (sdcke: SDCKE0Pin), (sdclk: SDCLKPin), (sdncas: SDNCASPin), (sdne: SDNE0Pin), (sdnras: SDNRASPin), (sdnwe: SDNWEPin)
 | 
				
			||||||
 | 
					        ]
 | 
				
			||||||
 | 
					    ));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    fmc_sdram_constructor!(sdram_a12bits_d32bits_4banks_bank2: (
 | 
				
			||||||
 | 
					        addr: [
 | 
				
			||||||
 | 
					            (a0: A0Pin), (a1: A1Pin), (a2: A2Pin), (a3: A3Pin), (a4: A4Pin), (a5: A5Pin), (a6: A6Pin), (a7: A7Pin), (a8: A8Pin), (a9: A9Pin), (a10: A10Pin), (a11: A11Pin)
 | 
				
			||||||
 | 
					        ],
 | 
				
			||||||
 | 
					        ba: [(ba0: BA0Pin), (ba1: BA1Pin)],
 | 
				
			||||||
 | 
					        d: [
 | 
				
			||||||
 | 
					            (d0: D0Pin), (d1: D1Pin), (d2: D2Pin), (d3: D3Pin), (d4: D4Pin), (d5: D5Pin), (d6: D6Pin), (d7: D7Pin),
 | 
				
			||||||
 | 
					            (d8: D8Pin), (d9: D9Pin), (d10: D10Pin), (d11: D11Pin), (d12: D12Pin), (d13: D13Pin), (d14: D14Pin), (d15: D15Pin),
 | 
				
			||||||
 | 
					            (d16: D16Pin), (d17: D17Pin), (d18: D18Pin), (d19: D19Pin), (d20: D20Pin), (d21: D21Pin), (d22: D22Pin), (d23: D23Pin),
 | 
				
			||||||
 | 
					            (d24: D24Pin), (d25: D25Pin), (d26: D26Pin), (d27: D27Pin), (d28: D28Pin), (d29: D29Pin), (d30: D30Pin), (d31: D31Pin)
 | 
				
			||||||
 | 
					        ],
 | 
				
			||||||
 | 
					        nbl: [
 | 
				
			||||||
 | 
					            (nbl0: NBL0Pin), (nbl1: NBL1Pin), (nbl2: NBL2Pin), (nbl3: NBL3Pin)
 | 
				
			||||||
 | 
					        ],
 | 
				
			||||||
 | 
					        ctrl: [
 | 
				
			||||||
 | 
					            (sdcke: SDCKE1Pin), (sdclk: SDCLKPin), (sdncas: SDNCASPin), (sdne: SDNE1Pin), (sdnras: SDNRASPin), (sdnwe: SDNWEPin)
 | 
				
			||||||
 | 
					        ]
 | 
				
			||||||
 | 
					    ));
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					pub trait Instance: sealed::Instance + 'static {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					crate::pac::peripherals!(
 | 
				
			||||||
 | 
					    (fmc, $inst:ident) => {
 | 
				
			||||||
 | 
					        impl crate::fmc::sealed::Instance for crate::peripherals::$inst {
 | 
				
			||||||
 | 
					            fn regs() -> stm32_metapac::fmc::Fmc {
 | 
				
			||||||
 | 
					                crate::pac::$inst
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        impl crate::fmc::Instance for crate::peripherals::$inst {}
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					);
 | 
				
			||||||
							
								
								
									
										672
									
								
								embassy-stm32/src/fmc/pins.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										672
									
								
								embassy-stm32/src/fmc/pins.rs
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,672 @@
 | 
				
			|||||||
 | 
					pub(crate) mod sealed {
 | 
				
			||||||
 | 
					    pub trait Instance: crate::rcc::sealed::RccPeripheral {
 | 
				
			||||||
 | 
					        fn regs() -> crate::pac::fmc::Fmc;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    macro_rules! declare_pin {
 | 
				
			||||||
 | 
					        ($name:ident) => {
 | 
				
			||||||
 | 
					            pub trait $name {
 | 
				
			||||||
 | 
					                fn configure(&mut self);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    declare_pin!(SDNWEPin);
 | 
				
			||||||
 | 
					    declare_pin!(SDNCASPin);
 | 
				
			||||||
 | 
					    declare_pin!(SDNRASPin);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    declare_pin!(SDNE0Pin);
 | 
				
			||||||
 | 
					    declare_pin!(SDNE1Pin);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    declare_pin!(SDCKE0Pin);
 | 
				
			||||||
 | 
					    declare_pin!(SDCKE1Pin);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    declare_pin!(SDCLKPin);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    declare_pin!(NBL0Pin);
 | 
				
			||||||
 | 
					    declare_pin!(NBL1Pin);
 | 
				
			||||||
 | 
					    declare_pin!(NBL2Pin);
 | 
				
			||||||
 | 
					    declare_pin!(NBL3Pin);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    declare_pin!(INTPin);
 | 
				
			||||||
 | 
					    declare_pin!(NLPin);
 | 
				
			||||||
 | 
					    declare_pin!(NWaitPin);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    declare_pin!(NE1Pin);
 | 
				
			||||||
 | 
					    declare_pin!(NE2Pin);
 | 
				
			||||||
 | 
					    declare_pin!(NE3Pin);
 | 
				
			||||||
 | 
					    declare_pin!(NE4Pin);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    declare_pin!(NCEPin);
 | 
				
			||||||
 | 
					    declare_pin!(NOEPin);
 | 
				
			||||||
 | 
					    declare_pin!(NWEPin);
 | 
				
			||||||
 | 
					    declare_pin!(ClkPin);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    declare_pin!(BA0Pin);
 | 
				
			||||||
 | 
					    declare_pin!(BA1Pin);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    declare_pin!(D0Pin);
 | 
				
			||||||
 | 
					    declare_pin!(D1Pin);
 | 
				
			||||||
 | 
					    declare_pin!(D2Pin);
 | 
				
			||||||
 | 
					    declare_pin!(D3Pin);
 | 
				
			||||||
 | 
					    declare_pin!(D4Pin);
 | 
				
			||||||
 | 
					    declare_pin!(D5Pin);
 | 
				
			||||||
 | 
					    declare_pin!(D6Pin);
 | 
				
			||||||
 | 
					    declare_pin!(D7Pin);
 | 
				
			||||||
 | 
					    declare_pin!(D8Pin);
 | 
				
			||||||
 | 
					    declare_pin!(D9Pin);
 | 
				
			||||||
 | 
					    declare_pin!(D10Pin);
 | 
				
			||||||
 | 
					    declare_pin!(D11Pin);
 | 
				
			||||||
 | 
					    declare_pin!(D12Pin);
 | 
				
			||||||
 | 
					    declare_pin!(D13Pin);
 | 
				
			||||||
 | 
					    declare_pin!(D14Pin);
 | 
				
			||||||
 | 
					    declare_pin!(D15Pin);
 | 
				
			||||||
 | 
					    declare_pin!(D16Pin);
 | 
				
			||||||
 | 
					    declare_pin!(D17Pin);
 | 
				
			||||||
 | 
					    declare_pin!(D18Pin);
 | 
				
			||||||
 | 
					    declare_pin!(D19Pin);
 | 
				
			||||||
 | 
					    declare_pin!(D20Pin);
 | 
				
			||||||
 | 
					    declare_pin!(D21Pin);
 | 
				
			||||||
 | 
					    declare_pin!(D22Pin);
 | 
				
			||||||
 | 
					    declare_pin!(D23Pin);
 | 
				
			||||||
 | 
					    declare_pin!(D24Pin);
 | 
				
			||||||
 | 
					    declare_pin!(D25Pin);
 | 
				
			||||||
 | 
					    declare_pin!(D26Pin);
 | 
				
			||||||
 | 
					    declare_pin!(D27Pin);
 | 
				
			||||||
 | 
					    declare_pin!(D28Pin);
 | 
				
			||||||
 | 
					    declare_pin!(D29Pin);
 | 
				
			||||||
 | 
					    declare_pin!(D30Pin);
 | 
				
			||||||
 | 
					    declare_pin!(D31Pin);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    declare_pin!(DA0Pin);
 | 
				
			||||||
 | 
					    declare_pin!(DA1Pin);
 | 
				
			||||||
 | 
					    declare_pin!(DA2Pin);
 | 
				
			||||||
 | 
					    declare_pin!(DA3Pin);
 | 
				
			||||||
 | 
					    declare_pin!(DA4Pin);
 | 
				
			||||||
 | 
					    declare_pin!(DA5Pin);
 | 
				
			||||||
 | 
					    declare_pin!(DA6Pin);
 | 
				
			||||||
 | 
					    declare_pin!(DA7Pin);
 | 
				
			||||||
 | 
					    declare_pin!(DA8Pin);
 | 
				
			||||||
 | 
					    declare_pin!(DA9Pin);
 | 
				
			||||||
 | 
					    declare_pin!(DA10Pin);
 | 
				
			||||||
 | 
					    declare_pin!(DA11Pin);
 | 
				
			||||||
 | 
					    declare_pin!(DA12Pin);
 | 
				
			||||||
 | 
					    declare_pin!(DA13Pin);
 | 
				
			||||||
 | 
					    declare_pin!(DA14Pin);
 | 
				
			||||||
 | 
					    declare_pin!(DA15Pin);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    declare_pin!(A0Pin);
 | 
				
			||||||
 | 
					    declare_pin!(A1Pin);
 | 
				
			||||||
 | 
					    declare_pin!(A2Pin);
 | 
				
			||||||
 | 
					    declare_pin!(A3Pin);
 | 
				
			||||||
 | 
					    declare_pin!(A4Pin);
 | 
				
			||||||
 | 
					    declare_pin!(A5Pin);
 | 
				
			||||||
 | 
					    declare_pin!(A6Pin);
 | 
				
			||||||
 | 
					    declare_pin!(A7Pin);
 | 
				
			||||||
 | 
					    declare_pin!(A8Pin);
 | 
				
			||||||
 | 
					    declare_pin!(A9Pin);
 | 
				
			||||||
 | 
					    declare_pin!(A10Pin);
 | 
				
			||||||
 | 
					    declare_pin!(A11Pin);
 | 
				
			||||||
 | 
					    declare_pin!(A12Pin);
 | 
				
			||||||
 | 
					    declare_pin!(A13Pin);
 | 
				
			||||||
 | 
					    declare_pin!(A14Pin);
 | 
				
			||||||
 | 
					    declare_pin!(A15Pin);
 | 
				
			||||||
 | 
					    declare_pin!(A16Pin);
 | 
				
			||||||
 | 
					    declare_pin!(A17Pin);
 | 
				
			||||||
 | 
					    declare_pin!(A18Pin);
 | 
				
			||||||
 | 
					    declare_pin!(A19Pin);
 | 
				
			||||||
 | 
					    declare_pin!(A20Pin);
 | 
				
			||||||
 | 
					    declare_pin!(A21Pin);
 | 
				
			||||||
 | 
					    declare_pin!(A22Pin);
 | 
				
			||||||
 | 
					    declare_pin!(A23Pin);
 | 
				
			||||||
 | 
					    declare_pin!(A24Pin);
 | 
				
			||||||
 | 
					    declare_pin!(A25Pin);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					macro_rules! declare_pin {
 | 
				
			||||||
 | 
					    ($name:ident, $fmc_pin:ident) => {
 | 
				
			||||||
 | 
					        pub trait $name: sealed::$name + stm32_fmc::$fmc_pin + 'static {}
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					declare_pin!(SDNWEPin, SDNWE);
 | 
				
			||||||
 | 
					declare_pin!(SDNCASPin, SDNCAS);
 | 
				
			||||||
 | 
					declare_pin!(SDNRASPin, SDNRAS);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					declare_pin!(SDNE0Pin, SDNE0);
 | 
				
			||||||
 | 
					declare_pin!(SDNE1Pin, SDNE1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					declare_pin!(SDCKE0Pin, SDCKE0);
 | 
				
			||||||
 | 
					declare_pin!(SDCKE1Pin, SDCKE1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					declare_pin!(SDCLKPin, SDCLK);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					declare_pin!(NBL0Pin, NBL0);
 | 
				
			||||||
 | 
					declare_pin!(NBL1Pin, NBL1);
 | 
				
			||||||
 | 
					declare_pin!(NBL2Pin, NBL2);
 | 
				
			||||||
 | 
					declare_pin!(NBL3Pin, NBL3);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					declare_pin!(INTPin, INT);
 | 
				
			||||||
 | 
					declare_pin!(NLPin, NL);
 | 
				
			||||||
 | 
					declare_pin!(NWaitPin, NWAIT);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					declare_pin!(NE1Pin, NE1);
 | 
				
			||||||
 | 
					declare_pin!(NE2Pin, NE2);
 | 
				
			||||||
 | 
					declare_pin!(NE3Pin, NE3);
 | 
				
			||||||
 | 
					declare_pin!(NE4Pin, NE4);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					declare_pin!(NCEPin, NCE);
 | 
				
			||||||
 | 
					declare_pin!(NOEPin, NOE);
 | 
				
			||||||
 | 
					declare_pin!(NWEPin, NWE);
 | 
				
			||||||
 | 
					declare_pin!(ClkPin, CLK);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					declare_pin!(BA0Pin, BA0);
 | 
				
			||||||
 | 
					declare_pin!(BA1Pin, BA1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					declare_pin!(D0Pin, D0);
 | 
				
			||||||
 | 
					declare_pin!(D1Pin, D1);
 | 
				
			||||||
 | 
					declare_pin!(D2Pin, D2);
 | 
				
			||||||
 | 
					declare_pin!(D3Pin, D3);
 | 
				
			||||||
 | 
					declare_pin!(D4Pin, D4);
 | 
				
			||||||
 | 
					declare_pin!(D5Pin, D5);
 | 
				
			||||||
 | 
					declare_pin!(D6Pin, D6);
 | 
				
			||||||
 | 
					declare_pin!(D7Pin, D7);
 | 
				
			||||||
 | 
					declare_pin!(D8Pin, D8);
 | 
				
			||||||
 | 
					declare_pin!(D9Pin, D9);
 | 
				
			||||||
 | 
					declare_pin!(D10Pin, D10);
 | 
				
			||||||
 | 
					declare_pin!(D11Pin, D11);
 | 
				
			||||||
 | 
					declare_pin!(D12Pin, D12);
 | 
				
			||||||
 | 
					declare_pin!(D13Pin, D13);
 | 
				
			||||||
 | 
					declare_pin!(D14Pin, D14);
 | 
				
			||||||
 | 
					declare_pin!(D15Pin, D15);
 | 
				
			||||||
 | 
					declare_pin!(D16Pin, D16);
 | 
				
			||||||
 | 
					declare_pin!(D17Pin, D17);
 | 
				
			||||||
 | 
					declare_pin!(D18Pin, D18);
 | 
				
			||||||
 | 
					declare_pin!(D19Pin, D19);
 | 
				
			||||||
 | 
					declare_pin!(D20Pin, D20);
 | 
				
			||||||
 | 
					declare_pin!(D21Pin, D21);
 | 
				
			||||||
 | 
					declare_pin!(D22Pin, D22);
 | 
				
			||||||
 | 
					declare_pin!(D23Pin, D23);
 | 
				
			||||||
 | 
					declare_pin!(D24Pin, D24);
 | 
				
			||||||
 | 
					declare_pin!(D25Pin, D25);
 | 
				
			||||||
 | 
					declare_pin!(D26Pin, D26);
 | 
				
			||||||
 | 
					declare_pin!(D27Pin, D27);
 | 
				
			||||||
 | 
					declare_pin!(D28Pin, D28);
 | 
				
			||||||
 | 
					declare_pin!(D29Pin, D29);
 | 
				
			||||||
 | 
					declare_pin!(D30Pin, D30);
 | 
				
			||||||
 | 
					declare_pin!(D31Pin, D31);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					declare_pin!(DA0Pin, DA0);
 | 
				
			||||||
 | 
					declare_pin!(DA1Pin, DA1);
 | 
				
			||||||
 | 
					declare_pin!(DA2Pin, DA2);
 | 
				
			||||||
 | 
					declare_pin!(DA3Pin, DA3);
 | 
				
			||||||
 | 
					declare_pin!(DA4Pin, DA4);
 | 
				
			||||||
 | 
					declare_pin!(DA5Pin, DA5);
 | 
				
			||||||
 | 
					declare_pin!(DA6Pin, DA6);
 | 
				
			||||||
 | 
					declare_pin!(DA7Pin, DA7);
 | 
				
			||||||
 | 
					declare_pin!(DA8Pin, DA8);
 | 
				
			||||||
 | 
					declare_pin!(DA9Pin, DA9);
 | 
				
			||||||
 | 
					declare_pin!(DA10Pin, DA10);
 | 
				
			||||||
 | 
					declare_pin!(DA11Pin, DA11);
 | 
				
			||||||
 | 
					declare_pin!(DA12Pin, DA12);
 | 
				
			||||||
 | 
					declare_pin!(DA13Pin, DA13);
 | 
				
			||||||
 | 
					declare_pin!(DA14Pin, DA14);
 | 
				
			||||||
 | 
					declare_pin!(DA15Pin, DA15);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					declare_pin!(A0Pin, A0);
 | 
				
			||||||
 | 
					declare_pin!(A1Pin, A1);
 | 
				
			||||||
 | 
					declare_pin!(A2Pin, A2);
 | 
				
			||||||
 | 
					declare_pin!(A3Pin, A3);
 | 
				
			||||||
 | 
					declare_pin!(A4Pin, A4);
 | 
				
			||||||
 | 
					declare_pin!(A5Pin, A5);
 | 
				
			||||||
 | 
					declare_pin!(A6Pin, A6);
 | 
				
			||||||
 | 
					declare_pin!(A7Pin, A7);
 | 
				
			||||||
 | 
					declare_pin!(A8Pin, A8);
 | 
				
			||||||
 | 
					declare_pin!(A9Pin, A9);
 | 
				
			||||||
 | 
					declare_pin!(A10Pin, A10);
 | 
				
			||||||
 | 
					declare_pin!(A11Pin, A11);
 | 
				
			||||||
 | 
					declare_pin!(A12Pin, A12);
 | 
				
			||||||
 | 
					declare_pin!(A13Pin, A13);
 | 
				
			||||||
 | 
					declare_pin!(A14Pin, A14);
 | 
				
			||||||
 | 
					declare_pin!(A15Pin, A15);
 | 
				
			||||||
 | 
					declare_pin!(A16Pin, A16);
 | 
				
			||||||
 | 
					declare_pin!(A17Pin, A17);
 | 
				
			||||||
 | 
					declare_pin!(A18Pin, A18);
 | 
				
			||||||
 | 
					declare_pin!(A19Pin, A19);
 | 
				
			||||||
 | 
					declare_pin!(A20Pin, A20);
 | 
				
			||||||
 | 
					declare_pin!(A21Pin, A21);
 | 
				
			||||||
 | 
					declare_pin!(A22Pin, A22);
 | 
				
			||||||
 | 
					declare_pin!(A23Pin, A23);
 | 
				
			||||||
 | 
					declare_pin!(A24Pin, A24);
 | 
				
			||||||
 | 
					declare_pin!(A25Pin, A25);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					macro_rules! impl_pin {
 | 
				
			||||||
 | 
					    ($pin:ident, $signal:ident, $fmc_name:ident, $af:expr) => {
 | 
				
			||||||
 | 
					        impl sealed::$signal for crate::peripherals::$pin {
 | 
				
			||||||
 | 
					            fn configure(&mut self) {
 | 
				
			||||||
 | 
					                use crate::gpio::sealed::{AFType::OutputPushPull, Pin as SealedPin};
 | 
				
			||||||
 | 
					                use crate::gpio::Pin;
 | 
				
			||||||
 | 
					                use crate::gpio::Speed;
 | 
				
			||||||
 | 
					                use crate::pac::gpio::vals::Pupdr;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                critical_section::with(|_| unsafe {
 | 
				
			||||||
 | 
					                    self.set_as_af($af, OutputPushPull);
 | 
				
			||||||
 | 
					                    self.set_speed(Speed::VeryHigh);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    self.block()
 | 
				
			||||||
 | 
					                        .pupdr()
 | 
				
			||||||
 | 
					                        .modify(|w| w.set_pupdr(self.pin() as usize, Pupdr::PULLUP));
 | 
				
			||||||
 | 
					                })
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        impl stm32_fmc::$fmc_name for crate::peripherals::$pin {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        impl $signal for crate::peripherals::$pin {}
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					crate::pac::peripheral_pins!(
 | 
				
			||||||
 | 
					    ($inst:ident, fmc, FMC, $pin:ident, A0, $af:expr) => {
 | 
				
			||||||
 | 
					        impl_pin!($pin, A0Pin, A0, $af);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ($inst:ident, fmc, FMC, $pin:ident, A1, $af:expr) => {
 | 
				
			||||||
 | 
					        impl_pin!($pin, A1Pin, A1, $af);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ($inst:ident, fmc, FMC, $pin:ident, A2, $af:expr) => {
 | 
				
			||||||
 | 
					        impl_pin!($pin, A2Pin, A2, $af);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ($inst:ident, fmc, FMC, $pin:ident, A3, $af:expr) => {
 | 
				
			||||||
 | 
					        impl_pin!($pin, A3Pin, A3, $af);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ($inst:ident, fmc, FMC, $pin:ident, A4, $af:expr) => {
 | 
				
			||||||
 | 
					        impl_pin!($pin, A4Pin, A4, $af);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ($inst:ident, fmc, FMC, $pin:ident, A5, $af:expr) => {
 | 
				
			||||||
 | 
					        impl_pin!($pin, A5Pin, A5, $af);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ($inst:ident, fmc, FMC, $pin:ident, A6, $af:expr) => {
 | 
				
			||||||
 | 
					        impl_pin!($pin, A6Pin, A6, $af);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ($inst:ident, fmc, FMC, $pin:ident, A7, $af:expr) => {
 | 
				
			||||||
 | 
					        impl_pin!($pin, A7Pin, A7, $af);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ($inst:ident, fmc, FMC, $pin:ident, A8, $af:expr) => {
 | 
				
			||||||
 | 
					        impl_pin!($pin, A8Pin, A8, $af);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ($inst:ident, fmc, FMC, $pin:ident, A9, $af:expr) => {
 | 
				
			||||||
 | 
					        impl_pin!($pin, A9Pin, A9, $af);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ($inst:ident, fmc, FMC, $pin:ident, A10, $af:expr) => {
 | 
				
			||||||
 | 
					        impl_pin!($pin, A10Pin, A10, $af);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ($inst:ident, fmc, FMC, $pin:ident, A11, $af:expr) => {
 | 
				
			||||||
 | 
					        impl_pin!($pin, A11Pin, A11, $af);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ($inst:ident, fmc, FMC, $pin:ident, A12, $af:expr) => {
 | 
				
			||||||
 | 
					        impl_pin!($pin, A12Pin, A12, $af);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ($inst:ident, fmc, FMC, $pin:ident, A13, $af:expr) => {
 | 
				
			||||||
 | 
					        impl_pin!($pin, A13Pin, A13, $af);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ($inst:ident, fmc, FMC, $pin:ident, A14, $af:expr) => {
 | 
				
			||||||
 | 
					        impl_pin!($pin, A14Pin, A14, $af);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ($inst:ident, fmc, FMC, $pin:ident, A15, $af:expr) => {
 | 
				
			||||||
 | 
					        impl_pin!($pin, A15Pin, A15, $af);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ($inst:ident, fmc, FMC, $pin:ident, A16, $af:expr) => {
 | 
				
			||||||
 | 
					        impl_pin!($pin, A16Pin, A16, $af);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ($inst:ident, fmc, FMC, $pin:ident, A17, $af:expr) => {
 | 
				
			||||||
 | 
					        impl_pin!($pin, A17Pin, A17, $af);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ($inst:ident, fmc, FMC, $pin:ident, A18, $af:expr) => {
 | 
				
			||||||
 | 
					        impl_pin!($pin, A18Pin, A18, $af);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ($inst:ident, fmc, FMC, $pin:ident, A19, $af:expr) => {
 | 
				
			||||||
 | 
					        impl_pin!($pin, A19Pin, A19, $af);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ($inst:ident, fmc, FMC, $pin:ident, A20, $af:expr) => {
 | 
				
			||||||
 | 
					        impl_pin!($pin, A20Pin, A20, $af);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ($inst:ident, fmc, FMC, $pin:ident, A21, $af:expr) => {
 | 
				
			||||||
 | 
					        impl_pin!($pin, A21Pin, A21, $af);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ($inst:ident, fmc, FMC, $pin:ident, A22, $af:expr) => {
 | 
				
			||||||
 | 
					        impl_pin!($pin, A22Pin, A22, $af);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ($inst:ident, fmc, FMC, $pin:ident, A23, $af:expr) => {
 | 
				
			||||||
 | 
					        impl_pin!($pin, A23Pin, A23, $af);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ($inst:ident, fmc, FMC, $pin:ident, A24, $af:expr) => {
 | 
				
			||||||
 | 
					        impl_pin!($pin, A24Pin, A24, $af);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ($inst:ident, fmc, FMC, $pin:ident, A25, $af:expr) => {
 | 
				
			||||||
 | 
					        impl_pin!($pin, A25Pin, A25, $af);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					crate::pac::peripheral_pins!(
 | 
				
			||||||
 | 
					    ($inst:ident, fmc, FMC, $pin:ident, D0, $af:expr) => {
 | 
				
			||||||
 | 
					        impl_pin!($pin, D0Pin, D0, $af);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ($inst:ident, fmc, FMC, $pin:ident, D1, $af:expr) => {
 | 
				
			||||||
 | 
					        impl_pin!($pin, D1Pin, D1, $af);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ($inst:ident, fmc, FMC, $pin:ident, D2, $af:expr) => {
 | 
				
			||||||
 | 
					        impl_pin!($pin, D2Pin, D2, $af);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ($inst:ident, fmc, FMC, $pin:ident, D3, $af:expr) => {
 | 
				
			||||||
 | 
					        impl_pin!($pin, D3Pin, D3, $af);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ($inst:ident, fmc, FMC, $pin:ident, D4, $af:expr) => {
 | 
				
			||||||
 | 
					        impl_pin!($pin, D4Pin, D4, $af);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ($inst:ident, fmc, FMC, $pin:ident, D5, $af:expr) => {
 | 
				
			||||||
 | 
					        impl_pin!($pin, D5Pin, D5, $af);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ($inst:ident, fmc, FMC, $pin:ident, D6, $af:expr) => {
 | 
				
			||||||
 | 
					        impl_pin!($pin, D6Pin, D6, $af);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ($inst:ident, fmc, FMC, $pin:ident, D7, $af:expr) => {
 | 
				
			||||||
 | 
					        impl_pin!($pin, D7Pin, D7, $af);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ($inst:ident, fmc, FMC, $pin:ident, D8, $af:expr) => {
 | 
				
			||||||
 | 
					        impl_pin!($pin, D8Pin, D8, $af);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ($inst:ident, fmc, FMC, $pin:ident, D9, $af:expr) => {
 | 
				
			||||||
 | 
					        impl_pin!($pin, D9Pin, D9, $af);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ($inst:ident, fmc, FMC, $pin:ident, D10, $af:expr) => {
 | 
				
			||||||
 | 
					        impl_pin!($pin, D10Pin, D10, $af);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ($inst:ident, fmc, FMC, $pin:ident, D11, $af:expr) => {
 | 
				
			||||||
 | 
					        impl_pin!($pin, D11Pin, D11, $af);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ($inst:ident, fmc, FMC, $pin:ident, D12, $af:expr) => {
 | 
				
			||||||
 | 
					        impl_pin!($pin, D12Pin, D12, $af);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ($inst:ident, fmc, FMC, $pin:ident, D13, $af:expr) => {
 | 
				
			||||||
 | 
					        impl_pin!($pin, D13Pin, D13, $af);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ($inst:ident, fmc, FMC, $pin:ident, D14, $af:expr) => {
 | 
				
			||||||
 | 
					        impl_pin!($pin, D14Pin, D14, $af);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ($inst:ident, fmc, FMC, $pin:ident, D15, $af:expr) => {
 | 
				
			||||||
 | 
					        impl_pin!($pin, D15Pin, D15, $af);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ($inst:ident, fmc, FMC, $pin:ident, D16, $af:expr) => {
 | 
				
			||||||
 | 
					        impl_pin!($pin, D16Pin, D16, $af);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ($inst:ident, fmc, FMC, $pin:ident, D17, $af:expr) => {
 | 
				
			||||||
 | 
					        impl_pin!($pin, D17Pin, D17, $af);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ($inst:ident, fmc, FMC, $pin:ident, D18, $af:expr) => {
 | 
				
			||||||
 | 
					        impl_pin!($pin, D18Pin, D18, $af);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ($inst:ident, fmc, FMC, $pin:ident, D19, $af:expr) => {
 | 
				
			||||||
 | 
					        impl_pin!($pin, D19Pin, D19, $af);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ($inst:ident, fmc, FMC, $pin:ident, D20, $af:expr) => {
 | 
				
			||||||
 | 
					        impl_pin!($pin, D20Pin, D20, $af);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ($inst:ident, fmc, FMC, $pin:ident, D21, $af:expr) => {
 | 
				
			||||||
 | 
					        impl_pin!($pin, D21Pin, D21, $af);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ($inst:ident, fmc, FMC, $pin:ident, D22, $af:expr) => {
 | 
				
			||||||
 | 
					        impl_pin!($pin, D22Pin, D22, $af);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ($inst:ident, fmc, FMC, $pin:ident, D23, $af:expr) => {
 | 
				
			||||||
 | 
					        impl_pin!($pin, D23Pin, D23, $af);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ($inst:ident, fmc, FMC, $pin:ident, D24, $af:expr) => {
 | 
				
			||||||
 | 
					        impl_pin!($pin, D24Pin, D24, $af);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ($inst:ident, fmc, FMC, $pin:ident, D25, $af:expr) => {
 | 
				
			||||||
 | 
					        impl_pin!($pin, D25Pin, D25, $af);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ($inst:ident, fmc, FMC, $pin:ident, D26, $af:expr) => {
 | 
				
			||||||
 | 
					        impl_pin!($pin, D26Pin, D26, $af);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ($inst:ident, fmc, FMC, $pin:ident, D27, $af:expr) => {
 | 
				
			||||||
 | 
					        impl_pin!($pin, D27Pin, D27, $af);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ($inst:ident, fmc, FMC, $pin:ident, D28, $af:expr) => {
 | 
				
			||||||
 | 
					        impl_pin!($pin, D28Pin, D28, $af);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ($inst:ident, fmc, FMC, $pin:ident, D29, $af:expr) => {
 | 
				
			||||||
 | 
					        impl_pin!($pin, D29Pin, D29, $af);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ($inst:ident, fmc, FMC, $pin:ident, D30, $af:expr) => {
 | 
				
			||||||
 | 
					        impl_pin!($pin, D30Pin, D30, $af);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ($inst:ident, fmc, FMC, $pin:ident, D31, $af:expr) => {
 | 
				
			||||||
 | 
					        impl_pin!($pin, D31Pin, D31, $af);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					crate::pac::peripheral_pins!(
 | 
				
			||||||
 | 
					    ($inst:ident, fmc, FMC, $pin:ident, DA0, $af:expr) => {
 | 
				
			||||||
 | 
					        impl_pin!($pin, DA0Pin, DA0, $af);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ($inst:ident, fmc, FMC, $pin:ident, DA1, $af:expr) => {
 | 
				
			||||||
 | 
					        impl_pin!($pin, DA1Pin, DA1, $af);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ($inst:ident, fmc, FMC, $pin:ident, DA2, $af:expr) => {
 | 
				
			||||||
 | 
					        impl_pin!($pin, DA2Pin, DA2, $af);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ($inst:ident, fmc, FMC, $pin:ident, DA3, $af:expr) => {
 | 
				
			||||||
 | 
					        impl_pin!($pin, DA3Pin, DA3, $af);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ($inst:ident, fmc, FMC, $pin:ident, DA4, $af:expr) => {
 | 
				
			||||||
 | 
					        impl_pin!($pin, DA4Pin, DA4, $af);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ($inst:ident, fmc, FMC, $pin:ident, DA5, $af:expr) => {
 | 
				
			||||||
 | 
					        impl_pin!($pin, DA5Pin, DA5, $af);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ($inst:ident, fmc, FMC, $pin:ident, DA6, $af:expr) => {
 | 
				
			||||||
 | 
					        impl_pin!($pin, DA6Pin, DA6, $af);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ($inst:ident, fmc, FMC, $pin:ident, DA7, $af:expr) => {
 | 
				
			||||||
 | 
					        impl_pin!($pin, DA7Pin, DA7, $af);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ($inst:ident, fmc, FMC, $pin:ident, DA8, $af:expr) => {
 | 
				
			||||||
 | 
					        impl_pin!($pin, DA8Pin, DA8, $af);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ($inst:ident, fmc, FMC, $pin:ident, DA9, $af:expr) => {
 | 
				
			||||||
 | 
					        impl_pin!($pin, DA9Pin, DA9, $af);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ($inst:ident, fmc, FMC, $pin:ident, DA10, $af:expr) => {
 | 
				
			||||||
 | 
					        impl_pin!($pin, DA10Pin, DA10, $af);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ($inst:ident, fmc, FMC, $pin:ident, DA11, $af:expr) => {
 | 
				
			||||||
 | 
					        impl_pin!($pin, DA11Pin, DA11, $af);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ($inst:ident, fmc, FMC, $pin:ident, DA12, $af:expr) => {
 | 
				
			||||||
 | 
					        impl_pin!($pin, DA12Pin, DA12, $af);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ($inst:ident, fmc, FMC, $pin:ident, DA13, $af:expr) => {
 | 
				
			||||||
 | 
					        impl_pin!($pin, DA13Pin, DA13, $af);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ($inst:ident, fmc, FMC, $pin:ident, DA14, $af:expr) => {
 | 
				
			||||||
 | 
					        impl_pin!($pin, DA14Pin, DA14, $af);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ($inst:ident, fmc, FMC, $pin:ident, DA15, $af:expr) => {
 | 
				
			||||||
 | 
					        impl_pin!($pin, DA15Pin, DA15, $af);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					crate::pac::peripheral_pins!(
 | 
				
			||||||
 | 
					    ($inst:ident, fmc, FMC, $pin:ident, SDNWE, $af:expr) => {
 | 
				
			||||||
 | 
					        impl_pin!($pin, SDNWEPin, SDNWE, $af);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ($inst:ident, fmc, FMC, $pin:ident, SDNCAS, $af:expr) => {
 | 
				
			||||||
 | 
					        impl_pin!($pin, SDNCASPin, SDNCAS, $af);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ($inst:ident, fmc, FMC, $pin:ident, SDNRAS, $af:expr) => {
 | 
				
			||||||
 | 
					        impl_pin!($pin, SDNRASPin, SDNRAS, $af);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ($inst:ident, fmc, FMC, $pin:ident, SDNE0, $af:expr) => {
 | 
				
			||||||
 | 
					        impl_pin!($pin, SDNE0Pin, SDNE0, $af);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ($inst:ident, fmc, FMC, $pin:ident, SDNE1, $af:expr) => {
 | 
				
			||||||
 | 
					        impl_pin!($pin, SDNE1Pin, SDNE1, $af);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ($inst:ident, fmc, FMC, $pin:ident, SDCKE0, $af:expr) => {
 | 
				
			||||||
 | 
					        impl_pin!($pin, SDCKE0Pin, SDCKE0, $af);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ($inst:ident, fmc, FMC, $pin:ident, SDCKE1, $af:expr) => {
 | 
				
			||||||
 | 
					        impl_pin!($pin, SDCKE1Pin, SDCKE1, $af);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ($inst:ident, fmc, FMC, $pin:ident, SDCLK, $af:expr) => {
 | 
				
			||||||
 | 
					        impl_pin!($pin, SDCLKPin, SDCLK, $af);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ($inst:ident, fmc, FMC, $pin:ident, NBL0, $af:expr) => {
 | 
				
			||||||
 | 
					        impl_pin!($pin, NBL0Pin, NBL0, $af);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ($inst:ident, fmc, FMC, $pin:ident, NBL1, $af:expr) => {
 | 
				
			||||||
 | 
					        impl_pin!($pin, NBL1Pin, NBL1, $af);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ($inst:ident, fmc, FMC, $pin:ident, NBL2, $af:expr) => {
 | 
				
			||||||
 | 
					        impl_pin!($pin, NBL2Pin, NBL2, $af);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ($inst:ident, fmc, FMC, $pin:ident, NBL3, $af:expr) => {
 | 
				
			||||||
 | 
					        impl_pin!($pin, NBL3Pin, NBL3, $af);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ($inst:ident, fmc, FMC, $pin:ident, INT, $af:expr) => {
 | 
				
			||||||
 | 
					        impl_pin!($pin, INTPin, INT, $af);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ($inst:ident, fmc, FMC, $pin:ident, NL, $af:expr) => {
 | 
				
			||||||
 | 
					        impl_pin!($pin, NLPin, NL, $af);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ($inst:ident, fmc, FMC, $pin:ident, NWAIT, $af:expr) => {
 | 
				
			||||||
 | 
					        impl_pin!($pin, NWaitPin, NWAIT, $af);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ($inst:ident, fmc, FMC, $pin:ident, NE1, $af:expr) => {
 | 
				
			||||||
 | 
					        impl_pin!($pin, NE1Pin, NE1, $af);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ($inst:ident, fmc, FMC, $pin:ident, NE2, $af:expr) => {
 | 
				
			||||||
 | 
					        impl_pin!($pin, NE2Pin, NE2, $af);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ($inst:ident, fmc, FMC, $pin:ident, NE3, $af:expr) => {
 | 
				
			||||||
 | 
					        impl_pin!($pin, NE3Pin, NE3, $af);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ($inst:ident, fmc, FMC, $pin:ident, NE4, $af:expr) => {
 | 
				
			||||||
 | 
					        impl_pin!($pin, NE4Pin, NE4, $af);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ($inst:ident, fmc, FMC, $pin:ident, NCE, $af:expr) => {
 | 
				
			||||||
 | 
					        impl_pin!($pin, NCEPin, NCE, $af);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ($inst:ident, fmc, FMC, $pin:ident, NOE, $af:expr) => {
 | 
				
			||||||
 | 
					        impl_pin!($pin, NOEPin, NOE, $af);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ($inst:ident, fmc, FMC, $pin:ident, NWE, $af:expr) => {
 | 
				
			||||||
 | 
					        impl_pin!($pin, NWEPin, NWE, $af);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ($inst:ident, fmc, FMC, $pin:ident, Clk, $af:expr) => {
 | 
				
			||||||
 | 
					        impl_pin!($pin, ClkPin, CLK, $af);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ($inst:ident, fmc, FMC, $pin:ident, BA0, $af:expr) => {
 | 
				
			||||||
 | 
					        impl_pin!($pin, BA0Pin, BA0, $af);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ($inst:ident, fmc, FMC, $pin:ident, BA1, $af:expr) => {
 | 
				
			||||||
 | 
					        impl_pin!($pin, BA1Pin, BA1, $af);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					);
 | 
				
			||||||
@ -36,6 +36,8 @@ pub mod dcmi;
 | 
				
			|||||||
pub mod eth;
 | 
					pub mod eth;
 | 
				
			||||||
#[cfg(feature = "exti")]
 | 
					#[cfg(feature = "exti")]
 | 
				
			||||||
pub mod exti;
 | 
					pub mod exti;
 | 
				
			||||||
 | 
					#[cfg(fmc)]
 | 
				
			||||||
 | 
					pub mod fmc;
 | 
				
			||||||
#[cfg(i2c)]
 | 
					#[cfg(i2c)]
 | 
				
			||||||
pub mod i2c;
 | 
					pub mod i2c;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -77,7 +77,6 @@ pub struct Config {
 | 
				
			|||||||
    pub bypass_hse: bool,
 | 
					    pub bypass_hse: bool,
 | 
				
			||||||
    pub sys_ck: Option<Hertz>,
 | 
					    pub sys_ck: Option<Hertz>,
 | 
				
			||||||
    pub per_ck: Option<Hertz>,
 | 
					    pub per_ck: Option<Hertz>,
 | 
				
			||||||
    rcc_hclk: Option<Hertz>,
 | 
					 | 
				
			||||||
    pub hclk: Option<Hertz>,
 | 
					    pub hclk: Option<Hertz>,
 | 
				
			||||||
    pub pclk1: Option<Hertz>,
 | 
					    pub pclk1: Option<Hertz>,
 | 
				
			||||||
    pub pclk2: Option<Hertz>,
 | 
					    pub pclk2: Option<Hertz>,
 | 
				
			||||||
@ -526,7 +525,7 @@ pub(crate) unsafe fn init(mut config: Config) {
 | 
				
			|||||||
    };
 | 
					    };
 | 
				
			||||||
    assert!(sys_d1cpre_ck <= sys_d1cpre_ck_max);
 | 
					    assert!(sys_d1cpre_ck <= sys_d1cpre_ck_max);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    let rcc_hclk = config.rcc_hclk.map(|v| v.0).unwrap_or(sys_d1cpre_ck / 2);
 | 
					    let rcc_hclk = config.hclk.map(|v| v.0).unwrap_or(sys_d1cpre_ck / 2);
 | 
				
			||||||
    assert!(rcc_hclk <= rcc_hclk_max);
 | 
					    assert!(rcc_hclk <= rcc_hclk_max);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Estimate divisor
 | 
					    // Estimate divisor
 | 
				
			||||||
 | 
				
			|||||||
@ -9,7 +9,7 @@ resolver = "2"
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
[dependencies]
 | 
					[dependencies]
 | 
				
			||||||
embassy = { version = "0.1.0", path = "../../embassy", features = ["defmt"] }
 | 
					embassy = { version = "0.1.0", path = "../../embassy", features = ["defmt"] }
 | 
				
			||||||
embassy-stm32 = { version = "0.1.0", path = "../../embassy-stm32", features = ["defmt", "stm32h743zi", "net", "time-driver-any", "exti", "unstable-pac", "unstable-traits"] }
 | 
					embassy-stm32 = { version = "0.1.0", path = "../../embassy-stm32", features = ["defmt", "stm32h743bi", "net", "time-driver-any", "exti", "unstable-pac", "unstable-traits"] }
 | 
				
			||||||
embassy-net = { path = "../../embassy-net", default-features = false, features = ["defmt", "tcp", "medium-ethernet", "pool-16"] }
 | 
					embassy-net = { path = "../../embassy-net", default-features = false, features = ["defmt", "tcp", "medium-ethernet", "pool-16"] }
 | 
				
			||||||
embassy-hal-common = { path = "../../embassy-hal-common", default-features = false, features = ["defmt"] }
 | 
					embassy-hal-common = { path = "../../embassy-hal-common", default-features = false, features = ["defmt"] }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -26,6 +26,7 @@ heapless = { version = "0.7.5", default-features = false }
 | 
				
			|||||||
rand_core = "0.6.3"
 | 
					rand_core = "0.6.3"
 | 
				
			||||||
critical-section = "0.2.5"
 | 
					critical-section = "0.2.5"
 | 
				
			||||||
micromath = "2.0.0"
 | 
					micromath = "2.0.0"
 | 
				
			||||||
 | 
					stm32-fmc = "0.2.4"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[dependencies.smoltcp]
 | 
					[dependencies.smoltcp]
 | 
				
			||||||
version = "0.8.0"
 | 
					version = "0.8.0"
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										204
									
								
								examples/stm32h7/src/bin/fmc.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										204
									
								
								examples/stm32h7/src/bin/fmc.rs
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,204 @@
 | 
				
			|||||||
 | 
					#![no_std]
 | 
				
			||||||
 | 
					#![no_main]
 | 
				
			||||||
 | 
					#![feature(type_alias_impl_trait)]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#[path = "../example_common.rs"]
 | 
				
			||||||
 | 
					mod example_common;
 | 
				
			||||||
 | 
					use embassy::executor::Spawner;
 | 
				
			||||||
 | 
					use embassy::time::{Delay, Duration, Timer};
 | 
				
			||||||
 | 
					use embassy_stm32::fmc::Fmc;
 | 
				
			||||||
 | 
					use embassy_stm32::Peripherals;
 | 
				
			||||||
 | 
					use example_common::*;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#[embassy::main(config = "config()")]
 | 
				
			||||||
 | 
					async fn main(_spawner: Spawner, p: Peripherals) {
 | 
				
			||||||
 | 
					    info!("Hello World!");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let mut core_peri = cortex_m::Peripherals::take().unwrap();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // taken from stm32h7xx-hal
 | 
				
			||||||
 | 
					    core_peri.SCB.enable_icache();
 | 
				
			||||||
 | 
					    // See Errata Sheet 2.2.1
 | 
				
			||||||
 | 
					    // core_peri.SCB.enable_dcache(&mut core_peri.CPUID);
 | 
				
			||||||
 | 
					    core_peri.DWT.enable_cycle_counter();
 | 
				
			||||||
 | 
					    // ----------------------------------------------------------
 | 
				
			||||||
 | 
					    // Configure MPU for external SDRAM
 | 
				
			||||||
 | 
					    // MPU config for SDRAM write-through
 | 
				
			||||||
 | 
					    let sdram_size = 32 * 1024 * 1024;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        let mpu = core_peri.MPU;
 | 
				
			||||||
 | 
					        let scb = &mut core_peri.SCB;
 | 
				
			||||||
 | 
					        let size = sdram_size;
 | 
				
			||||||
 | 
					        // Refer to ARM®v7-M Architecture Reference Manual ARM DDI 0403
 | 
				
			||||||
 | 
					        // Version E.b Section B3.5
 | 
				
			||||||
 | 
					        const MEMFAULTENA: u32 = 1 << 16;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        unsafe {
 | 
				
			||||||
 | 
					            /* Make sure outstanding transfers are done */
 | 
				
			||||||
 | 
					            cortex_m::asm::dmb();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            scb.shcsr.modify(|r| r & !MEMFAULTENA);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            /* Disable the MPU and clear the control register*/
 | 
				
			||||||
 | 
					            mpu.ctrl.write(0);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        const REGION_NUMBER0: u32 = 0x00;
 | 
				
			||||||
 | 
					        const REGION_BASE_ADDRESS: u32 = 0xD000_0000;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        const REGION_FULL_ACCESS: u32 = 0x03;
 | 
				
			||||||
 | 
					        const REGION_CACHEABLE: u32 = 0x01;
 | 
				
			||||||
 | 
					        const REGION_WRITE_BACK: u32 = 0x01;
 | 
				
			||||||
 | 
					        const REGION_ENABLE: u32 = 0x01;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        crate::assert_eq!(
 | 
				
			||||||
 | 
					            size & (size - 1),
 | 
				
			||||||
 | 
					            0,
 | 
				
			||||||
 | 
					            "SDRAM memory region size must be a power of 2"
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					        crate::assert_eq!(
 | 
				
			||||||
 | 
					            size & 0x1F,
 | 
				
			||||||
 | 
					            0,
 | 
				
			||||||
 | 
					            "SDRAM memory region size must be 32 bytes or more"
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					        fn log2minus1(sz: u32) -> u32 {
 | 
				
			||||||
 | 
					            for i in 5..=31 {
 | 
				
			||||||
 | 
					                if sz == (1 << i) {
 | 
				
			||||||
 | 
					                    return i - 1;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            crate::panic!("Unknown SDRAM memory region size!");
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        //info!("SDRAM Memory Size 0x{:x}", log2minus1(size as u32));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Configure region 0
 | 
				
			||||||
 | 
					        //
 | 
				
			||||||
 | 
					        // Cacheable, outer and inner write-back, no write allocate. So
 | 
				
			||||||
 | 
					        // reads are cached, but writes always write all the way to SDRAM
 | 
				
			||||||
 | 
					        unsafe {
 | 
				
			||||||
 | 
					            mpu.rnr.write(REGION_NUMBER0);
 | 
				
			||||||
 | 
					            mpu.rbar.write(REGION_BASE_ADDRESS);
 | 
				
			||||||
 | 
					            mpu.rasr.write(
 | 
				
			||||||
 | 
					                (REGION_FULL_ACCESS << 24)
 | 
				
			||||||
 | 
					                    | (REGION_CACHEABLE << 17)
 | 
				
			||||||
 | 
					                    | (REGION_WRITE_BACK << 16)
 | 
				
			||||||
 | 
					                    | (log2minus1(size as u32) << 1)
 | 
				
			||||||
 | 
					                    | REGION_ENABLE,
 | 
				
			||||||
 | 
					            );
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        const MPU_ENABLE: u32 = 0x01;
 | 
				
			||||||
 | 
					        const MPU_DEFAULT_MMAP_FOR_PRIVILEGED: u32 = 0x04;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Enable
 | 
				
			||||||
 | 
					        unsafe {
 | 
				
			||||||
 | 
					            mpu.ctrl
 | 
				
			||||||
 | 
					                .modify(|r| r | MPU_DEFAULT_MMAP_FOR_PRIVILEGED | MPU_ENABLE);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            scb.shcsr.modify(|r| r | MEMFAULTENA);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            // Ensure MPU settings take effect
 | 
				
			||||||
 | 
					            cortex_m::asm::dsb();
 | 
				
			||||||
 | 
					            cortex_m::asm::isb();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let mut sdram = Fmc::sdram_a12bits_d32bits_4banks_bank2(
 | 
				
			||||||
 | 
					        p.FMC,
 | 
				
			||||||
 | 
					        // A0-A11
 | 
				
			||||||
 | 
					        p.PF0,
 | 
				
			||||||
 | 
					        p.PF1,
 | 
				
			||||||
 | 
					        p.PF2,
 | 
				
			||||||
 | 
					        p.PF3,
 | 
				
			||||||
 | 
					        p.PF4,
 | 
				
			||||||
 | 
					        p.PF5,
 | 
				
			||||||
 | 
					        p.PF12,
 | 
				
			||||||
 | 
					        p.PF13,
 | 
				
			||||||
 | 
					        p.PF14,
 | 
				
			||||||
 | 
					        p.PF15,
 | 
				
			||||||
 | 
					        p.PG0,
 | 
				
			||||||
 | 
					        p.PG1,
 | 
				
			||||||
 | 
					        // BA0-BA1
 | 
				
			||||||
 | 
					        p.PG4,
 | 
				
			||||||
 | 
					        p.PG5,
 | 
				
			||||||
 | 
					        // D0-D31
 | 
				
			||||||
 | 
					        p.PD14,
 | 
				
			||||||
 | 
					        p.PD15,
 | 
				
			||||||
 | 
					        p.PD0,
 | 
				
			||||||
 | 
					        p.PD1,
 | 
				
			||||||
 | 
					        p.PE7,
 | 
				
			||||||
 | 
					        p.PE8,
 | 
				
			||||||
 | 
					        p.PE9,
 | 
				
			||||||
 | 
					        p.PE10,
 | 
				
			||||||
 | 
					        p.PE11,
 | 
				
			||||||
 | 
					        p.PE12,
 | 
				
			||||||
 | 
					        p.PE13,
 | 
				
			||||||
 | 
					        p.PE14,
 | 
				
			||||||
 | 
					        p.PE15,
 | 
				
			||||||
 | 
					        p.PD8,
 | 
				
			||||||
 | 
					        p.PD9,
 | 
				
			||||||
 | 
					        p.PD10,
 | 
				
			||||||
 | 
					        p.PH8,
 | 
				
			||||||
 | 
					        p.PH9,
 | 
				
			||||||
 | 
					        p.PH10,
 | 
				
			||||||
 | 
					        p.PH11,
 | 
				
			||||||
 | 
					        p.PH12,
 | 
				
			||||||
 | 
					        p.PH13,
 | 
				
			||||||
 | 
					        p.PH14,
 | 
				
			||||||
 | 
					        p.PH15,
 | 
				
			||||||
 | 
					        p.PI0,
 | 
				
			||||||
 | 
					        p.PI1,
 | 
				
			||||||
 | 
					        p.PI2,
 | 
				
			||||||
 | 
					        p.PI3,
 | 
				
			||||||
 | 
					        p.PI6,
 | 
				
			||||||
 | 
					        p.PI7,
 | 
				
			||||||
 | 
					        p.PI9,
 | 
				
			||||||
 | 
					        p.PI10,
 | 
				
			||||||
 | 
					        // NBL0 - NBL3
 | 
				
			||||||
 | 
					        p.PE0,
 | 
				
			||||||
 | 
					        p.PE1,
 | 
				
			||||||
 | 
					        p.PI4,
 | 
				
			||||||
 | 
					        p.PI5,
 | 
				
			||||||
 | 
					        p.PH7,  // SDCKE1
 | 
				
			||||||
 | 
					        p.PG8,  // SDCLK
 | 
				
			||||||
 | 
					        p.PG15, // SDNCAS
 | 
				
			||||||
 | 
					        p.PH6,  // SDNE1 (!CS)
 | 
				
			||||||
 | 
					        p.PF11, // SDRAS
 | 
				
			||||||
 | 
					        p.PC0,  // SDNWE, change to p.PH5 for EVAL boards
 | 
				
			||||||
 | 
					        stm32_fmc::devices::is42s32800g_6::Is42s32800g {},
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let mut delay = Delay;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let ram_slice = unsafe {
 | 
				
			||||||
 | 
					        // Initialise controller and SDRAM
 | 
				
			||||||
 | 
					        let ram_ptr: *mut u32 = sdram.init(&mut delay) as *mut _;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Convert raw pointer to slice
 | 
				
			||||||
 | 
					        core::slice::from_raw_parts_mut(ram_ptr, sdram_size / core::mem::size_of::<u32>())
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // // ----------------------------------------------------------
 | 
				
			||||||
 | 
					    // // Use memory in SDRAM
 | 
				
			||||||
 | 
					    info!("RAM contents before writing: {:x}", ram_slice[..10]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ram_slice[0] = 1;
 | 
				
			||||||
 | 
					    ram_slice[1] = 2;
 | 
				
			||||||
 | 
					    ram_slice[2] = 3;
 | 
				
			||||||
 | 
					    ram_slice[3] = 4;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    info!("RAM contents after writing: {:x}", ram_slice[..10]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    crate::assert_eq!(ram_slice[0], 1);
 | 
				
			||||||
 | 
					    crate::assert_eq!(ram_slice[1], 2);
 | 
				
			||||||
 | 
					    crate::assert_eq!(ram_slice[2], 3);
 | 
				
			||||||
 | 
					    crate::assert_eq!(ram_slice[3], 4);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    info!("Assertions succeeded.");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    loop {
 | 
				
			||||||
 | 
					        Timer::after(Duration::from_millis(1000)).await;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -22,6 +22,7 @@ defmt::timestamp! {"{=u64}", {
 | 
				
			|||||||
pub fn config() -> Config {
 | 
					pub fn config() -> Config {
 | 
				
			||||||
    let mut config = Config::default();
 | 
					    let mut config = Config::default();
 | 
				
			||||||
    config.rcc.sys_ck = Some(400.mhz().into());
 | 
					    config.rcc.sys_ck = Some(400.mhz().into());
 | 
				
			||||||
 | 
					    config.rcc.hclk = Some(200.mhz().into());
 | 
				
			||||||
    config.rcc.pll1.q_ck = Some(100.mhz().into());
 | 
					    config.rcc.pll1.q_ck = Some(100.mhz().into());
 | 
				
			||||||
    config
 | 
					    config
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user