6
6
//!
7
7
//! [examples/spi.rs]: https://github.com/stm32-rs/stm32f3xx-hal/blob/v0.9.1/examples/spi.rs
8
8
9
- use core:: { fmt, marker:: PhantomData , ops:: Deref , ptr } ;
9
+ use core:: { fmt, marker:: PhantomData , ops:: Deref } ;
10
10
11
11
use crate :: hal:: blocking:: spi;
12
12
use crate :: hal:: spi:: FullDuplex ;
@@ -24,6 +24,7 @@ use crate::{
24
24
rcc:: { self , Clocks } ,
25
25
time:: rate,
26
26
} ;
27
+ use num_traits:: { AsPrimitive , PrimInt } ;
27
28
28
29
/// SPI error
29
30
#[ derive( Copy , Clone , PartialEq , Eq , Debug ) ]
@@ -337,6 +338,8 @@ where
337
338
// SckPin could technically be omitted, though not advisable.
338
339
Miso : MisoPin < SPI > ,
339
340
Mosi : MosiPin < SPI > ,
341
+ Word : PrimInt + Into < u32 > + ' static ,
342
+ u32 : AsPrimitive < Word > ,
340
343
{
341
344
type Error = Error ;
342
345
@@ -350,9 +353,9 @@ where
350
353
} else if sr. crcerr ( ) . is_no_match ( ) {
351
354
nb:: Error :: Other ( Error :: Crc )
352
355
} else if sr. rxne ( ) . is_not_empty ( ) {
353
- let read_ptr = & self . spi . dr as * const _ as * const Word ;
354
- // NOTE(unsafe) read from register owned by this Spi struct
355
- let value = unsafe { ptr:: read_volatile ( read_ptr) } ;
356
+ let read_ptr = core :: ptr :: addr_of! ( self . spi. dr) as * const Word ;
357
+ // SAFETY: Read from register owned by this Spi struct
358
+ let value = unsafe { core :: ptr:: read_volatile ( read_ptr) } ;
356
359
return Ok ( value) ;
357
360
} else {
358
361
nb:: Error :: WouldBlock
@@ -369,9 +372,9 @@ where
369
372
} else if sr. crcerr ( ) . is_no_match ( ) {
370
373
nb:: Error :: Other ( Error :: Crc )
371
374
} else if sr. txe ( ) . is_empty ( ) {
372
- let write_ptr = & self . spi . dr as * const _ as * mut Word ;
373
- // NOTE(unsafe) write to register owned by this Spi struct
374
- unsafe { ptr:: write_volatile ( write_ptr, word) } ;
375
+ let write_ptr = core :: ptr :: addr_of! ( self . spi. dr) as * mut Word ;
376
+ // SAFETY: Write to register owned by this Spi struct
377
+ unsafe { core :: ptr:: write_volatile ( write_ptr, word) } ;
375
378
return Ok ( ( ) ) ;
376
379
} else {
377
380
nb:: Error :: WouldBlock
@@ -384,6 +387,8 @@ where
384
387
SPI : Instance ,
385
388
Miso : MisoPin < SPI > ,
386
389
Mosi : MosiPin < SPI > ,
390
+ Word : PrimInt + Into < u32 > + ' static ,
391
+ u32 : AsPrimitive < Word > ,
387
392
{
388
393
}
389
394
@@ -392,6 +397,8 @@ where
392
397
SPI : Instance ,
393
398
Miso : MisoPin < SPI > ,
394
399
Mosi : MosiPin < SPI > ,
400
+ Word : PrimInt + Into < u32 > + ' static ,
401
+ u32 : AsPrimitive < Word > ,
395
402
{
396
403
}
397
404
0 commit comments