@@ -61,49 +61,55 @@ pub enum Error {
61
61
_Extensible,
62
62
}
63
63
64
- pub trait Pins < USART > { }
64
+ pub trait TxPin < USART > { }
65
+ pub trait RxPin < USART > { }
65
66
66
- # [ cfg ( any ( feature = "stm32f030" , feature = "stm32f042" ) ) ]
67
- impl Pins < stm32 :: USART1 > for ( gpioa :: PA9 < Alternate < AF1 > > , gpioa :: PA10 < Alternate < AF1 > > ) { }
68
- # [ cfg ( any ( feature = "stm32f030" , feature = "stm32f042" ) ) ]
69
- impl Pins < stm32:: USART1 > for ( gpiob :: PB6 < Alternate < AF0 > > , gpiob :: PB7 < Alternate < AF0 > > ) { }
70
- # [ cfg ( any ( feature = "stm32f030" , feature = "stm32f042" ) ) ]
71
- impl Pins < stm32 :: USART1 > for ( gpioa :: PA9 < Alternate < AF1 > > , gpiob :: PB7 < Alternate < AF0 > > ) { }
72
- # [ cfg ( any ( feature = "stm32f030" , feature = "stm32f042" ) ) ]
73
- impl Pins < stm32 :: USART1 > for ( gpiob :: PB6 < Alternate < AF0 > > , gpioa :: PA10 < Alternate < AF1 > > ) { }
67
+ macro_rules! usart_pins {
68
+ ( $ ( $USART : ident : ( $tx : ty , $rx : ty ) , ) + ) => {
69
+ $ (
70
+ impl TxPin <stm32:: $USART > for $tx { }
71
+ impl RxPin <stm32 :: $USART> for $rx { }
72
+ ) +
73
+ }
74
+ }
74
75
76
+ #[ cfg( any( feature = "stm32f030" , feature = "stm32f042" ) ) ]
77
+ usart_pins ! {
78
+ USART1 : ( gpioa:: PA9 <Alternate <AF1 >>, gpioa:: PA10 <Alternate <AF1 >>) ,
79
+ USART1 : ( gpiob:: PB6 <Alternate <AF0 >>, gpiob:: PB6 <Alternate <AF0 >>) ,
80
+ }
75
81
#[ cfg( feature = "stm32f030x6" ) ]
76
- impl Pins < stm32:: USART1 > for ( gpioa:: PA2 < Alternate < AF1 > > , gpioa:: PA3 < Alternate < AF1 > > ) { }
77
-
78
- #[ cfg( any(
79
- feature = "stm32f042" ,
80
- feature = "stm32f030x8" ,
81
- feature = "stm32f030xc" ,
82
- ) ) ]
83
- impl Pins < stm32:: USART2 > for ( gpioa:: PA2 < Alternate < AF1 > > , gpioa:: PA3 < Alternate < AF1 > > ) { }
84
- #[ cfg( any(
85
- feature = "stm32f042" ,
86
- feature = "stm32f030x8" ,
87
- feature = "stm32f030xc" ,
88
- ) ) ]
89
- impl Pins < stm32:: USART2 > for ( gpioa:: PA2 < Alternate < AF1 > > , gpioa:: PA15 < Alternate < AF1 > > ) { }
90
- #[ cfg( any(
91
- feature = "stm32f042" ,
92
- feature = "stm32f030x8" ,
93
- feature = "stm32f030xc" ,
94
- ) ) ]
95
- impl Pins < stm32:: USART2 > for ( gpioa:: PA14 < Alternate < AF1 > > , gpioa:: PA15 < Alternate < AF1 > > ) { }
82
+ usart_pins ! {
83
+ USART1 : ( gpioa:: PA2 <Alternate <AF1 >>, gpioa:: PA3 <Alternate <AF1 >>) ,
84
+ USART1 : ( gpioa:: PA14 <Alternate <AF1 >>, gpioa:: PA15 <Alternate <AF1 >>) ,
85
+ }
96
86
#[ cfg( any(
97
87
feature = "stm32f042" ,
98
88
feature = "stm32f030x8" ,
99
89
feature = "stm32f030xc" ,
100
90
) ) ]
101
- impl Pins < stm32:: USART2 > for ( gpioa:: PA14 < Alternate < AF1 > > , gpioa:: PA3 < Alternate < AF1 > > ) { }
91
+ usart_pins ! {
92
+ USART2 : ( gpioa:: PA2 <Alternate <AF1 >>, gpioa:: PA3 <Alternate <AF1 >>) ,
93
+ USART2 : ( gpioa:: PA14 <Alternate <AF1 >>, gpioa:: PA15 <Alternate <AF1 >>) ,
94
+ }
95
+ #[ cfg( feature = "stm32f030xc" ) ]
96
+ usart_pins ! {
97
+ // TODO WTF look at this again, in the datasheet PB10 is both tx and rx
98
+ // USART3: (gpiob::PB10, AF4, gpiob::PA11, AF4),
99
+ USART3 : ( gpioc:: PC4 <Alternate <AF1 >>, gpioc:: PC5 <Alternate <AF1 >>) ,
100
+ USART3 : ( gpioc:: PC10 <Alternate <AF1 >>, gpioc:: PC11 <Alternate <AF1 >>) ,
101
+ USART4 : ( gpioa:: PA0 <Alternate <AF4 >>, gpioa:: PA1 <Alternate <AF4 >>) ,
102
+ USART4 : ( gpioc:: PC10 <Alternate <AF0 >>, gpioc:: PC11 <Alternate <AF0 >>) ,
103
+ USART5 : ( gpiob:: PB3 <Alternate <AF4 >>, gpiob:: PB4 <Alternate <AF4 >>) ,
104
+ USART5 : ( gpioc:: PC12 <Alternate <AF2 >>, gpiod:: PD2 <Alternate <AF2 >>) ,
105
+ USART6 : ( gpioa:: PA4 <Alternate <AF5 >>, gpioa:: PA5 <Alternate <AF5 >>) ,
106
+ USART6 : ( gpioc:: PC0 <Alternate <AF2 >>, gpioc:: PC1 <Alternate <AF2 >>) ,
107
+ }
102
108
103
109
/// Serial abstraction
104
- pub struct Serial < USART , PINS > {
110
+ pub struct Serial < USART , TXPIN , RXPIN > {
105
111
usart : USART ,
106
- pins : PINS ,
112
+ pins : ( TXPIN , RXPIN ) ,
107
113
}
108
114
109
115
/// Serial receiver
@@ -122,11 +128,12 @@ macro_rules! usart {
122
128
( $( $USART: ident: ( $usart: ident, $usartXen: ident, $apbenr: ident) , ) +) => {
123
129
$(
124
130
use crate :: stm32:: $USART;
125
- impl <PINS > Serial <$USART, PINS > {
131
+ impl <TXPIN , RXPIN > Serial <$USART, TXPIN , RXPIN > {
126
132
/// Creates a new serial instance
127
- pub fn $usart( usart: $USART, pins: PINS , baud_rate: Bps , clocks: Clocks ) -> Self
133
+ pub fn $usart( usart: $USART, pins: ( TXPIN , RXPIN ) , baud_rate: Bps , clocks: Clocks ) -> Self
128
134
where
129
- PINS : Pins <$USART>,
135
+ TXPIN : TxPin <$USART>,
136
+ RXPIN : RxPin <$USART>,
130
137
{
131
138
// NOTE(unsafe) This executes only during initialisation
132
139
let rcc = unsafe { & ( * stm32:: RCC :: ptr( ) ) } ;
@@ -240,10 +247,11 @@ where
240
247
}
241
248
}
242
249
243
- impl < USART , PINS > Serial < USART , PINS >
250
+ impl < USART , TXPIN , RXPIN > Serial < USART , TXPIN , RXPIN >
244
251
where
245
252
USART : Deref < Target = SerialRegisterBlock > ,
246
- PINS : Pins < USART > ,
253
+ TXPIN : TxPin < USART > ,
254
+ RXPIN : RxPin < USART > ,
247
255
{
248
256
/// Splits the UART Peripheral in a Tx and an Rx part
249
257
/// This is required for sending/receiving
@@ -257,7 +265,7 @@ where
257
265
} ,
258
266
)
259
267
}
260
- pub fn release ( self ) -> ( USART , PINS ) {
268
+ pub fn release ( self ) -> ( USART , ( TXPIN , RXPIN ) ) {
261
269
( self . usart , self . pins )
262
270
}
263
271
}
0 commit comments