@@ -115,75 +115,6 @@ impl Pins<USART3> for (PD8<Alternate<PushPull>>, PD9<Input<Floating>>) {
115
115
const REMAP : u8 = 0b11 ;
116
116
}
117
117
118
- /// Internal trait for the serial read / write logic.
119
- trait UsartReadWrite : Deref < Target =crate :: stm32:: usart1:: RegisterBlock > {
120
- fn read ( & self ) -> nb:: Result < u8 , Error > {
121
- let sr = self . sr . read ( ) ;
122
-
123
- // Check for any errors
124
- let err = if sr. pe ( ) . bit_is_set ( ) {
125
- Some ( Error :: Parity )
126
- } else if sr. fe ( ) . bit_is_set ( ) {
127
- Some ( Error :: Framing )
128
- } else if sr. ne ( ) . bit_is_set ( ) {
129
- Some ( Error :: Noise )
130
- } else if sr. ore ( ) . bit_is_set ( ) {
131
- Some ( Error :: Overrun )
132
- } else {
133
- None
134
- } ;
135
-
136
- if let Some ( err) = err {
137
- // Some error occured. In order to clear that error flag, you have to
138
- // do a read from the sr register followed by a read from the dr
139
- // register
140
- // NOTE(read_volatile) see `write_volatile` below
141
- unsafe {
142
- ptr:: read_volatile ( & self . sr as * const _ as * const _ ) ;
143
- ptr:: read_volatile ( & self . dr as * const _ as * const _ ) ;
144
- }
145
- Err ( nb:: Error :: Other ( err) )
146
- } else {
147
- // Check if a byte is available
148
- if sr. rxne ( ) . bit_is_set ( ) {
149
- // Read the received byte
150
- // NOTE(read_volatile) see `write_volatile` below
151
- Ok ( unsafe {
152
- ptr:: read_volatile ( & self . dr as * const _ as * const _ )
153
- } )
154
- } else {
155
- Err ( nb:: Error :: WouldBlock )
156
- }
157
- }
158
- }
159
-
160
- fn write ( & self , byte : u8 ) -> nb:: Result < ( ) , Infallible > {
161
- let sr = self . sr . read ( ) ;
162
-
163
- if sr. txe ( ) . bit_is_set ( ) {
164
- // NOTE(unsafe) atomic write to stateless register
165
- // NOTE(write_volatile) 8-bit write that's not possible through the svd2rust API
166
- unsafe {
167
- ptr:: write_volatile ( & self . dr as * const _ as * mut _ , byte)
168
- }
169
- Ok ( ( ) )
170
- } else {
171
- Err ( nb:: Error :: WouldBlock )
172
- }
173
- }
174
-
175
- fn flush ( & self ) -> nb:: Result < ( ) , Infallible > {
176
- let sr = self . sr . read ( ) ;
177
-
178
- if sr. tc ( ) . bit_is_set ( ) {
179
- Ok ( ( ) )
180
- } else {
181
- Err ( nb:: Error :: WouldBlock )
182
- }
183
- }
184
- }
185
- impl UsartReadWrite for & crate :: stm32:: usart1:: RegisterBlock { }
186
-
187
118
pub enum Parity {
188
119
ParityNone ,
189
120
ParityEven ,
@@ -261,6 +192,75 @@ pub struct Tx<USART> {
261
192
_usart : PhantomData < USART > ,
262
193
}
263
194
195
+ /// Internal trait for the serial read / write logic.
196
+ trait UsartReadWrite : Deref < Target =crate :: stm32:: usart1:: RegisterBlock > {
197
+ fn read ( & self ) -> nb:: Result < u8 , Error > {
198
+ let sr = self . sr . read ( ) ;
199
+
200
+ // Check for any errors
201
+ let err = if sr. pe ( ) . bit_is_set ( ) {
202
+ Some ( Error :: Parity )
203
+ } else if sr. fe ( ) . bit_is_set ( ) {
204
+ Some ( Error :: Framing )
205
+ } else if sr. ne ( ) . bit_is_set ( ) {
206
+ Some ( Error :: Noise )
207
+ } else if sr. ore ( ) . bit_is_set ( ) {
208
+ Some ( Error :: Overrun )
209
+ } else {
210
+ None
211
+ } ;
212
+
213
+ if let Some ( err) = err {
214
+ // Some error occured. In order to clear that error flag, you have to
215
+ // do a read from the sr register followed by a read from the dr
216
+ // register
217
+ // NOTE(read_volatile) see `write_volatile` below
218
+ unsafe {
219
+ ptr:: read_volatile ( & self . sr as * const _ as * const _ ) ;
220
+ ptr:: read_volatile ( & self . dr as * const _ as * const _ ) ;
221
+ }
222
+ Err ( nb:: Error :: Other ( err) )
223
+ } else {
224
+ // Check if a byte is available
225
+ if sr. rxne ( ) . bit_is_set ( ) {
226
+ // Read the received byte
227
+ // NOTE(read_volatile) see `write_volatile` below
228
+ Ok ( unsafe {
229
+ ptr:: read_volatile ( & self . dr as * const _ as * const _ )
230
+ } )
231
+ } else {
232
+ Err ( nb:: Error :: WouldBlock )
233
+ }
234
+ }
235
+ }
236
+
237
+ fn write ( & self , byte : u8 ) -> nb:: Result < ( ) , Infallible > {
238
+ let sr = self . sr . read ( ) ;
239
+
240
+ if sr. txe ( ) . bit_is_set ( ) {
241
+ // NOTE(unsafe) atomic write to stateless register
242
+ // NOTE(write_volatile) 8-bit write that's not possible through the svd2rust API
243
+ unsafe {
244
+ ptr:: write_volatile ( & self . dr as * const _ as * mut _ , byte)
245
+ }
246
+ Ok ( ( ) )
247
+ } else {
248
+ Err ( nb:: Error :: WouldBlock )
249
+ }
250
+ }
251
+
252
+ fn flush ( & self ) -> nb:: Result < ( ) , Infallible > {
253
+ let sr = self . sr . read ( ) ;
254
+
255
+ if sr. tc ( ) . bit_is_set ( ) {
256
+ Ok ( ( ) )
257
+ } else {
258
+ Err ( nb:: Error :: WouldBlock )
259
+ }
260
+ }
261
+ }
262
+ impl UsartReadWrite for & crate :: stm32:: usart1:: RegisterBlock { }
263
+
264
264
macro_rules! hal {
265
265
( $(
266
266
$( #[ $meta: meta] ) *
0 commit comments