diff options
Diffstat (limited to 'examples/src/bin/dma_interleave_transfer.rs')
| -rw-r--r-- | examples/src/bin/dma_interleave_transfer.rs | 38 |
1 files changed, 23 insertions, 15 deletions
diff --git a/examples/src/bin/dma_interleave_transfer.rs b/examples/src/bin/dma_interleave_transfer.rs index 949ea0605..c0ebb0a46 100644 --- a/examples/src/bin/dma_interleave_transfer.rs +++ b/examples/src/bin/dma_interleave_transfer.rs | |||
| @@ -12,10 +12,9 @@ | |||
| 12 | 12 | ||
| 13 | use embassy_executor::Spawner; | 13 | use embassy_executor::Spawner; |
| 14 | use embassy_mcxa::clocks::config::Div8; | 14 | use embassy_mcxa::clocks::config::Div8; |
| 15 | use embassy_mcxa::dma::{DmaChannel, DmaCh0InterruptHandler}; | 15 | use embassy_mcxa::dma::{DmaCh0InterruptHandler, DmaChannel}; |
| 16 | use embassy_mcxa::bind_interrupts; | ||
| 17 | use embassy_mcxa::lpuart::{Blocking, Config, Lpuart, LpuartTx}; | 16 | use embassy_mcxa::lpuart::{Blocking, Config, Lpuart, LpuartTx}; |
| 18 | use embassy_mcxa::pac; | 17 | use embassy_mcxa::{bind_interrupts, pac}; |
| 19 | use {defmt_rtt as _, embassy_mcxa as hal, panic_probe as _}; | 18 | use {defmt_rtt as _, embassy_mcxa as hal, panic_probe as _}; |
| 20 | 19 | ||
| 21 | // Bind DMA channel 0 interrupt using Embassy-style macro | 20 | // Bind DMA channel 0 interrupt using Embassy-style macro |
| @@ -125,22 +124,29 @@ async fn main(_spawner: Spawner) { | |||
| 125 | 124 | ||
| 126 | // Reset channel state | 125 | // Reset channel state |
| 127 | t.ch_csr().write(|w| { | 126 | t.ch_csr().write(|w| { |
| 128 | w.erq().disable() | 127 | w.erq() |
| 129 | .earq().disable() | 128 | .disable() |
| 130 | .eei().no_error() | 129 | .earq() |
| 131 | .ebw().disable() | 130 | .disable() |
| 132 | .done().clear_bit_by_one() | 131 | .eei() |
| 132 | .no_error() | ||
| 133 | .ebw() | ||
| 134 | .disable() | ||
| 135 | .done() | ||
| 136 | .clear_bit_by_one() | ||
| 133 | }); | 137 | }); |
| 134 | t.ch_es().write(|w| w.bits(0)); | 138 | t.ch_es().write(|w| w.bits(0)); |
| 135 | t.ch_int().write(|w| w.int().clear_bit_by_one()); | 139 | t.ch_int().write(|w| w.int().clear_bit_by_one()); |
| 136 | 140 | ||
| 137 | // Source/destination addresses | 141 | // Source/destination addresses |
| 138 | t.tcd_saddr().write(|w| w.saddr().bits(core::ptr::addr_of_mut!(SRC_BUFFER) as u32)); | 142 | t.tcd_saddr() |
| 139 | t.tcd_daddr().write(|w| w.daddr().bits(core::ptr::addr_of_mut!(DEST_BUFFER) as u32)); | 143 | .write(|w| w.saddr().bits(core::ptr::addr_of_mut!(SRC_BUFFER) as u32)); |
| 144 | t.tcd_daddr() | ||
| 145 | .write(|w| w.daddr().bits(core::ptr::addr_of_mut!(DEST_BUFFER) as u32)); | ||
| 140 | 146 | ||
| 141 | // Custom offsets for interleaving | 147 | // Custom offsets for interleaving |
| 142 | t.tcd_soff().write(|w| w.soff().bits(4)); // src: +4 bytes per read | 148 | t.tcd_soff().write(|w| w.soff().bits(4)); // src: +4 bytes per read |
| 143 | t.tcd_doff().write(|w| w.doff().bits(8)); // dst: +8 bytes per write | 149 | t.tcd_doff().write(|w| w.doff().bits(8)); // dst: +8 bytes per write |
| 144 | 150 | ||
| 145 | // Attributes: 32-bit transfers (size = 2) | 151 | // Attributes: 32-bit transfers (size = 2) |
| 146 | t.tcd_attr().write(|w| w.ssize().bits(2).dsize().bits(2)); | 152 | t.tcd_attr().write(|w| w.ssize().bits(2).dsize().bits(2)); |
| @@ -153,7 +159,8 @@ async fn main(_spawner: Spawner) { | |||
| 153 | t.tcd_slast_sda().write(|w| w.slast_sda().bits(-(nbytes as i32) as u32)); | 159 | t.tcd_slast_sda().write(|w| w.slast_sda().bits(-(nbytes as i32) as u32)); |
| 154 | // Destination uses 2x offset, so adjust accordingly | 160 | // Destination uses 2x offset, so adjust accordingly |
| 155 | let dst_total = (HALF_BUFF_LENGTH * 8) as u32; | 161 | let dst_total = (HALF_BUFF_LENGTH * 8) as u32; |
| 156 | t.tcd_dlast_sga().write(|w| w.dlast_sga().bits(-(dst_total as i32) as u32)); | 162 | t.tcd_dlast_sga() |
| 163 | .write(|w| w.dlast_sga().bits(-(dst_total as i32) as u32)); | ||
| 157 | 164 | ||
| 158 | // Major loop count = 1 | 165 | // Major loop count = 1 |
| 159 | t.tcd_biter_elinkno().write(|w| w.biter().bits(1)); | 166 | t.tcd_biter_elinkno().write(|w| w.biter().bits(1)); |
| @@ -172,7 +179,9 @@ async fn main(_spawner: Spawner) { | |||
| 172 | while !dma_ch0.is_done() { | 179 | while !dma_ch0.is_done() { |
| 173 | cortex_m::asm::nop(); | 180 | cortex_m::asm::nop(); |
| 174 | } | 181 | } |
| 175 | unsafe { dma_ch0.clear_done(); } | 182 | unsafe { |
| 183 | dma_ch0.clear_done(); | ||
| 184 | } | ||
| 176 | 185 | ||
| 177 | tx.blocking_write(b"\r\nEDMA interleave transfer example finish.\r\n\r\n") | 186 | tx.blocking_write(b"\r\nEDMA interleave transfer example finish.\r\n\r\n") |
| 178 | .unwrap(); | 187 | .unwrap(); |
| @@ -206,4 +215,3 @@ async fn main(_spawner: Spawner) { | |||
| 206 | cortex_m::asm::wfe(); | 215 | cortex_m::asm::wfe(); |
| 207 | } | 216 | } |
| 208 | } | 217 | } |
| 209 | |||
