Skip to content

Commit bf14d7b

Browse files
authored
Merge pull request #61 from hellow554/af15
replace af implementation
2 parents 222dbd3 + 40bcbdd commit bf14d7b

File tree

1 file changed

+53
-191
lines changed

1 file changed

+53
-191
lines changed

src/gpio.rs

Lines changed: 53 additions & 191 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,37 @@ pub struct AF14;
9898
/// Alternate function 15 (type state)
9999
pub struct AF15;
100100

101+
macro_rules! doc_comment {
102+
($x:expr, $($tt:tt)*) => {
103+
#[doc = $x]
104+
$($tt)*
105+
};
106+
}
107+
108+
macro_rules! impl_into_af {
109+
($PXi:ident $AFR:ident $i:expr, $(($AF:ident, $NUM:expr, $NAME:ident));* $(;)?) => {
110+
$(
111+
doc_comment! {
112+
concat!("Configures the pin to serve as alternate function ", stringify!($NUM), " (", stringify!($AF), ")"),
113+
pub fn $NAME(self, moder: &mut MODER, afr: &mut $AFR) -> $PXi<Alternate<$AF, MODE>> {
114+
const OFF_MODE: u32 = 2 * $i;
115+
const OFF_AFR: u32 = 4 * ($i % 8);
116+
const MODE: u32 = 0b10; // alternate function mode
117+
118+
moder.moder().modify(|r, w| unsafe {
119+
w.bits((r.bits() & !(0b11 << OFF_MODE)) | (MODE << OFF_MODE))
120+
});
121+
afr.afr().modify(|r, w| unsafe {
122+
w.bits((r.bits() & !(0b1111 << OFF_AFR)) | ($NUM << OFF_AFR))
123+
});
124+
125+
$PXi { _mode: PhantomData }
126+
}
127+
}
128+
)*
129+
}
130+
}
131+
101132
macro_rules! gpio {
102133
($GPIOX:ident, $gpiox:ident, $gpioy:ident, $iopxenr:ident, $iopxrst:ident, $PXx:ident, [
103134
$($PXi:ident: ($pxi:ident, $i:expr, $MODE:ty, $AFR:ident),)+
@@ -112,7 +143,7 @@ macro_rules! gpio {
112143
use crate::rcc::AHB2;
113144
use super::{
114145
Alternate,
115-
AF1, AF4, AF5, AF6, AF7, AF8, AF9, AF10,
146+
AF1, AF2, AF3, AF4, AF5, AF6, AF7, AF8, AF9, AF10, AF11, AF12, AF13, AF14, AF15,
116147
Floating, GpioExt, Input, OpenDrain, Output,
117148
PullDown, PullUp, PushPull, State,
118149
};
@@ -173,8 +204,6 @@ macro_rules! gpio {
173204
}
174205

175206
impl AFRH {
176-
// TODO remove `allow`
177-
#[allow(dead_code)]
178207
pub(crate) fn afr(&mut self) -> &$gpioy::AFRH {
179208
unsafe { &(*$GPIOX::ptr()).afrh }
180209
}
@@ -238,194 +267,6 @@ macro_rules! gpio {
238267
}
239268

240269
impl<MODE> $PXi<MODE> {
241-
/// Configures the pin to serve as alternate function 1 (AF1)
242-
pub fn into_af1(
243-
self,
244-
moder: &mut MODER,
245-
afr: &mut $AFR,
246-
) -> $PXi<Alternate<AF1, MODE>> {
247-
let offset = 2 * $i;
248-
249-
// alternate function mode
250-
let mode = 0b10;
251-
moder.moder().modify(|r, w| unsafe {
252-
w.bits((r.bits() & !(0b11 << offset)) | (mode << offset))
253-
});
254-
255-
let af = 1;
256-
let offset = 4 * ($i % 8);
257-
afr.afr().modify(|r, w| unsafe {
258-
w.bits((r.bits() & !(0b1111 << offset)) | (af << offset))
259-
});
260-
261-
$PXi { _mode: PhantomData }
262-
}
263-
264-
/// Configures the pin to serve as alternate function 4 (AF4)
265-
pub fn into_af4(
266-
self,
267-
moder: &mut MODER,
268-
afr: &mut $AFR,
269-
) -> $PXi<Alternate<AF4, MODE>> {
270-
let offset = 2 * $i;
271-
272-
// alternate function mode
273-
let mode = 0b10;
274-
moder.moder().modify(|r, w| unsafe {
275-
w.bits((r.bits() & !(0b11 << offset)) | (mode << offset))
276-
});
277-
278-
let af = 4;
279-
let offset = 4 * ($i % 8);
280-
afr.afr().modify(|r, w| unsafe {
281-
w.bits((r.bits() & !(0b1111 << offset)) | (af << offset))
282-
});
283-
284-
$PXi { _mode: PhantomData }
285-
}
286-
287-
/// Configures the pin to serve as alternate function 5 (AF5)
288-
pub fn into_af5(
289-
self,
290-
moder: &mut MODER,
291-
afr: &mut $AFR,
292-
) -> $PXi<Alternate<AF5, MODE>> {
293-
let offset = 2 * $i;
294-
295-
// alternate function mode
296-
let mode = 0b10;
297-
moder.moder().modify(|r, w| unsafe {
298-
w.bits((r.bits() & !(0b11 << offset)) | (mode << offset))
299-
});
300-
301-
let af = 5;
302-
let offset = 4 * ($i % 8);
303-
afr.afr().modify(|r, w| unsafe {
304-
w.bits((r.bits() & !(0b1111 << offset)) | (af << offset))
305-
});
306-
307-
$PXi { _mode: PhantomData }
308-
}
309-
310-
/// Configures the pin to serve as alternate function 6 (AF6)
311-
pub fn into_af6(
312-
self,
313-
moder: &mut MODER,
314-
afr: &mut $AFR,
315-
) -> $PXi<Alternate<AF6, MODE>> {
316-
let offset = 2 * $i;
317-
318-
// alternate function mode
319-
let mode = 0b10;
320-
moder.moder().modify(|r, w| unsafe {
321-
w.bits((r.bits() & !(0b11 << offset)) | (mode << offset))
322-
});
323-
324-
let af = 6;
325-
let offset = 4 * ($i % 8);
326-
afr.afr().modify(|r, w| unsafe {
327-
w.bits((r.bits() & !(0b1111 << offset)) | (af << offset))
328-
});
329-
330-
$PXi { _mode: PhantomData }
331-
}
332-
333-
/// Configures the pin to serve as alternate function 7 (AF7)
334-
pub fn into_af7(
335-
self,
336-
moder: &mut MODER,
337-
afr: &mut $AFR,
338-
) -> $PXi<Alternate<AF7, MODE>> {
339-
let offset = 2 * $i;
340-
341-
// alternate function mode
342-
let mode = 0b10;
343-
moder.moder().modify(|r, w| unsafe {
344-
w.bits((r.bits() & !(0b11 << offset)) | (mode << offset))
345-
});
346-
347-
let af = 7;
348-
let offset = 4 * ($i % 8);
349-
350-
afr.afr().modify(|r, w| unsafe {
351-
w.bits((r.bits() & !(0b1111 << offset)) | (af << offset))
352-
});
353-
354-
$PXi { _mode: PhantomData }
355-
}
356-
357-
/// Configures the pin to serve as alternate function 8 (AF8)
358-
pub fn into_af8(
359-
self,
360-
moder: &mut MODER,
361-
afr: &mut $AFR,
362-
) -> $PXi<Alternate<AF8, MODE>> {
363-
let offset = 2 * $i;
364-
365-
// alternate function mode
366-
let mode = 0b10;
367-
moder.moder().modify(|r, w| unsafe {
368-
w.bits((r.bits() & !(0b11 << offset)) | (mode << offset))
369-
});
370-
371-
let af = 8;
372-
let offset = 4 * ($i % 8);
373-
374-
afr.afr().modify(|r, w| unsafe {
375-
w.bits((r.bits() & !(0b1111 << offset)) | (af << offset))
376-
});
377-
378-
$PXi { _mode: PhantomData }
379-
}
380-
381-
/// Configures the pin to serve as alternate function 9 (AF9)
382-
pub fn into_af9(
383-
self,
384-
moder: &mut MODER,
385-
afr: &mut $AFR,
386-
) -> $PXi<Alternate<AF9, MODE>> {
387-
let offset = 2 * $i;
388-
389-
// alternate function mode
390-
let mode = 0b10;
391-
moder.moder().modify(|r, w| unsafe {
392-
w.bits((r.bits() & !(0b11 << offset)) | (mode << offset))
393-
});
394-
395-
let af = 9;
396-
let offset = 4 * ($i % 8);
397-
398-
afr.afr().modify(|r, w| unsafe {
399-
w.bits((r.bits() & !(0b1111 << offset)) | (af << offset))
400-
});
401-
402-
$PXi { _mode: PhantomData }
403-
}
404-
405-
/// Configures the pin to serve as alternate function 10 (AF10)
406-
pub fn into_af10(
407-
self,
408-
moder: &mut MODER,
409-
afr: &mut $AFR,
410-
) -> $PXi<Alternate<AF10, MODE>> {
411-
let offset = 2 * $i;
412-
413-
// alternate function mode
414-
let mode = 0b10;
415-
moder.moder().modify(|r, w| unsafe {
416-
w.bits((r.bits() & !(0b11 << offset)) | (mode << offset))
417-
});
418-
419-
let af = 10;
420-
let offset = 4 * ($i % 8);
421-
422-
afr.afr().modify(|r, w| unsafe {
423-
w.bits((r.bits() & !(0b1111 << offset)) | (af << offset))
424-
});
425-
426-
$PXi { _mode: PhantomData }
427-
}
428-
429270
/// Configures the pin to operate as a floating input pin
430271
pub fn into_floating_input(
431272
self,
@@ -630,6 +471,27 @@ macro_rules! gpio {
630471
unsafe { (*$GPIOX::ptr()).idr.read().bits() & (1 << $i) == 0 }
631472
}
632473
}
474+
475+
impl<MODE> $PXi<MODE> {
476+
impl_into_af! {
477+
$PXi $AFR $i,
478+
(AF1, 1, into_af1);
479+
(AF2, 2, into_af2);
480+
(AF3, 3, into_af3);
481+
(AF4, 4, into_af4);
482+
(AF5, 5, into_af5);
483+
(AF6, 6, into_af6);
484+
(AF7, 7, into_af7);
485+
(AF8, 8, into_af8);
486+
(AF9, 9, into_af9);
487+
(AF10, 10, into_af10);
488+
(AF11, 11, into_af11);
489+
(AF12, 12, into_af12);
490+
(AF13, 13, into_af13);
491+
(AF14, 14, into_af14);
492+
(AF15, 15, into_af15);
493+
}
494+
}
633495
)+
634496
}
635497
}

0 commit comments

Comments
 (0)