33
44mod utilities;
55
6+ use embedded_dma:: { ReadBuffer , WriteBuffer } ;
67use rtic:: app;
78use stm32h5xx_hal:: {
8- gpdma:: { periph:: DmaDuplex , DmaChannel0 , DmaChannel1 } ,
9+ gpdma:: { periph:: DmaDuplex , DmaChannel0 , DmaChannel1 , Word } ,
910 gpio:: { Output , PA5 } ,
1011 pac,
1112 prelude:: * ,
@@ -15,11 +16,51 @@ use stm32h5xx_hal::{
1516use rtic_monotonics:: systick:: prelude:: * ;
1617systick_monotonic ! ( Mono , 1000 ) ;
1718
19+ // Buffer is used to manage a reference to a static buffer returned by the cortex_m::singleton!
20+ // macro and which can be with the DmaTransfer API (which requires passing ReadBuffer and
21+ // WriteBuffer implementations by value) and then used to access the buffer after the transfer has
22+ // completed.
23+ struct Buffer < T : Word + ' static , const N : usize > {
24+ data : & ' static mut [ T ; N ] ,
25+ }
26+
27+ impl < T , const N : usize > Buffer < T , N >
28+ where
29+ T : Word + ' static ,
30+ {
31+ fn new ( data : & ' static mut [ T ; N ] ) -> Self {
32+ Self { data }
33+ }
34+ }
35+
36+ unsafe impl < T , const N : usize > ReadBuffer for & mut Buffer < T , N >
37+ where
38+ T : Word + ' static ,
39+ {
40+ type Word = T ;
41+
42+ unsafe fn read_buffer ( & self ) -> ( * const Self :: Word , usize ) {
43+ ( self . data . as_ptr ( ) , N )
44+ }
45+ }
46+
47+ unsafe impl < T , const N : usize > WriteBuffer for & mut Buffer < T , N >
48+ where
49+ T : Word + ' static ,
50+ {
51+ type Word = T ;
52+
53+ unsafe fn write_buffer ( & mut self ) -> ( * mut Self :: Word , usize ) {
54+ ( self . data . as_mut_ptr ( ) , N )
55+ }
56+ }
57+
1858#[ app( device = pac, dispatchers = [ USART1 , USART2 ] , peripherals = true ) ]
1959mod app {
2060
61+ use core:: cell:: Cell ;
62+
2163 use cortex_m:: singleton;
22- use embedded_dma:: { ReadBuffer , WriteBuffer } ;
2364 use stm32h5:: stm32h503:: { GPDMA1 , NVIC } ;
2465
2566 use super :: * ;
@@ -34,8 +75,8 @@ mod app {
3475 pac:: SPI2 ,
3576 DmaDuplex < pac:: SPI2 , u8 , DmaChannel0 < GPDMA1 > , DmaChannel1 < GPDMA1 > > ,
3677 > ,
37- source : & ' static mut [ u8 ; 40 ] ,
38- dest : & ' static mut [ u8 ; 40 ] ,
78+ source : Cell < Buffer < u8 , 40 > > ,
79+ dest : Cell < Buffer < u8 , 40 > > ,
3980 }
4081
4182 #[ init]
@@ -86,15 +127,18 @@ mod app {
86127 NVIC :: unmask ( pac:: interrupt:: GPDMA1_CH1 ) ;
87128 } ;
88129
130+ let src = singleton ! ( : [ u8 ; 40 ] = [ 0 ; 40 ] ) . unwrap ( ) ;
131+ let dest = singleton ! ( : [ u8 ; 40 ] = [ 0 ; 40 ] ) . unwrap ( ) ;
132+
89133 tick:: spawn ( ) . unwrap ( ) ;
90134 spi_transfer:: spawn ( ) . unwrap ( ) ;
91135 (
92136 Shared { } ,
93137 Local {
94138 led,
95139 spi,
96- source : singleton ! ( : [ u8 ; 40 ] = [ 0 ; 40 ] ) . unwrap ( ) ,
97- dest : singleton ! ( : [ u8 ; 40 ] = [ 0 ; 40 ] ) . unwrap ( ) ,
140+ source : Cell :: new ( Buffer :: new ( src ) ) ,
141+ dest : Cell :: new ( Buffer :: new ( dest ) ) ,
98142 } ,
99143 )
100144 }
@@ -113,19 +157,19 @@ mod app {
113157 async fn spi_transfer ( ctx : spi_transfer:: Context ) {
114158 loop {
115159 log:: info!( "Starting SPI transfer" ) ;
116- ctx. local . source . fill ( * ctx. local . count as u8 ) ;
117- ctx. local . dest . fill ( 0 ) ;
118160
119- let ( src_ptr, src_len) = unsafe { ctx. local . source . read_buffer ( ) } ;
120- let src = unsafe { core:: slice:: from_raw_parts ( src_ptr, src_len) } ;
121- let ( dest_ptr, dest_len) = unsafe { ctx. local . dest . write_buffer ( ) } ;
122- let dest =
123- unsafe { core:: slice:: from_raw_parts_mut ( dest_ptr, dest_len) } ;
161+ let src = ctx. local . source . get_mut ( ) ;
162+ let dest = ctx. local . dest . get_mut ( ) ;
163+ src. data . fill ( * ctx. local . count as u8 ) ;
164+ dest. data . fill ( 0 ) ;
124165
125166 * ctx. local . count += 1 ;
126167 ctx. local . spi . transfer_dma ( src, dest) . await . unwrap ( ) ;
127168
128- assert_eq ! ( * ctx. local. source, * ctx. local. dest) ;
169+ assert_eq ! (
170+ * ctx. local. source. get_mut( ) . data,
171+ * ctx. local. dest. get_mut( ) . data
172+ ) ;
129173 log:: info!( "Success!" ) ;
130174 Mono :: delay ( 1000 . millis ( ) ) . await ;
131175 }
0 commit comments