Skip to content

Commit 97f768e

Browse files
committed
squash commit
add stream methods to set pincos, circ and pfctrl make Stream use dmaDirection instead generic direction make streams use a new DmaChannel enum instead generic stuff conditionnel compilation for DmaChannel enum Redesign ISR API of Stream, this break transfer redesign Stream trait API, break even more stuff implement Stream trait, many thing still broken fix most compile error in Transfer struct handle DmaDataSize relatd stuff stream_disable utility function use utility function for gracefully disable the transfer add/fix interrupt flag manipulation throught transfer type fix Bits impl for PeeripeheralIncrmentOffset fix bit impl of DmaFlowcontreoller fix missing unsafe section fix i2c dma to handle transfer API change. use Dmaflag for more expressive API dma common interrupts setter & getter fix spi-dma example fix rtic-spi-slave-dma.rs example fix bad link in the doc add number_of_transfer method on Transfer fix an example dma API, rename clear_smth_flag to clear_smth dma stream rename smth_flag -> is_smth dma stream rename set_smth_interrupt to listen/unlisten_smth, temporaly break transfer dma stream: listen/unlisten using mask, fix previous break fix, using bitflags for masking require to "truncate" some optimisation oops forgot to remove a TODO mark remove bitflags and mask stuff, use struct with bool field instead update CHANGELOG.md
1 parent e2a1c22 commit 97f768e

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)