Skip to content

Commit 7a4962c

Browse files
authored
Cleanup gpio (#177)
1 parent e3e22ab commit 7a4962c

File tree

1 file changed

+50
-60
lines changed

1 file changed

+50
-60
lines changed

src/gpio.rs

+50-60
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)