Skip to content

Commit 23acb3a

Browse files
authored
Merge pull request #59 from ijager/dma-repeat
Make uart-dma example do repeated transfers
2 parents a191534 + 289b53a commit 23acb3a

File tree

1 file changed

+35
-2
lines changed

1 file changed

+35
-2
lines changed

examples/uart-dma.rs

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ extern crate stm32g0xx_hal as hal;
77

88
use core::fmt::Write;
99

10-
use hal::dma::{self, Channel, Target};
10+
use hal::dma::{self, Channel, Event, Target};
1111
use hal::prelude::*;
1212
use hal::serial::*;
1313
use hal::stm32;
@@ -19,6 +19,9 @@ fn main() -> ! {
1919
let dp = stm32::Peripherals::take().expect("cannot take peripherals");
2020
let mut rcc = dp.RCC.constrain();
2121
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();
2225

2326
let mut usart1 = dp
2427
.USART1
@@ -38,6 +41,7 @@ fn main() -> ! {
3841

3942
let mut dma = dp.DMA.split(&mut rcc, dp.DMAMUX);
4043

44+
// Setup DMA for USART1 TX with dma channel 1.
4145
let usart = unsafe { &(*stm32::USART1::ptr()) };
4246
let tx_data_register_addr = &usart.tdr as *const _ as u32;
4347
let tx_dma_buf_addr: u32 = tx_buffer.as_ptr() as u32;
@@ -47,12 +51,41 @@ fn main() -> ! {
4751
dma.ch1.set_peripheral_address(tx_data_register_addr, false);
4852
dma.ch1.set_transfer_length(tx_buffer.len() as u16);
4953

54+
// Configure dmamux for dma ch1 and usart tx
5055
dma.ch1.select_peripheral(tx.dmamux());
5156

57+
dma.ch1.listen(Event::TransferComplete);
58+
5259
tx.enable_dma();
5360
dma.ch1.enable();
5461

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+
5568
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());
5790
}
5891
}

0 commit comments

Comments
 (0)