Skip to content

Commit 5ad2cea

Browse files
committed
Make gpio pin bitwidth variable const
1 parent 47bb5fd commit 5ad2cea

File tree

1 file changed

+17
-14
lines changed

1 file changed

+17
-14
lines changed

src/gpio.rs

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -603,30 +603,32 @@ where
603603
///
604604
/// For example, only on of `PA1`, `PB1`, `PC1`, ... can be activated.
605605
pub fn make_interrupt_source(&mut self, syscfg: &mut SysCfg) {
606-
let bitwidth = 4;
606+
const BITWIDTH: u8 = 4;
607607
let index = self.index.index() % 4;
608608
let extigpionr = self.gpio.port_index() as u32;
609609
match self.index.index() {
610-
0..=3 => unsafe { modify_at!(syscfg.exticr1, bitwidth, index, extigpionr) },
611-
4..=7 => unsafe { modify_at!(syscfg.exticr2, bitwidth, index, extigpionr) },
612-
8..=11 => unsafe { modify_at!(syscfg.exticr3, bitwidth, index, extigpionr) },
613-
12..=15 => unsafe { modify_at!(syscfg.exticr4, bitwidth, index, extigpionr) },
610+
// SAFETY: These are all unguarded writes directly to the register,
611+
// without leveraging the safety of stm32f3 generated values.
612+
0..=3 => unsafe { modify_at!(syscfg.exticr1, BITWIDTH, index, extigpionr) },
613+
4..=7 => unsafe { modify_at!(syscfg.exticr2, BITWIDTH, index, extigpionr) },
614+
8..=11 => unsafe { modify_at!(syscfg.exticr3, BITWIDTH, index, extigpionr) },
615+
12..=15 => unsafe { modify_at!(syscfg.exticr4, BITWIDTH, index, extigpionr) },
614616
_ => unreachable!(),
615617
};
616618
}
617619

618620
/// Generate interrupt on rising edge, falling edge, or both
619621
pub fn trigger_on_edge(&mut self, exti: &mut EXTI, edge: Edge) {
620-
let bitwidth = 1;
622+
const BITWIDTH: u8 = 1;
621623
let index = self.index.index();
622624
let (rise, fall) = match edge {
623625
Edge::Rising => (true as u32, false as u32),
624626
Edge::Falling => (false as u32, true as u32),
625627
Edge::RisingFalling => (true as u32, true as u32),
626628
};
627629
unsafe {
628-
modify_at!(reg_for_cpu!(exti, rtsr), bitwidth, index, rise);
629-
modify_at!(reg_for_cpu!(exti, ftsr), bitwidth, index, fall);
630+
modify_at!(reg_for_cpu!(exti, rtsr), BITWIDTH, index, rise);
631+
modify_at!(reg_for_cpu!(exti, ftsr), BITWIDTH, index, fall);
630632
}
631633
}
632634

@@ -635,13 +637,14 @@ where
635637
/// Remeber to also configure the interrupt pin on
636638
/// the SysCfg site, with [`Pin::make_interrupt_source()`]
637639
pub fn configure_interrupt(&mut self, exti: &mut EXTI, enable: impl Into<Toggle>) {
640+
const BITWIDTH: u8 = 1;
641+
638642
let enable: Toggle = enable.into();
639643
let enable: bool = enable.into();
640644

641-
let bitwidth = 1;
642645
let index = self.index.index();
643646
let value = u32::from(enable);
644-
unsafe { modify_at!(reg_for_cpu!(exti, imr), bitwidth, index, value) };
647+
unsafe { modify_at!(reg_for_cpu!(exti, imr), BITWIDTH, index, value) };
645648
}
646649

647650
/// Enable external interrupts from this pin
@@ -902,8 +905,8 @@ macro_rules! gpio {
902905
impl Afr for AFRH {
903906
#[inline]
904907
fn afx(&mut self, i: u8, x: u8) {
905-
let bitwidth = 4;
906-
unsafe { modify_at!((*$GPIOX::ptr()).afrh, bitwidth, i - 8, x as u32) };
908+
const BITWIDTH: u8 = 4;
909+
unsafe { modify_at!((*$GPIOX::ptr()).afrh, BITWIDTH, i - 8, x as u32) };
907910
}
908911
}
909912

@@ -913,8 +916,8 @@ macro_rules! gpio {
913916
impl Afr for AFRL {
914917
#[inline]
915918
fn afx(&mut self, i: u8, x: u8) {
916-
let bitwidth = 4;
917-
unsafe { modify_at!((*$GPIOX::ptr()).afrl, bitwidth, i, x as u32) };
919+
const BITWIDTH: u8 = 4;
920+
unsafe { modify_at!((*$GPIOX::ptr()).afrl, BITWIDTH, i, x as u32) };
918921
}
919922
}
920923

0 commit comments

Comments
 (0)