Skip to content

Commit 84f63b5

Browse files
committed
F4 GPIO
1 parent d76ab4c commit 84f63b5

File tree

9 files changed

+3204
-766
lines changed

9 files changed

+3204
-766
lines changed

.vscode/settings.json

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
{
22
"rust-analyzer.check.allTargets": false,
3-
"rust-analyzer.check.extraArgs": [
4-
"--examples",
5-
],
3+
"rust-analyzer.check.extraArgs": ["--examples"],
64
"rust-analyzer.cargo.target": "thumbv7em-none-eabihf",
75
"rust-analyzer.cargo.features": [
86
"stm32g484",

Cargo.toml

Lines changed: 217 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -80,19 +80,225 @@ rt = ["stm32g4/rt"]
8080
usb = ["dep:stm32-usbd"]
8181
stm32g431 = ["stm32g4/stm32g431", "cat2"]
8282
stm32g441 = ["stm32g4/stm32g441", "cat2"]
83-
stm32g473 = ["stm32g4/stm32g473", "cat3", "adc3", "adc4", "adc5"]
84-
stm32g474 = ["stm32g4/stm32g474", "cat3", "adc3", "adc4", "adc5"]
85-
stm32g483 = ["stm32g4/stm32g483", "cat3", "adc3", "adc4", "adc5"]
86-
stm32g484 = ["stm32g4/stm32g484", "cat3", "adc3", "adc4", "adc5"]
87-
stm32g491 = ["stm32g4/stm32g491", "cat4", "adc3"]
88-
stm32g4a1 = ["stm32g4/stm32g4a1", "cat4", "adc3"]
83+
stm32g473 = ["stm32g4/stm32g473", "cat3"]
84+
stm32g474 = ["stm32g4/stm32g474", "cat3"]
85+
stm32g483 = ["stm32g4/stm32g483", "cat3"]
86+
stm32g484 = ["stm32g4/stm32g484", "cat3"]
87+
stm32g491 = ["stm32g4/stm32g491", "cat4"]
88+
stm32g4a1 = ["stm32g4/stm32g4a1", "cat4"]
8989

90+
gpio-g43x = [
91+
"comp1",
92+
"comp2",
93+
"comp3",
94+
"comp4",
95+
"crs",
96+
"fdcan1",
97+
"gpioa",
98+
"gpiob",
99+
"gpioc",
100+
"gpiod",
101+
"gpioe",
102+
"gpiof",
103+
"gpiog",
104+
"i2c1",
105+
"i2c2",
106+
"i2c3",
107+
"i2s",
108+
"i2s2",
109+
"i2s3",
110+
"ir",
111+
"lptim1",
112+
"lpuart1",
113+
"rcc",
114+
"rtc",
115+
"sai1",
116+
"spi1",
117+
"spi2",
118+
"spi3",
119+
"sys",
120+
"tim1",
121+
"tim15",
122+
"tim16",
123+
"tim17",
124+
"tim2",
125+
"tim3",
126+
"tim4",
127+
"tim8",
128+
"uart4",
129+
"ucpd1",
130+
"usart1",
131+
"usart2",
132+
"usart3",
133+
]
134+
gpio-g47x = [
135+
"adc3",
136+
"adc4",
137+
"adc5",
138+
"comp1",
139+
"comp2",
140+
"comp3",
141+
"comp4",
142+
"comp5",
143+
"comp6",
144+
"comp7",
145+
"crs",
146+
"fdcan1",
147+
"fdcan2",
148+
"fdcan3",
149+
"fmc",
150+
"gpioa",
151+
"gpiob",
152+
"gpioc",
153+
"gpiod",
154+
"gpioe",
155+
"gpiof",
156+
"gpiog",
157+
"hrtim1",
158+
"i2c1",
159+
"i2c2",
160+
"i2c3",
161+
"i2c4",
162+
"i2s",
163+
"i2s2",
164+
"i2s3",
165+
"ir",
166+
"lptim1",
167+
"lpuart1",
168+
"quadspi1",
169+
"rcc",
170+
"rtc",
171+
"sai1",
172+
"spi1",
173+
"spi2",
174+
"spi3",
175+
"spi4",
176+
"sys",
177+
"tim1",
178+
"tim15",
179+
"tim16",
180+
"tim17",
181+
"tim2",
182+
"tim20",
183+
"tim3",
184+
"tim4",
185+
"tim5",
186+
"tim8",
187+
"uart4",
188+
"uart5",
189+
"ucpd1",
190+
"usart1",
191+
"usart2",
192+
"usart3",
193+
]
194+
gpio-g49x = [
195+
"adc3",
196+
"comp1",
197+
"comp2",
198+
"comp3",
199+
"comp4",
200+
"crs",
201+
"fdcan1",
202+
"fdcan2",
203+
"gpioa",
204+
"gpiob",
205+
"gpioc",
206+
"gpiod",
207+
"gpioe",
208+
"gpiof",
209+
"gpiog",
210+
"i2c1",
211+
"i2c2",
212+
"i2c3",
213+
"i2s",
214+
"i2s2",
215+
"i2s3",
216+
"ir",
217+
"lptim1",
218+
"lpuart1",
219+
"quadspi1",
220+
"rcc",
221+
"rtc",
222+
"sai1",
223+
"spi1",
224+
"spi2",
225+
"spi3",
226+
"sys",
227+
"tim1",
228+
"tim15",
229+
"tim16",
230+
"tim17",
231+
"tim2",
232+
"tim20",
233+
"tim3",
234+
"tim4",
235+
"tim8",
236+
"uart4",
237+
"uart5",
238+
"ucpd1",
239+
"usart1",
240+
"usart2",
241+
"usart3",
242+
]
90243

91-
gpio-g43x = []
92-
93-
gpio-g47x = []
94-
95-
gpio-g49x = []
244+
adc3 = []
245+
adc4 = []
246+
adc5 = []
247+
comp1 = []
248+
comp2 = []
249+
comp3 = []
250+
comp4 = []
251+
comp5 = []
252+
comp6 = []
253+
comp7 = []
254+
crs = []
255+
fdcan1 = []
256+
fdcan2 = []
257+
fdcan3 = []
258+
fmc = []
259+
gpioa = []
260+
gpiob = []
261+
gpioc = []
262+
gpiod = []
263+
gpioe = []
264+
gpiof = []
265+
gpiog = []
266+
hrtim1 = []
267+
i2c1 = []
268+
i2c2 = []
269+
i2c3 = []
270+
i2c4 = []
271+
i2s = []
272+
i2s2 = []
273+
i2s3 = []
274+
ir = []
275+
lptim1 = []
276+
lpuart1 = []
277+
quadspi1 = []
278+
rcc = []
279+
rtc = []
280+
sai1 = []
281+
spi1 = []
282+
spi2 = []
283+
spi3 = []
284+
spi4 = []
285+
sys = []
286+
tim1 = []
287+
tim15 = []
288+
tim16 = []
289+
tim17 = []
290+
tim2 = []
291+
tim20 = []
292+
tim3 = []
293+
tim4 = []
294+
tim5 = []
295+
tim8 = []
296+
uart4 = []
297+
uart5 = []
298+
ucpd1 = []
299+
usart1 = []
300+
usart2 = []
301+
usart3 = []
96302

97303
log-itm = ["cortex-m-log/itm"]
98304
log-rtt = []
@@ -106,9 +312,6 @@ defmt = [
106312
"embedded-io/defmt-03",
107313
]
108314
cordic = ["dep:fixed"]
109-
adc3 = []
110-
adc4 = []
111-
adc5 = []
112315

113316
# Device category
114317
cat2 = ["gpio-g43x"]

examples/i2c.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,13 @@ fn main() -> ! {
2222
let mut rcc = dp.RCC.constrain();
2323
let gpiob = dp.GPIOB.split(&mut rcc);
2424

25-
let sda = gpiob.pb9.into_alternate_open_drain();
26-
let scl = gpiob.pb8.into_alternate_open_drain();
25+
let sda = gpiob.pb9;
26+
let scl = gpiob.pb8;
2727

2828
let mut i2c = dp.I2C1.i2c(sda, scl, 40.kHz(), &mut rcc);
2929
// Alternatively, it is possible to specify the exact timing as follows (see the documentation
3030
// of with_timing() for an explanation of the constant):
31+
//use hal::i2c::Config;
3132
//let mut i2c = dp
3233
// .I2C1
3334
// .i2c(sda, scl, Config::with_timing(0x3042_0f13), &mut rcc);

examples/spi-dma.rs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66

77
use crate::hal::{
88
delay::DelayFromCountDownTimer,
9-
gpio::{AF5, PA5, PA6, PA7},
109
prelude::*,
1110
pwr::PwrExt,
1211
rcc::Config,
@@ -40,9 +39,9 @@ fn main() -> ! {
4039
let mut delay_tim2 = DelayFromCountDownTimer::new(timer2.start_count_down(100.millis()));
4140

4241
let gpioa = dp.GPIOA.split(&mut rcc);
43-
let sclk: PA5<AF5> = gpioa.pa5.into_alternate();
44-
let miso: PA6<AF5> = gpioa.pa6.into_alternate();
45-
let mosi: PA7<AF5> = gpioa.pa7.into_alternate();
42+
let sclk = gpioa.pa5;
43+
let miso = gpioa.pa6;
44+
let mosi = gpioa.pa7;
4645

4746
let spi = dp
4847
.SPI1

src/gpio.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ use core::marker::PhantomData;
5858

5959
use crate::pac;
6060
use crate::rcc::Rcc;
61+
pub mod alt;
6162
mod convert;
6263
pub use convert::PinMode;
6364
mod partially_erased;
@@ -172,6 +173,8 @@ pub(crate) mod marker {
172173
/// Marker trait for active pin modes
173174
pub trait Active {}
174175
/// Marker trait for all pin modes except alternate
176+
pub trait NotAlt {}
177+
/// Marker trait for pins with alternate function `A` mapping
175178
pub trait IntoAf<const A: u8> {}
176179
}
177180

@@ -186,6 +189,9 @@ impl<Otype> marker::OutputSpeed for Output<Otype> {}
186189
impl<const A: u8, Otype> marker::OutputSpeed for Alternate<A, Otype> {}
187190
impl<Otype> marker::Active for Output<Otype> {}
188191
impl<const A: u8, Otype> marker::Active for Alternate<A, Otype> {}
192+
impl marker::NotAlt for Input {}
193+
impl<Otype> marker::NotAlt for Output<Otype> {}
194+
impl marker::NotAlt for Analog {}
189195

190196
/// GPIO Pin speed selection
191197
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
@@ -623,9 +629,13 @@ const fn gpiox<const P: char>() -> *const crate::pac::gpioa::RegisterBlock {
623629
'A' => crate::pac::GPIOA::ptr(),
624630
'B' => crate::pac::GPIOB::ptr() as _,
625631
'C' => crate::pac::GPIOC::ptr() as _,
632+
#[cfg(feature = "gpiod")]
626633
'D' => crate::pac::GPIOD::ptr() as _,
634+
#[cfg(feature = "gpioe")]
627635
'E' => crate::pac::GPIOE::ptr() as _,
636+
#[cfg(feature = "gpiof")]
628637
'F' => crate::pac::GPIOF::ptr() as _,
638+
#[cfg(feature = "gpiog")]
629639
'G' => crate::pac::GPIOG::ptr() as _,
630640
_ => panic!("Unknown GPIO port"),
631641
}

0 commit comments

Comments
 (0)