@@ -443,95 +443,89 @@ macro_rules! gpio {
443
443
impl <MODE > $PXi<MODE > {
444
444
/// Configures the pin to operate as a floating input pin
445
445
pub fn into_floating_input( self ) -> $PXi<Input <Floating >> {
446
- let offset = 2 * $i;
447
446
unsafe {
448
447
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 ( )
451
450
} ) ;
452
- gpio. moder( ) . modify( |r , w| {
453
- w. bits ( r . bits ( ) & ! ( 0b11 << offset ) )
451
+ gpio. moder( ) . modify( |_ , w| {
452
+ w. moder ( $i ) . input ( )
454
453
} )
455
454
} ;
456
455
$PXi { _mode: PhantomData }
457
456
}
458
457
459
458
/// Configures the pin to operate as a pulled down input pin
460
459
pub fn into_pull_down_input( self ) -> $PXi<Input <PullDown >> {
461
- let offset = 2 * $i;
462
460
unsafe {
463
461
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 ( )
466
464
} ) ;
467
- gpio. moder( ) . modify( |r , w| {
468
- w. bits ( r . bits ( ) & ! ( 0b11 << offset ) )
465
+ gpio. moder( ) . modify( |_ , w| {
466
+ w. moder ( $i ) . input ( )
469
467
} )
470
468
} ;
471
469
$PXi { _mode: PhantomData }
472
470
}
473
471
474
472
/// Configures the pin to operate as a pulled up input pin
475
473
pub fn into_pull_up_input( self ) -> $PXi<Input <PullUp >> {
476
- let offset = 2 * $i;
477
474
unsafe {
478
475
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 ( )
481
478
} ) ;
482
- gpio. moder( ) . modify( |r , w| {
483
- w. bits ( r . bits ( ) & ! ( 0b11 << offset ) )
479
+ gpio. moder( ) . modify( |_ , w| {
480
+ w. moder ( $i ) . input ( )
484
481
} )
485
482
} ;
486
483
$PXi { _mode: PhantomData }
487
484
}
488
485
489
486
/// Configures the pin to operate as an analog pin
490
487
pub fn into_analog( self ) -> $PXi<Analog > {
491
- let offset = 2 * $i;
492
488
unsafe {
493
489
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 ( )
496
492
} ) ;
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 ( )
499
495
} ) ;
500
496
}
501
497
$PXi { _mode: PhantomData }
502
498
}
503
499
504
500
/// Configures the pin to operate as an open drain output pin
505
501
pub fn into_open_drain_output( self ) -> $PXi<Output <OpenDrain >> {
506
- let offset = 2 * $i;
507
502
unsafe {
508
503
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 ( )
511
506
} ) ;
512
- gpio. otyper( ) . modify( |r , w| {
513
- w. bits ( r . bits ( ) | ( 0b1 << $i) )
507
+ gpio. otyper( ) . modify( |_ , w| {
508
+ w. ot ( $i) . open_drain ( )
514
509
} ) ;
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 ( )
517
512
} )
518
513
} ;
519
514
$PXi { _mode: PhantomData }
520
515
}
521
516
522
517
/// Configures the pin to operate as an push pull output pin
523
518
pub fn into_push_pull_output( self ) -> $PXi<Output <PushPull >> {
524
- let offset = 2 * $i;
525
519
unsafe {
526
520
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 ( )
529
523
} ) ;
530
- gpio. otyper( ) . modify( |r , w| {
531
- w. bits ( r . bits ( ) & ! ( 0b1 << $i) )
524
+ gpio. otyper( ) . modify( |_ , w| {
525
+ w. ot ( $i) . push_pull ( )
532
526
} ) ;
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 ( )
535
529
} )
536
530
} ;
537
531
$PXi { _mode: PhantomData }
@@ -555,52 +549,48 @@ macro_rules! gpio {
555
549
}
556
550
557
551
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 ;
561
553
unsafe {
562
554
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)
566
558
} ) ;
567
559
} 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)
571
563
} ) ;
572
564
}
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 ( )
575
567
} ) ;
576
- gpio. otyper( ) . modify( |r , w| {
577
- w. bits ( r . bits ( ) & ! ( 0b1 << $i) )
568
+ gpio. otyper( ) . modify( |_ , w| {
569
+ w. ot ( $i) . push_pull ( )
578
570
} ) ;
579
571
}
580
572
$PXi { _mode: PhantomData }
581
573
}
582
574
583
575
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 ;
587
577
unsafe {
588
578
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)
592
582
} ) ;
593
583
} 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)
597
587
} ) ;
598
588
}
599
- gpio. otyper( ) . modify( |r , w| {
600
- w. bits ( r . bits ( ) | ( 0b1 << $i) )
589
+ gpio. otyper( ) . modify( |_ , w| {
590
+ w. ot ( $i) . open_drain ( )
601
591
} ) ;
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 ( )
604
594
} ) ;
605
595
}
606
596
$PXi { _mode: PhantomData }
0 commit comments