Skip to content

Commit 684a1cf

Browse files
committed
stm32-fmc
1 parent c7e840b commit 684a1cf

File tree

5 files changed

+212
-2
lines changed

5 files changed

+212
-2
lines changed

Cargo.toml

+2
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,8 @@ embedded-hal-async = { version = "1.0", optional = true }
5656
rtic = { version = "2.0.1", features = ["thumbv7-backend"], optional = true }
5757
atomic-polyfill = { version = "1.0.3", optional = true }
5858

59+
stm32-fmc = { version = "0.3.0", optional = true }
60+
5961
enumflags2 = "0.7.8"
6062
embedded-storage = "0.3"
6163
vcell = "0.1.3"

src/fmc.rs

+202
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,202 @@
1+
//! HAL for Flexible memory controller (FMC)
2+
//!
3+
//! See the stm32-fmc [usage guide](https://github.com/stm32-rs/stm32-fmc#usage)
4+
5+
// From stm32_fmc
6+
7+
use stm32_fmc::FmcPeripheral;
8+
use stm32_fmc::{AddressPinSet, PinsSdram, Sdram, SdramChip, SdramPinSet, SdramTargetBank};
9+
10+
use crate::pac;
11+
use crate::rcc::{BusClock, Clocks, Enable, Reset};
12+
use fugit::HertzU32 as Hertz;
13+
14+
use crate::gpio::alt::fmc as alt;
15+
16+
/// Storage type for Flexible Memory Controller and its clocks
17+
pub struct FMC {
18+
pub fmc: pac::FMC,
19+
hclk: Hertz,
20+
}
21+
22+
/// Extension trait for FMC controller
23+
pub trait FmcExt: Sized {
24+
fn fmc(self, clocks: &Clocks) -> FMC;
25+
26+
/// A new SDRAM memory via the Flexible Memory Controller
27+
fn sdram<
28+
BANK: SdramPinSet,
29+
ADDR: AddressPinSet,
30+
PINS: PinsSdram<BANK, ADDR>,
31+
CHIP: SdramChip,
32+
>(
33+
self,
34+
pins: PINS,
35+
chip: CHIP,
36+
clocks: &Clocks,
37+
) -> Sdram<FMC, CHIP> {
38+
let fmc = self.fmc(clocks);
39+
Sdram::new(fmc, pins, chip)
40+
}
41+
42+
/// A new SDRAM memory via the Flexible Memory Controller
43+
fn sdram_unchecked<CHIP: SdramChip, BANK: Into<SdramTargetBank>>(
44+
self,
45+
bank: BANK,
46+
chip: CHIP,
47+
clocks: &Clocks,
48+
) -> Sdram<FMC, CHIP> {
49+
let fmc = self.fmc(clocks);
50+
Sdram::new_unchecked(fmc, bank, chip)
51+
}
52+
}
53+
54+
impl FmcExt for pac::FMC {
55+
/// New FMC instance
56+
fn fmc(self, clocks: &Clocks) -> FMC {
57+
FMC {
58+
fmc: self,
59+
hclk: pac::FMC::clock(clocks),
60+
}
61+
}
62+
}
63+
64+
unsafe impl FmcPeripheral for FMC {
65+
const REGISTERS: *const () = pac::FMC::ptr() as *const ();
66+
67+
fn enable(&mut self) {
68+
// TODO : change it to something safe ...
69+
unsafe {
70+
// Enable FMC
71+
pac::FMC::enable_unchecked();
72+
// Reset FMC
73+
pac::FMC::reset_unchecked();
74+
}
75+
}
76+
77+
fn source_clock_hz(&self) -> u32 {
78+
// FMC block is clocked by HCLK
79+
self.hclk.raw()
80+
}
81+
}
82+
83+
macro_rules! pins {
84+
($($F:ident: $P:ident;)+) => {
85+
$(
86+
impl stm32_fmc::$F for alt::$P {}
87+
)+
88+
}
89+
}
90+
91+
pins! {
92+
A0: A0;
93+
A1: A1;
94+
A2: A2;
95+
A3: A3;
96+
A4: A4;
97+
A5: A5;
98+
A6: A6;
99+
A7: A7;
100+
A8: A8;
101+
A9: A9;
102+
A10: A10;
103+
A11: A11;
104+
A12: A12;
105+
A13: A13;
106+
A14: A14;
107+
A15: A15;
108+
A16: A16;
109+
A17: A17;
110+
A18: A18;
111+
A19: A19;
112+
A20: A20;
113+
A21: A21;
114+
A22: A22;
115+
A23: A23;
116+
A24: A24;
117+
CLK: Clk;
118+
D0: D0;
119+
D1: D1;
120+
D2: D2;
121+
D3: D3;
122+
D4: D4;
123+
D5: D5;
124+
D6: D6;
125+
D7: D7;
126+
D8: D8;
127+
D9: D9;
128+
D10: D10;
129+
D11: D11;
130+
D12: D12;
131+
D13: D13;
132+
D14: D14;
133+
D15: D15;
134+
DA0: Da0;
135+
DA1: Da1;
136+
DA2: Da2;
137+
DA3: Da3;
138+
DA4: Da4;
139+
DA5: Da5;
140+
DA6: Da6;
141+
DA7: Da7;
142+
DA8: Da8;
143+
DA9: Da9;
144+
DA10: Da10;
145+
DA11: Da11;
146+
DA12: Da12;
147+
DA13: Da13;
148+
DA14: Da14;
149+
DA15: Da15;
150+
NBL0: Nbl0;
151+
NBL1: Nbl1;
152+
// NCE: Nce;
153+
NE1: Ne1;
154+
NE2: Ne2;
155+
NE3: Ne3;
156+
NE4: Ne4;
157+
NL: Nl;
158+
NOE: Noe;
159+
NWAIT: Nwait;
160+
NWE: Nwe;
161+
}
162+
163+
#[cfg(any(feature = "gpio-f427", feature = "gpio-f446", feature = "gpio-f469"))]
164+
pins! {
165+
BA0: Ba0;
166+
BA1: Ba1;
167+
SDCKE0: Sdcke0;
168+
SDCKE1: Sdcke1;
169+
SDCLK: Sdclk;
170+
SDNCAS: Sdncas;
171+
SDNE0: Sdne0;
172+
SDNE1: Sdne1;
173+
SDNRAS: Sdnras;
174+
SDNWE: Sdnwe;
175+
}
176+
177+
#[cfg(any(feature = "gpio-f427", feature = "gpio-f469"))]
178+
pins! {
179+
D16: D16;
180+
D17: D17;
181+
D18: D18;
182+
D19: D19;
183+
D20: D20;
184+
D21: D21;
185+
D22: D22;
186+
D23: D23;
187+
D24: D24;
188+
D25: D25;
189+
D26: D26;
190+
D27: D27;
191+
D28: D28;
192+
D29: D29;
193+
D30: D30;
194+
D31: D31;
195+
NBL2: Nbl2;
196+
NBL3: Nbl3;
197+
}
198+
199+
#[cfg(feature = "gpio-f469")]
200+
pins! {
201+
INT: Int;
202+
}

