@@ -98,6 +98,37 @@ pub struct AF14;
9898/// Alternate function 15 (type state)
9999pub 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+
101132macro_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