@@ -443,95 +443,89 @@ macro_rules! gpio {
443443 impl <MODE > $PXi<MODE > {
444444 /// Configures the pin to operate as a floating input pin
445445 pub fn into_floating_input( self ) -> $PXi<Input <Floating >> {
446- let offset = 2 * $i;
447446 unsafe {
448447 let gpio = & ( * $GPIOX:: ptr( ) ) ;
449- gpio. pupdr( ) . modify( |r , w| {
450- w. bits ( r . bits ( ) & ! ( 0b11 << offset ) )
448+ gpio. pupdr( ) . modify( |_ , w| {
449+ w. pupdr ( $i ) . floating ( )
451450 } ) ;
452- gpio. moder( ) . modify( |r , w| {
453- w. bits ( r . bits ( ) & ! ( 0b11 << offset ) )
451+ gpio. moder( ) . modify( |_ , w| {
452+ w. moder ( $i ) . input ( )
454453 } )
455454 } ;
456455 $PXi { _mode: PhantomData }
457456 }
458457
459458 /// Configures the pin to operate as a pulled down input pin
460459 pub fn into_pull_down_input( self ) -> $PXi<Input <PullDown >> {
461- let offset = 2 * $i;
462460 unsafe {
463461 let gpio = & ( * $GPIOX:: ptr( ) ) ;
464- gpio. pupdr( ) . modify( |r , w| {
465- w. bits ( ( r . bits ( ) & ! ( 0b11 << offset ) ) | ( 0b10 << offset ) )
462+ gpio. pupdr( ) . modify( |_ , w| {
463+ w. pupdr ( $i ) . pull_down ( )
466464 } ) ;
467- gpio. moder( ) . modify( |r , w| {
468- w. bits ( r . bits ( ) & ! ( 0b11 << offset ) )
465+ gpio. moder( ) . modify( |_ , w| {
466+ w. moder ( $i ) . input ( )
469467 } )
470468 } ;
471469 $PXi { _mode: PhantomData }
472470 }
473471
474472 /// Configures the pin to operate as a pulled up input pin
475473 pub fn into_pull_up_input( self ) -> $PXi<Input <PullUp >> {
476- let offset = 2 * $i;
477474 unsafe {
478475 let gpio = & ( * $GPIOX:: ptr( ) ) ;
479- gpio. pupdr( ) . modify( |r , w| {
480- w. bits ( ( r . bits ( ) & ! ( 0b11 << offset ) ) | ( 0b01 << offset ) )
476+ gpio. pupdr( ) . modify( |_ , w| {
477+ w. pupdr ( $i ) . pull_up ( )
481478 } ) ;
482- gpio. moder( ) . modify( |r , w| {
483- w. bits ( r . bits ( ) & ! ( 0b11 << offset ) )
479+ gpio. moder( ) . modify( |_ , w| {
480+ w. moder ( $i ) . input ( )
484481 } )
485482 } ;
486483 $PXi { _mode: PhantomData }
487484 }
488485
489486 /// Configures the pin to operate as an analog pin
490487 pub fn into_analog( self ) -> $PXi<Analog > {
491- let offset = 2 * $i;
492488 unsafe {
493489 let gpio = & ( * $GPIOX:: ptr( ) ) ;
494- gpio. pupdr( ) . modify( |r , w| {
495- w. bits ( r . bits ( ) & ! ( 0b11 << offset ) )
490+ gpio. pupdr( ) . modify( |_ , w| {
491+ w. pupdr ( $i ) . floating ( )
496492 } ) ;
497- gpio. moder( ) . modify( |r , w| {
498- w. bits ( ( r . bits ( ) & ! ( 0b11 << offset ) ) | ( 0b11 << offset ) )
493+ gpio. moder( ) . modify( |_ , w| {
494+ w. moder ( $i ) . analog ( )
499495 } ) ;
500496 }
501497 $PXi { _mode: PhantomData }
502498 }
503499
504500 /// Configures the pin to operate as an open drain output pin
505501 pub fn into_open_drain_output( self ) -> $PXi<Output <OpenDrain >> {
506- let offset = 2 * $i;
507502 unsafe {
508503 let gpio = & ( * $GPIOX:: ptr( ) ) ;
509- gpio. pupdr( ) . modify( |r , w| {
510- w. bits ( r . bits ( ) & ! ( 0b11 << offset ) )
504+ gpio. pupdr( ) . modify( |_ , w| {
505+ w. pupdr ( $i ) . floating ( )
511506 } ) ;
512- gpio. otyper( ) . modify( |r , w| {
513- w. bits ( r . bits ( ) | ( 0b1 << $i) )
507+ gpio. otyper( ) . modify( |_ , w| {
508+ w. ot ( $i) . open_drain ( )
514509 } ) ;
515- gpio. moder( ) . modify( |r , w| {
516- w. bits ( ( r . bits ( ) & ! ( 0b11 << offset ) ) | ( 0b01 << offset ) )
510+ gpio. moder( ) . modify( |_ , w| {
511+ w. moder ( $i ) . output ( )
517512 } )
518513 } ;
519514 $PXi { _mode: PhantomData }
520515 }
521516
522517 /// Configures the pin to operate as an push pull output pin
523518 pub fn into_push_pull_output( self ) -> $PXi<Output <PushPull >> {
524- let offset = 2 * $i;
525519 unsafe {
526520 let gpio = & ( * $GPIOX:: ptr( ) ) ;
527- gpio. pupdr( ) . modify( |r , w| {
528- w. bits ( r . bits ( ) & ! ( 0b11 << offset ) )
521+ gpio. pupdr( ) . modify( |_ , w| {
522+ w. pupdr ( $i ) . floating ( )
529523 } ) ;
530- gpio. otyper( ) . modify( |r , w| {
531- w. bits ( r . bits ( ) & ! ( 0b1 << $i) )
524+ gpio. otyper( ) . modify( |_ , w| {
525+ w. ot ( $i) . push_pull ( )
532526 } ) ;
533- gpio. moder( ) . modify( |r , w| {
534- w. bits ( ( r . bits ( ) & ! ( 0b11 << offset ) ) | ( 0b01 << offset ) )
527+ gpio. moder( ) . modify( |_ , w| {
528+ w. moder ( $i ) . output ( )
535529 } )
536530 } ;
537531 $PXi { _mode: PhantomData }
@@ -555,52 +549,48 @@ macro_rules! gpio {
555549 }
556550
557551 pub fn into_alternate<const A : u8 >( self ) -> $PXi<Alternate <A >> {
558- let mode = A as u32 ;
559- let offset = 2 * $i;
560- let offset2 = 4 * $i;
552+ let mode = A as u8 ;
561553 unsafe {
562554 let gpio = & ( * $GPIOX:: ptr( ) ) ;
563- if offset2 < 32 {
564- gpio. afrl( ) . modify( |r , w| {
565- w. bits ( ( r . bits ( ) & ! ( 0b1111 << offset2 ) ) | ( mode << offset2 ) )
555+ if $i < 8 {
556+ gpio. afrl( ) . modify( |_ , w| {
557+ w. afr ( $i ) . set ( mode)
566558 } ) ;
567559 } else {
568- let offset2 = offset2 - 32 ;
569- gpio. afrh( ) . modify( |r , w| {
570- w. bits ( ( r . bits ( ) & ! ( 0b1111 << offset2 ) ) | ( mode << offset2 ) )
560+ let offset = $i - 8 ;
561+ gpio. afrh( ) . modify( |_ , w| {
562+ w. afr ( offset ) . set ( mode)
571563 } ) ;
572564 }
573- gpio. moder( ) . modify( |r , w| {
574- w. bits ( ( r . bits ( ) & ! ( 0b11 << offset ) ) | ( 0b10 << offset ) )
565+ gpio. moder( ) . modify( |_ , w| {
566+ w. moder ( $i ) . alternate ( )
575567 } ) ;
576- gpio. otyper( ) . modify( |r , w| {
577- w. bits ( r . bits ( ) & ! ( 0b1 << $i) )
568+ gpio. otyper( ) . modify( |_ , w| {
569+ w. ot ( $i) . push_pull ( )
578570 } ) ;
579571 }
580572 $PXi { _mode: PhantomData }
581573 }
582574
583575 pub fn into_alternate_open_drain<const A : u8 >( self ) -> $PXi<AlternateOD <A >> {
584- let mode = A as u32 ;
585- let offset = 2 * $i;
586- let offset2 = 4 * $i;
576+ let mode = A as u8 ;
587577 unsafe {
588578 let gpio = & ( * $GPIOX:: ptr( ) ) ;
589- if offset2 < 32 {
590- gpio. afrl( ) . modify( |r , w| {
591- w. bits ( ( r . bits ( ) & ! ( 0b1111 << offset2 ) ) | ( mode << offset2 ) )
579+ if $i < 8 {
580+ gpio. afrl( ) . modify( |_ , w| {
581+ w. afr ( $i ) . set ( mode)
592582 } ) ;
593583 } else {
594- let offset2 = offset2 - 32 ;
595- gpio. afrh( ) . modify( |r , w| {
596- w. bits ( ( r . bits ( ) & ! ( 0b1111 << offset2 ) ) | ( mode << offset2 ) )
584+ let offset = $i - 8 ;
585+ gpio. afrh( ) . modify( |_ , w| {
586+ w. afr ( offset ) . set ( mode)
597587 } ) ;
598588 }
599- gpio. otyper( ) . modify( |r , w| {
600- w. bits ( r . bits ( ) | ( 0b1 << $i) )
589+ gpio. otyper( ) . modify( |_ , w| {
590+ w. ot ( $i) . open_drain ( )
601591 } ) ;
602- gpio. moder( ) . modify( |r , w| {
603- w. bits ( ( r . bits ( ) & ! ( 0b11 << offset ) ) | ( 0b10 << offset ) )
592+ gpio. moder( ) . modify( |_ , w| {
593+ w. moder ( $i ) . alternate ( )
604594 } ) ;
605595 }
606596 $PXi { _mode: PhantomData }
0 commit comments