@@ -7,7 +7,7 @@ extern crate stm32g0xx_hal as hal;
7
7
8
8
use core:: fmt:: Write ;
9
9
10
- use hal:: dma:: { self , Channel , Target } ;
10
+ use hal:: dma:: { self , Channel , Event , Target } ;
11
11
use hal:: prelude:: * ;
12
12
use hal:: serial:: * ;
13
13
use hal:: stm32;
@@ -19,6 +19,9 @@ fn main() -> ! {
19
19
let dp = stm32:: Peripherals :: take ( ) . expect ( "cannot take peripherals" ) ;
20
20
let mut rcc = dp. RCC . constrain ( ) ;
21
21
let gpioa = dp. GPIOA . split ( & mut rcc) ;
22
+ let gpiob = dp. GPIOB . split ( & mut rcc) ;
23
+
24
+ let mut led = gpioa. pa5 . into_push_pull_output ( ) ;
22
25
23
26
let mut usart1 = dp
24
27
. USART1
@@ -38,6 +41,7 @@ fn main() -> ! {
38
41
39
42
let mut dma = dp. DMA . split ( & mut rcc, dp. DMAMUX ) ;
40
43
44
+ // Setup DMA for USART1 TX with dma channel 1.
41
45
let usart = unsafe { & ( * stm32:: USART1 :: ptr ( ) ) } ;
42
46
let tx_data_register_addr = & usart. tdr as * const _ as u32 ;
43
47
let tx_dma_buf_addr: u32 = tx_buffer. as_ptr ( ) as u32 ;
@@ -47,12 +51,41 @@ fn main() -> ! {
47
51
dma. ch1 . set_peripheral_address ( tx_data_register_addr, false ) ;
48
52
dma. ch1 . set_transfer_length ( tx_buffer. len ( ) as u16 ) ;
49
53
54
+ // Configure dmamux for dma ch1 and usart tx
50
55
dma. ch1 . select_peripheral ( tx. dmamux ( ) ) ;
51
56
57
+ dma. ch1 . listen ( Event :: TransferComplete ) ;
58
+
52
59
tx. enable_dma ( ) ;
53
60
dma. ch1 . enable ( ) ;
54
61
62
+ // Create a second buffer to send after the first dma transfer has completed
63
+ let mut tx_buffer2: [ u8 ; 23 ] = * b"Transfer complete {0}!\n " ;
64
+ let tx_dma_buf_addr: u32 = tx_buffer2. as_ptr ( ) as u32 ;
65
+
66
+ let mut delay = dp. TIM1 . delay ( & mut rcc) ;
67
+
55
68
loop {
56
- continue ;
69
+ if dma. ch1 . event_occurred ( Event :: TransferComplete ) {
70
+ dma. ch1 . clear_event ( Event :: TransferComplete ) ;
71
+
72
+ // update the char between '{ }' in tx_buffer2
73
+ tx_buffer2[ 19 ] += 1 ;
74
+
75
+ // wrap around to ascii value 33 == '!', so that we only use printable characters.
76
+ if tx_buffer2[ 19 ] > 126 {
77
+ tx_buffer2[ 19 ] = 33 ;
78
+ }
79
+
80
+ dma. ch1 . disable ( ) ;
81
+
82
+ led. toggle ( ) . unwrap ( ) ;
83
+
84
+ dma. ch1 . set_memory_address ( tx_dma_buf_addr, true ) ;
85
+ dma. ch1 . set_transfer_length ( tx_buffer2. len ( ) as u16 ) ;
86
+ dma. ch1 . enable ( ) ;
87
+ }
88
+
89
+ delay. delay ( 500 . ms ( ) ) ;
57
90
}
58
91
}
0 commit comments