Skip to content

Commit eaaa8a8

Browse files
Serial remap improvement
1 parent b88151f commit eaaa8a8

File tree

1 file changed

+21
-40
lines changed

1 file changed

+21
-40
lines changed

src/serial.rs

Lines changed: 21 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -121,36 +121,32 @@ pub enum Error {
121121
// USART REMAPPING, see: https://www.st.com/content/ccc/resource/technical/document/reference_manual/59/b9/ba/7f/11/af/43/d5/CD00171190.pdf/files/CD00171190.pdf/jcr:content/translations/en.CD00171190.pdf
122122
// Section 9.3.8
123123
pub trait Pins<USART> {
124-
const REMAP: u8;
124+
fn remap(mapr: &mut MAPR);
125125
}
126126

127-
impl<INMODE, OUTMODE> Pins<USART1> for (gpio::PA9<Alternate<OUTMODE>>, gpio::PA10<Input<INMODE>>) {
128-
const REMAP: u8 = 0;
129-
}
130-
131-
impl<INMODE, OUTMODE> Pins<USART1> for (gpio::PB6<Alternate<OUTMODE>>, gpio::PB7<Input<INMODE>>) {
132-
const REMAP: u8 = 1;
133-
}
134-
135-
impl<INMODE, OUTMODE> Pins<USART2> for (gpio::PA2<Alternate<OUTMODE>>, gpio::PA3<Input<INMODE>>) {
136-
const REMAP: u8 = 0;
137-
}
138-
139-
impl<INMODE, OUTMODE> Pins<USART2> for (gpio::PD5<Alternate<OUTMODE>>, gpio::PD6<Input<INMODE>>) {
140-
const REMAP: u8 = 1;
127+
macro_rules! remap {
128+
($($USART:ty, $TX:ident, $RX:ident => { $remapex:expr };)+) => {
129+
$(
130+
impl<INMODE, OUTMODE> Pins<$USART> for (gpio::$TX<Alternate<OUTMODE>>, gpio::$RX<Input<INMODE>>) {
131+
fn remap(mapr: &mut MAPR) {
132+
mapr.modify_mapr($remapex);
133+
}
134+
}
135+
)+
136+
}
141137
}
142138

143-
impl<INMODE, OUTMODE> Pins<USART3> for (gpio::PB10<Alternate<OUTMODE>>, gpio::PB11<Input<INMODE>>) {
144-
const REMAP: u8 = 0;
145-
}
139+
remap!(
140+
USART1, PA9, PA10 => { |_, w| w.usart1_remap().bit(false) };
141+
USART1, PB6, PB7 => { |_, w| w.usart1_remap().bit(true) };
146142

147-
impl<INMODE, OUTMODE> Pins<USART3> for (gpio::PC10<Alternate<OUTMODE>>, gpio::PC11<Input<INMODE>>) {
148-
const REMAP: u8 = 1;
149-
}
143+
USART2, PA2, PA3 => { |_, w| w.usart2_remap().bit(false) };
144+
USART2, PD5, PD6 => { |_, w| w.usart2_remap().bit(true) };
150145

151-
impl<INMODE, OUTMODE> Pins<USART3> for (gpio::PD8<Alternate<OUTMODE>>, gpio::PD9<Input<INMODE>>) {
152-
const REMAP: u8 = 0b11;
153-
}
146+
USART3, PB10, PB11 => { |_, w| unsafe { w.usart3_remap().bits(0b00)} };
147+
USART3, PC10, PC11 => { |_, w| unsafe { w.usart3_remap().bits(0b01)} };
148+
USART3, PD8, PD9 => { |_, w| unsafe { w.usart3_remap().bits(0b11)} };
149+
);
154150

155151
pub enum WordLength {
156152
/// When parity is enabled, a word has 7 data bits + 1 parity bit,
@@ -431,9 +427,6 @@ macro_rules! hal {
431427
$(#[$meta:meta])*
432428
$USARTX:ident: (
433429
$usartX:ident,
434-
$usartX_remap:ident,
435-
$bit:ident,
436-
$closure:expr,
437430
),
438431
) => {
439432
impl Instance for $USARTX {
@@ -473,10 +466,7 @@ macro_rules! hal {
473466
{
474467
#[allow(unused_unsafe)]
475468
Serial { usart, pins, tx: Tx::new(), rx: Rx::new() }.init(config.into(), clocks, || {
476-
mapr.modify_mapr(|_, w| unsafe {
477-
#[allow(clippy::redundant_closure_call)]
478-
w.$usartX_remap().$bit(($closure)(PINS::REMAP))
479-
})
469+
PINS::remap(mapr);
480470
})
481471
}
482472
}
@@ -488,27 +478,18 @@ hal! {
488478
/// # USART1 functions
489479
USART1: (
490480
usart1,
491-
usart1_remap,
492-
bit,
493-
|remap| remap == 1,
494481
),
495482
}
496483
hal! {
497484
/// # USART2 functions
498485
USART2: (
499486
usart2,
500-
usart2_remap,
501-
bit,
502-
|remap| remap == 1,
503487
),
504488
}
505489
hal! {
506490
/// # USART3 functions
507491
USART3: (
508492
usart3,
509-
usart3_remap,
510-
bits,
511-
|remap| remap,
512493
),
513494
}
514495

0 commit comments

Comments
 (0)