Skip to content

Commit d0f38e4

Browse files
authored
Merge pull request #666 from YruamaLairba/StreamX_improve
Stream x improve
2 parents e2a1c22 + 97f768e commit d0f38e4

File tree

7 files changed

+595
-319
lines changed

7 files changed

+595
-319
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
77

88
## [Unreleased]
99

10+
- complete and rework Dma Stream API [#666]
11+
12+
[#666]: https://github.com/stm32-rs/stm32f4xx-hal/pull/666
13+
1014
## [v0.17.1] - 2023-07-24
1115

1216
### Changed

examples/rtic-serial-dma-rx-idle.rs

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,7 @@
1414
mod app {
1515

1616
use hal::{
17-
dma::{
18-
config::DmaConfig, traits::Stream, traits::StreamISR, PeripheralToMemory, Stream2,
19-
StreamsTuple, Transfer,
20-
},
17+
dma::{config::DmaConfig, PeripheralToMemory, Stream2, StreamsTuple, Transfer},
2118
pac::{DMA2, USART1},
2219
prelude::*,
2320
rcc::RccExt,
@@ -120,7 +117,7 @@ mod app {
120117

121118
if transfer.is_idle() {
122119
// Calc received bytes count
123-
let bytes_count = BUFFER_SIZE - Stream2::<DMA2>::get_number_of_transfers() as usize;
120+
let bytes_count = BUFFER_SIZE - transfer.number_of_transfers() as usize;
124121

125122
// Allocate new buffer
126123
let new_buffer = cx.local.rx_buffer.take().unwrap();
@@ -143,11 +140,11 @@ mod app {
143140
fn dma2_stream2(mut cx: dma2_stream2::Context) {
144141
let transfer = &mut cx.shared.rx_transfer;
145142

146-
if Stream2::<DMA2>::get_fifo_error_flag() {
147-
transfer.clear_fifo_error_interrupt();
143+
if transfer.is_fifo_error() {
144+
transfer.clear_fifo_error();
148145
}
149-
if Stream2::<DMA2>::get_transfer_complete_flag() {
150-
transfer.clear_transfer_complete_interrupt();
146+
if transfer.is_transfer_complete() {
147+
transfer.clear_transfer_complete();
151148

152149
// Buffer is full, but no IDLE received!
153150
// You can process this data or discard data (ignore transfer complete interrupt and wait IDLE).

examples/rtic-spi-slave-dma.rs

Lines changed: 32 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ mod app {
99
use embedded_hal::spi::{Mode, Phase, Polarity};
1010
use hal::{
1111
dma::{
12-
config::DmaConfig, traits::StreamISR, MemoryToPeripheral, PeripheralToMemory, Stream0,
13-
Stream5, StreamsTuple, Transfer,
12+
config::DmaConfig, MemoryToPeripheral, PeripheralToMemory, Stream0, Stream5,
13+
StreamsTuple, Transfer,
1414
},
1515
gpio::{gpioc::PC13, GpioExt, Output, PushPull},
1616
pac::{DMA1, SPI3},
@@ -138,50 +138,40 @@ mod app {
138138
// The led lights up if the first byte we receive is a 1, it turns off otherwise
139139
#[task(binds = DMA1_STREAM0, shared = [rx_transfer, led], local = [rx_buffer])]
140140
fn on_receiving(cx: on_receiving::Context) {
141-
let on_receiving::Context { mut shared, local } = cx;
142-
if Stream0::<DMA1>::get_fifo_error_flag() {
143-
shared
144-
.rx_transfer
145-
.lock(|spi_dma| spi_dma.clear_fifo_error_interrupt());
146-
}
147-
if Stream0::<DMA1>::get_transfer_complete_flag() {
148-
shared
149-
.rx_transfer
150-
.lock(|spi_dma| spi_dma.clear_transfer_complete_interrupt());
151-
let filled_buffer = shared.rx_transfer.lock(|spi_dma| {
152-
let (result, _) = spi_dma
153-
.next_transfer(local.rx_buffer.take().unwrap())
154-
.unwrap();
155-
result
156-
});
157-
match filled_buffer[0] {
158-
1 => shared.led.lock(|led| led.set_low()),
159-
_ => shared.led.lock(|led| led.set_high()),
141+
let mut rx_transfer = cx.shared.rx_transfer;
142+
let mut led = cx.shared.led;
143+
let rx_buffer = cx.local.rx_buffer;
144+
rx_transfer.lock(|transfer| {
145+
if transfer.is_fifo_error() {
146+
transfer.clear_fifo_error();
160147
}
161-
*local.rx_buffer = Some(filled_buffer);
162-
}
148+
if transfer.is_transfer_complete() {
149+
transfer.clear_transfer_complete();
150+
151+
let (filled_buffer, _) = transfer.next_transfer(rx_buffer.take().unwrap()).unwrap();
152+
match filled_buffer[0] {
153+
1 => led.lock(|led| led.set_low()),
154+
_ => led.lock(|led| led.set_high()),
155+
}
156+
*rx_buffer = Some(filled_buffer);
157+
}
158+
});
163159
}
164160

165161
// We either send [1,2,3] or [4,5,6] depending on which buffer was loaded
166-
#[task(binds = DMA1_STREAM5, shared = [tx_transfer, led], local = [tx_buffer])]
162+
#[task(binds = DMA1_STREAM5, shared = [tx_transfer], local = [tx_buffer])]
167163
fn on_sending(cx: on_sending::Context) {
168-
let on_sending::Context { mut shared, local } = cx;
169-
if Stream5::<DMA1>::get_fifo_error_flag() {
170-
shared
171-
.tx_transfer
172-
.lock(|spi_dma| spi_dma.clear_fifo_error_interrupt());
173-
}
174-
if Stream5::<DMA1>::get_transfer_complete_flag() {
175-
shared
176-
.tx_transfer
177-
.lock(|spi_dma| spi_dma.clear_transfer_complete_interrupt());
178-
let filled_buffer = shared.tx_transfer.lock(|spi_dma| {
179-
let (result, _) = spi_dma
180-
.next_transfer(local.tx_buffer.take().unwrap())
181-
.unwrap();
182-
result
183-
});
184-
*local.tx_buffer = Some(filled_buffer);
185-
}
164+
let mut tx_transfer = cx.shared.tx_transfer;
165+
let tx_buffer = cx.local.tx_buffer;
166+
tx_transfer.lock(|transfer| {
167+
if transfer.is_fifo_error() {
168+
transfer.clear_fifo_error();
169+
}
170+
if transfer.is_transfer_complete() {
171+
transfer.clear_transfer_complete();
172+
let (filled_buffer, _) = transfer.next_transfer(tx_buffer.take().unwrap()).unwrap();
173+
*tx_buffer = Some(filled_buffer);
174+
}
175+
});
186176
}
187177
}

examples/spi-dma.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ use cortex_m_rt::entry;
1010
use embedded_hal::spi::{Mode, Phase, Polarity};
1111
use stm32f4xx_hal::pac::interrupt;
1212
use stm32f4xx_hal::{
13-
dma::{config, traits::StreamISR, MemoryToPeripheral, Stream4, StreamsTuple, Transfer},
13+
dma::{config, MemoryToPeripheral, Stream4, StreamsTuple, Transfer},
1414
gpio::Speed,
1515
pac,
1616
prelude::*,
@@ -101,11 +101,11 @@ fn DMA2_STREAM4() {
101101
});
102102

103103
// Its important to clear fifo errors as the transfer is paused until it is cleared
104-
if Stream4::<pac::DMA1>::get_fifo_error_flag() {
105-
transfer.clear_fifo_error_interrupt();
104+
if transfer.is_fifo_error() {
105+
transfer.clear_fifo_error();
106106
}
107-
if Stream4::<pac::DMA1>::get_transfer_complete_flag() {
108-
transfer.clear_transfer_complete_interrupt();
107+
if transfer.is_transfer_complete() {
108+
transfer.clear_transfer_complete();
109109
unsafe {
110110
static mut BUFFER: [u8; ARRAY_SIZE] = [0; ARRAY_SIZE];
111111
for (i, b) in BUFFER.iter_mut().enumerate() {

0 commit comments

Comments
 (0)