src/fsmc_lcd/pins.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
1818
use core::marker::PhantomData;
1919

20-
use crate::gpio::alt::fsmc as alt;
20+
use crate::gpio::alt::fmc as alt;
2121

2222
use super::sealed;
2323
use super::{Lcd, SubBank1, Word};

src/gpio/alt/f4.rs

+4-1
Original file line numberDiff line numberDiff line change
@@ -633,9 +633,12 @@ pub mod eth {
633633
}
634634
}
635635

636+
#[cfg(any(feature = "fmc", feature = "fsmc"))]
637+
pub use fmc as fsmc;
638+
636639
/// Pins available on all STM32F4 models that have an FSMC/FMC
637640
#[cfg(any(feature = "fmc", feature = "fsmc"))]
638-
pub mod fsmc {
641+
pub mod fmc {
639642
use super::*;
640643

641644
pub use Ne1 as ChipSelect1;

src/lib.rs

+3
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,9 @@ pub mod rng;
107107
pub mod dma;
108108
pub mod dwt;
109109
pub mod flash;
110+
#[cfg(any(feature = "fmc", feature = "fsmc"))]
111+
#[cfg(feature = "stm32-fmc")]
112+
pub mod fmc;
110113
#[cfg(all(feature = "fsmc_lcd", any(feature = "fmc", feature = "fsmc")))]
111114
pub mod fsmc_lcd;
112115
#[cfg(all(feature = "dma2d", feature = "ltdc"))]

0 commit comments

Comments
 (0)